<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://mohabdelaziz95.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mohabdelaziz95.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-09-23T20:07:55+03:00</updated><id>https://mohabdelaziz95.github.io/feed.xml</id><title type="html">Mohamed AbdElaziz</title><subtitle>Software, life, and the things I get wrong...</subtitle><author><name>Mohamed AbdElaziz</name></author><entry><title type="html">Value Objects - Your Savior from Primitive Obsession</title><link href="https://mohabdelaziz95.github.io/blog/2021/value-objects" rel="alternate" type="text/html" title="Value Objects - Your Savior from Primitive Obsession" /><published>2021-02-12T00:00:00+02:00</published><updated>2021-02-12T00:00:00+02:00</updated><id>https://mohabdelaziz95.github.io/blog/2021/value-objects</id><content type="html" xml:base="https://mohabdelaziz95.github.io/blog/2021/value-objects"><![CDATA[<p>I believe that the best way to explain a problem is to introduce the problem itself first. I know that sounds unquestionable, but people always forget that. They jump to the solution without figuring out what the actual problem is — we all do that.</p>

<h2 id="what-is-the-problem">What is the problem?</h2>

<p>Here we have an example; imagine you are building an eCommerce platform which allows users to sell anything and you are offering them a shipping option, and to determine if this item is deliverable or not you have this <code class="language-plaintext highlighter-rouge">ShippingRequest</code> class.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">ShippingRequest</span> <span class="p">{</span>

   <span class="cd">/**
    * @param mixed $isDeliverable
    *      - false: no need for shipping service
    *      - true:  ship my product
    *      - null:  if to be decided
    */</span>
   <span class="k">public</span> <span class="k">function</span> <span class="n">checkAvailabilityForDelivery</span><span class="p">(</span><span class="nv">$isDeliverable</span><span class="p">)</span>
   <span class="p">{</span>
        <span class="c1">//...</span>
   <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And since the shipping service is optional, we are allowing our sellers — if they want to ship their product just select the delivery flag. If not, select the not-deliverable flag, or just leave it empty if you didn’t decide yet. And on your side (backend) based on this value you have this <code class="language-plaintext highlighter-rouge">checkAvailabilityForDelivery</code> which accepts an <code class="language-plaintext highlighter-rouge">$isDeliverable</code> argument, and based on this argument value you need to take a decision, and this value might be true, false, null.</p>

<p>And this will be your lucky day if you even got the <code class="language-plaintext highlighter-rouge">TRUE</code>, <code class="language-plaintext highlighter-rouge">FALSE</code> as bool types — but you forgot that you are sending this value over an HTTP request, where basically everything is a STRING, so the TRUE will be <code class="language-plaintext highlighter-rouge">"TRUE"</code> and FALSE will be <code class="language-plaintext highlighter-rouge">"FALSE"</code>. And if you are working with a language like PHP this will not be your last problem. Yes, <code class="language-plaintext highlighter-rouge">"false"</code> is considered as true in PHP, as PHP translates that to a non-empty string value, so it’s simply TRUE.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">var_dump</span><span class="p">((</span><span class="n">bool</span><span class="p">)</span> <span class="s2">"false"</span><span class="p">);</span>     <span class="c1">// true</span>
<span class="nb">var_dump</span><span class="p">(</span><span class="s2">"false"</span> <span class="o">==</span> <span class="kc">false</span><span class="p">);</span>   <span class="c1">// false</span>
</code></pre></div></div>

<p>Now I hear the voice in your head saying what the hell is this?</p>

<p><img src="/assets/images/posts/wtf.webp" alt="Jackie Chan looking confused" width="820" height="488" loading="lazy" decoding="async" /></p>

<p>You may say now, if the problem is that I am accepting a <code class="language-plaintext highlighter-rouge">mixed</code> type then simply I’ll not use it. I’ll just accept only one type.</p>

<p>Let’s check this other example: you are sending a welcome email to the newly registered users of your eCommerce app using this <code class="language-plaintext highlighter-rouge">WelcomeEmail</code> class, through the <code class="language-plaintext highlighter-rouge">sendEmail</code> method.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">WelcomeEmail</span> <span class="p">{</span>

    <span class="cd">/**
    * @param string $emailAddress
    * @param string $subject
    * @param string $body
    */</span>
   <span class="k">public</span> <span class="k">function</span> <span class="n">sendEmail</span><span class="p">(</span><span class="kt">string</span> <span class="nv">$emailAddress</span><span class="p">,</span> <span class="kt">string</span> <span class="nv">$subject</span><span class="p">,</span> <span class="kt">string</span> <span class="nv">$body</span><span class="p">)</span>
   <span class="p">{</span>
        <span class="c1">//...</span>
   <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now you are expecting a <code class="language-plaintext highlighter-rouge">string $emailAddress</code>, <code class="language-plaintext highlighter-rouge">string $subject</code>, <code class="language-plaintext highlighter-rouge">string $body</code>. Everything looks good, so let’s use it.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">new</span> <span class="nc">WelcomeEmail</span><span class="p">())</span><span class="o">-&gt;</span><span class="nf">sendEmail</span><span class="p">(</span>
       <span class="s2">"registration success"</span><span class="p">,</span>
       <span class="s2">"glad to have u with us :)"</span><span class="p">,</span>
       <span class="s2">"johndoe"</span>
<span class="p">);</span>
</code></pre></div></div>

<h2 id="you-have-an-issue">You have an Issue!</h2>

<p>The expected behavior: when a new user registers to your platform, that user should receive a welcome email.</p>

<p>But the actual behavior: the user registered, but they didn’t receive any emails.</p>

<p>“If you think that you can rely on a developer’s attention…”</p>

<p><img src="/assets/images/posts/attention.webp" alt="An animation of someone losing their patience" width="498" height="339" loading="lazy" decoding="async" /></p>

<p>So instead of having these meaningless generic arguments with string values, now we have valid meaningful arguments by introducing a new type that has a meaning which goes beyond being only a primitive type string.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">final</span> <span class="kd">class</span> <span class="nc">WelcomeEmail</span> <span class="p">{</span>

    <span class="cd">/**
    * @param EmailAddress $emailAddress
    * @param Subject $subject
    * @param Body $body
    */</span>
   <span class="k">public</span> <span class="k">function</span> <span class="n">sendEmail</span><span class="p">(</span><span class="kt">EmailAddress</span> <span class="nv">$emailAddress</span><span class="p">,</span> <span class="kt">Subject</span> <span class="nv">$subject</span><span class="p">,</span> <span class="kt">Body</span> <span class="nv">$body</span><span class="p">)</span>
   <span class="p">{</span>
        <span class="c1">//...</span>
   <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This also helps you avoid mixing parameters, since the first parameter expects a type of EmailAddress, not just a string. We call those new types <strong>ValueObjects</strong>.</p>

<h2 id="what-is-a-valueobject">What is a ValueObject?</h2>

<blockquote>
  <p>An object that represents a descriptive aspect of the domain with no conceptual identity is called a Value Object. Value Objects are instantiated to represent elements of the design that we care about only for what they are, not who or which they are.</p>

  <p><cite>— Eric Evans</cite></p>
</blockquote>

<h3 id="which-means">Which means?</h3>

<ol>
  <li>A value object is an object that is defined according to its value or its data rather than its identity.</li>
  <li>A value object represents a typed value in your domain.</li>
  <li>Also, this means we are representing things that are related to each other as a compound object or type.</li>
</ol>

<p>For example:</p>

<ul>
  <li>A 2D coordinate consists of an X value and a Y value.</li>
  <li>An amount of money consists of {number + currency}.</li>
  <li>A date range consists of {<code class="language-plaintext highlighter-rouge">start_date</code> + <code class="language-plaintext highlighter-rouge">end_date</code>}.</li>
</ul>

<p>Let’s say that you have a method to calculate the distance between two points, and each point has a pair of (x, y) values, so it might look like this:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">calculateDistance</span><span class="p">(</span><span class="kt">Coordinates</span> <span class="nv">$startPoint</span><span class="p">,</span> <span class="kt">Coordinates</span> <span class="nv">$endPoint</span><span class="p">)</span>
<span class="p">{</span>
     <span class="c1">//...</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Let’s take another example:</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">register</span><span class="p">(</span><span class="nv">$age</span><span class="p">)</span>
<span class="p">{</span>
    <span class="nf">dump</span><span class="p">(</span><span class="s2">"your age is </span><span class="si">{</span><span class="nv">$age</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This is a simple register function responsible for registering new users to your platform. So for simplicity, let’s have it accept only one argument which is <code class="language-plaintext highlighter-rouge">$age</code>, and then you can just call this function and give it the user’s age, which is in our case 10.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">register</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
</code></pre></div></div>

<p>Then you got a new issue reported: that your <code class="language-plaintext highlighter-rouge">register</code> function accepts an age that is zero or less than zero, or greater than 200, which does not make any sense.</p>

<p>So instead of that, let’s introduce a new type in our codebase called <code class="language-plaintext highlighter-rouge">Age</code>, which is always responsible for giving you a valid age whenever needed.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">final</span> <span class="kd">class</span> <span class="nc">Age</span> <span class="p">{</span>

    <span class="k">public</span> <span class="nv">$age</span><span class="p">;</span>

    <span class="k">public</span> <span class="k">function</span> <span class="n">__construct</span><span class="p">(</span><span class="nv">$age</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nv">$age</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">||</span> <span class="nv">$age</span> <span class="o">&gt;</span> <span class="mi">120</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nc">InvalidArgumentException</span><span class="p">(</span><span class="s2">"provided age is invalid"</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">age</span> <span class="o">=</span> <span class="nv">$age</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">function</span> <span class="n">__toString</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">age</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Then let’s modify the register function signature, and instead of defining that this function accepts a meaningless <code class="language-plaintext highlighter-rouge">$age</code> argument, it accepts a valid age value of type <code class="language-plaintext highlighter-rouge">Age</code> — and if the user provided an invalid age value, it will throw an <code class="language-plaintext highlighter-rouge">InvalidArgumentException</code> saying that the provided age value is invalid.</p>

<h2 id="valueobject-characteristics">ValueObject characteristics</h2>

<h3 id="1-no-identity">1. No identity</h3>

<ul>
  <li>ValueObjects are defined by their attributes or data. They are equal if their attributes are equal, and they are completely interchangeable.</li>
  <li>Unlike entities, they don’t have an ID property.</li>
</ul>

<h4 id="so-what-is-an-identity">So what is an identity?</h4>

<ul>
  <li>An object that represents a specific thing would be an entity. E.g. Models → represent Entities.</li>
  <li>ValueObjects are simple objects that represent simple things, but not specific things.</li>
</ul>

<p>E.g. imagine you have 5 banknotes of $10 and you asked someone to take a $10 note — does it really matter which banknote they took? Isn’t the important thing that they took a $10 banknote? But if we said that the police are looking for a missing $10 banknote which has a serial number of 0xxxxxxx0, now this banknote has an identity.</p>

<ul>
  <li>A ValueObject can’t exist without a parent Entity owning them. E.g. saying an address like this (Egypt, Cairo, street number, building number) doesn’t provide a full comprehensive statement. But if we mention that John Doe’s address is (Egypt, Cairo, street_number, building_number), now this makes complete sense.</li>
  <li>ValueObjects should not have separate tables in the DB.</li>
  <li>There always must be a composition relationship between a ValueObject class and an Entity class; without it ValueObjects don’t make any sense.</li>
</ul>

<h3 id="2-immutability">2. Immutability</h3>

<ul>
  <li><strong>Mutable object</strong>: an object whose internal state can be changed.</li>
  <li><strong>Immutable object</strong>: an object whose internal state cannot be changed.</li>
  <li>The only way to change its value is by a full replacement (a new instance with a new value).</li>
  <li><strong>Immutable</strong> → NO SETTERS, NO PUBLIC PROPERTIES; the constructor is the only injection point.</li>
</ul>

<p>E.g. in our previous age example, we defined the <code class="language-plaintext highlighter-rouge">$age</code> property in the <code class="language-plaintext highlighter-rouge">Age</code> class as public. And this means that any user of the Age type can easily change the value — so instead of that, we need to change it to be <code class="language-plaintext highlighter-rouge">private</code> so no one can access or modify the age value.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$age</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Age</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="nv">$age</span><span class="o">-&gt;</span><span class="n">age</span> <span class="o">=</span> <span class="mi">1000</span><span class="p">;</span>
<span class="nf">register</span><span class="p">(</span><span class="nv">$age</span><span class="p">);</span>   <span class="c1">// 1000</span>
</code></pre></div></div>

<h3 id="3-self-validation">3. Self validation</h3>

<ul>
  <li>A ValueObject must verify the validity of its attributes when being created.</li>
  <li>An error or exception should be raised if any of the attributes are invalid.</li>
</ul>

<h2 id="reasons-for-valueobjects-to-exist-in-your-codebase">Reasons for ValueObjects to exist in your codebase</h2>

<h3 id="1-reduce-primitive-obsession">1. Reduce primitive obsession</h3>

<p>Primitive obsession is using primitive data types {int, string, float, etc…} to represent domain ideas.</p>

<p>E.g. we usually store a <strong>URL</strong> as a String, but a <strong>URL</strong> has more information and specific properties compared to a String — and by storing it as a string you can no longer access these <strong>URL</strong>-specific properties (the domain concept) without additional code.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>              Host          Port                       Query Params
        ┌──────┴──────┐ ┌┴┐                    ┌────────────┴───────────┐
https://www.example.com:123/forum/questions/?tag=networking&amp;order=newest
└─┬─┘                      └───────┬───────┘
Protocol                          Path
</code></pre></div></div>

<h3 id="2-type-safety">2. Type safety</h3>

<p>When using primitive types, it is easy to make mistakes and bugs even when we are using valid types but we are passing invalid values.</p>

<p>E.g. <code class="language-plaintext highlighter-rouge">private float $duration;</code></p>

<p>Float here is a valid type, and when you initialize this variable with a float value your compiler/interpreter won’t complain about this, since you’re giving it a valid float value. But what about the type of the <code class="language-plaintext highlighter-rouge">Duration</code> itself, since the <code class="language-plaintext highlighter-rouge">Duration</code> could be (seconds, minutes, hours, etc..)?</p>

<p>You might now scratch your head and say why not just rename the variable — you can just mention it explicitly that you want the duration in seconds, so it might be something like <code class="language-plaintext highlighter-rouge">$durationInSeconds</code>.</p>

<p>What if someone from your business team requested a new change request, as they always do? They want to display the duration in minutes and hours, so now you need to convert the duration to adopt the new changes, which means extra conversion code. So you might ask yourself about your options: where should this conversion code reside?</p>

<ul>
  <li>Put it inline just right before the usage! What if we decided that we need to use Duration in minutes somewhere else? No copy/paste. Don’t Repeat Yourself.</li>
  <li>You might put it in as a helper function in a helpers file where all the evils reside. I think you need to reconsider this decision again.</li>
</ul>

<p>Let’s go one step back and ask ourselves what we really need here. We need to ensure that when we always ask for a valid duration we get a valid duration. When we ask for seconds, we get only seconds. Ask for minutes and we should get only minutes, etc…</p>

<p>We also need to ensure our conversion code is consistent in all places in our codebase. We actually need a ValueObject to represent the Duration type in our domain, which will contain all the validation logic and the conversion logic.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">final</span> <span class="kd">class</span> <span class="nc">Duration</span> <span class="p">{</span>

    <span class="k">private</span> <span class="nv">$seconds</span><span class="p">;</span>

    <span class="k">public</span> <span class="k">function</span> <span class="n">__construct</span><span class="p">(</span><span class="kt">int</span> <span class="nv">$seconds</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">seconds</span> <span class="o">=</span> <span class="nv">$seconds</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">function</span> <span class="n">asMinutes</span><span class="p">():</span> <span class="kt">int</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="p">(</span><span class="n">int</span><span class="p">)</span> <span class="nb">floor</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="n">seconds</span> <span class="o">/</span> <span class="mi">60</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="3-mixing-parameters">3. Mixing parameters</h3>

<p>Imagine if you’re using an IDE that does not support showing parameter name hints, or you are just editing something in VIM — you can easily end up mixing valid parameters of the same type.</p>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="n">sendShippingData</span><span class="p">(</span><span class="kt">string</span> <span class="nv">$courierName</span><span class="p">,</span> <span class="kt">string</span> <span class="nv">$trackingID</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">//...</span>
<span class="p">}</span>

<span class="nf">shippingData</span><span class="p">(</span><span class="s2">"#123456"</span><span class="p">,</span> <span class="s2">"DHL"</span><span class="p">);</span>
</code></pre></div></div>

<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">final</span> <span class="kd">class</span> <span class="nc">ShippingInstrument</span> <span class="p">{</span>

    <span class="k">private</span> <span class="nv">$trackingID</span><span class="p">;</span>

    <span class="k">private</span> <span class="nv">$courierName</span><span class="p">;</span>

    <span class="k">public</span> <span class="k">function</span> <span class="n">__construct</span><span class="p">(</span><span class="kt">string</span> <span class="nv">$courierName</span><span class="p">,</span> <span class="kt">TrackingID</span> <span class="nv">$trackingID</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="nv">$trackingID</span> <span class="o">===</span> <span class="s2">""</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nc">InvalidArgumentException</span><span class="p">(</span><span class="s2">"Invalid shipping data"</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">trackingID</span> <span class="o">=</span> <span class="nv">$trackingID</span><span class="p">;</span>
        <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">courierName</span> <span class="o">=</span> <span class="nv">$courierName</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">function</span> <span class="n">getCourier</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="nc">CourierStorage</span><span class="o">::</span><span class="nf">where</span><span class="p">(</span><span class="s1">'name'</span><span class="p">,</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">courierName</span><span class="p">)</span><span class="o">-&gt;</span><span class="nf">first</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You get the idea now.</p>

<h3 id="4-avoid-revalidating">4. Avoid revalidating</h3>

<p>With value objects you will stop revalidating data everywhere. You just validate it once, and after that you should be able to use it anywhere with confidence and a guarantee that it is valid. This is because the only way for a value object to exist is to be valid; once it exists you cannot change it. Immutable, do you remember?</p>

<h3 id="5-easy-to-read">5. Easy to read</h3>

<p>Using value objects you don’t have to guess what variables truly are. You no longer have to worry about internal representation, but think about domain concepts instead — and the code now looks a lot more expressive.</p>

<h3 id="6-ensure-consistency">6. Ensure consistency</h3>

<p>Check the duration example above.</p>

<h2 id="drawbacks">Drawbacks</h2>

<ul>
  <li>Wrapping every single primitive type you have with a ValueObject leads to creating too many classes, and this will bloat the codebase, leading to a ridiculous codebase that you don’t want to work with. So choose wisely what might be a good ValueObject candidate.</li>
  <li>Performance issues: in some cases creating too many instances might lead to a performance drop.</li>
</ul>

<h2 id="load-your-brain-with-valueobjects">Load your brain with ValueObjects</h2>

<p>At the beginning it might be hard to recognize ValueObject candidates, but with the passage of time it becomes easier. Moreover, I found some useful tricks that you might follow:</p>

<ul>
  <li>You have a special validation logic that has to be applied in multiple places. E.g. phone numbers, email addresses, etc…</li>
  <li>You have a special formatting logic that is used to render values for humans. E.g. Price = Amount + Currency.</li>
  <li>In general, if you find yourself in a situation where you are constantly passing variables together, then this might be a good candidate for a ValueObject.</li>
</ul>

<h2 id="references">References</h2>

<ul>
  <li><a href="https://martinfowler.com/bliki/ValueObject.html">ValueObject — Martin Fowler</a></li>
  <li><a href="https://enterprisecraftsmanship.com/posts/value-objects-explained/">Value Objects explained</a></li>
  <li><a href="https://laracasts.com/series/object-oriented-principles-in-php/episodes/8">Value Objects and Mutability — Laracasts</a></li>
  <li><a href="https://medium.com/swlh/value-objects-to-the-rescue-28c563ad97c6">Value Objects to the rescue!</a></li>
</ul>]]></content><author><name>Mohamed AbdElaziz</name></author><summary type="html"><![CDATA[Save your codebase from naive primitive types — no more (int, string, etc..) but meaningful types.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://mohabdelaziz95.github.io/assets/images/posts/4334233.jpg" /><media:content medium="image" url="https://mohabdelaziz95.github.io/assets/images/posts/4334233.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>