oliverdavies.uk/content/node.94d78d4d-fcd1-4d1a-a0fc-e6f8c39d084b.yml

143 lines
5.7 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

uuid:
- value: 94d78d4d-fcd1-4d1a-a0fc-e6f8c39d084b
langcode:
- value: en
type:
- target_id: daily_email
target_type: node_type
target_uuid: 8bde1f2f-eef9-4f2d-ae9c-96921f8193d7
revision_timestamp:
- value: '2025-05-11T09:00:32+00:00'
revision_uid:
- target_type: user
target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849
revision_log: { }
status:
- value: true
uid:
- target_type: user
target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849
title:
- value: |
Don't use "else"
created:
- value: '2023-09-11T00:00:00+00:00'
changed:
- value: '2025-05-11T09:00:32+00:00'
promote:
- value: false
sticky:
- value: false
default_langcode:
- value: true
revision_translation_affected:
- value: true
path:
- alias: /daily/2023/09/11/dont-use-else
langcode: en
body:
- value: |
<p>A popular approach to writing clean code is to avoid the "else" keyword and, if possible, avoid nesting <code>if</code> statements within other <code>if</code> statements.
If I look at some code, I want to see as few indentation levels as possible, making the code easier to read and understand.</p>
<h2 id="what-should-i-do-instead%3F">What should I do instead?</h2>
<p>Instead, you check for a condition; if that isn't met, you return early.
For example, here is some code I saw recently during a meetup talk:</p>
<pre><code class="language-php">$callingClass = $scope-&gt;getClassReflection()-&gt;getName();
if ($callingClass === TextMessageQueueProcessor::class) {
    return [];
}
$type = $scope-&gt;getType($node-&gt;var);
foreach ($type-&gt;getReferencedClasses() as $targetClass) {
    if ($targetClass === TextMessageSender::class) {
        return [
            RuleErrorBuilder::message(
                sprintf(
                    "Can not call %s from %s",
                    $targetClass,
                    $callingClass
                )
            )-&gt;build()
        ];
    }
}
return [];
</code></pre>
<p>There are no <code>else</code> statements.</p>
<p>If the calling class isn't of the required type, it returns immediately with no violations, and we continue, knowing the calling class must be what we need.</p>
<p>If the target class is one where the code shouldn't be called from, it returns immediately with the violation.</p>
<p>Finally, if no violations were found within the referenced classes, it returns an empty array.</p>
<h2 id="here%27s-the-thing">Here's the thing</h2>
<p>The code always returns an array of rule violations but does so as soon as possible at each point.</p>
<p>The code is clean and readable, and I can understand it, knowing once each condition is passed, I don't need to continue thinking about it.</p>
<p>Whilst there are some situations to use <code>else</code>, most of the time I've found that I can use an early return instead.</p>
format: full_html
processed: |
<p>A popular approach to writing clean code is to avoid the "else" keyword and, if possible, avoid nesting <code>if</code> statements within other <code>if</code> statements.
If I look at some code, I want to see as few indentation levels as possible, making the code easier to read and understand.</p>
<h2 id="what-should-i-do-instead%3F">What should I do instead?</h2>
<p>Instead, you check for a condition; if that isn't met, you return early.
For&nbsp;example, here is some code I saw recently during a meetup talk:</p>
<pre><code class="language-php">$callingClass = $scope-&gt;getClassReflection()-&gt;getName();
if ($callingClass === TextMessageQueueProcessor::class) {
&nbsp; &nbsp; return [];
}
$type = $scope-&gt;getType($node-&gt;var);
foreach ($type-&gt;getReferencedClasses() as $targetClass) {
&nbsp; &nbsp; if ($targetClass === TextMessageSender::class) {
&nbsp; &nbsp; &nbsp; &nbsp; return [
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RuleErrorBuilder::message(
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sprintf(
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Can not call %s from %s",
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $targetClass,
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $callingClass
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )-&gt;build()
&nbsp; &nbsp; &nbsp; &nbsp; ];
&nbsp; &nbsp; }
}
return [];
</code></pre>
<p>There are no <code>else</code> statements.</p>
<p>If the calling class isn't of the required type, it returns immediately with no violations, and we continue, knowing the calling class must be what we need.</p>
<p>If the target class is one where the code shouldn't be called from, it returns immediately with the&nbsp;violation.</p>
<p>Finally, if no violations were found within the referenced classes, it returns an empty array.</p>
<h2 id="here%27s-the-thing">Here's the thing</h2>
<p>The code always returns an array of rule violations but does so as soon as possible at each point.</p>
<p>The code is clean and readable, and I can understand it, knowing once each condition is passed, I don't need to continue thinking about it.</p>
<p>Whilst there are some situations to use <code>else</code>, most of the time I've found that I can use an early return instead.</p>
summary: null
field_daily_email_cta: { }