{ "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\"\n" } ], "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": "\n
A popular approach to writing clean code is to avoid the \"else\" keyword and, if possible, avoid nesting Instead, you check for a condition; if that isn't met, you return early.\nFor\u00a0example, here is some code I saw recently during a meetup talk:<\/p>\n\n There are no 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>\n\n If the target class is one where the code shouldn't be called from, it returns immediately with the\u00a0violation.<\/p>\n\n Finally, if no violations were found within the referenced classes, it returns an empty array.<\/p>\n\n The code always returns an array of rule violations but does so as soon as possible at each point.<\/p>\n\n 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>\n\n Whilst there are some situations to use A popular approach to writing clean code is to avoid the \"else\" keyword and, if possible, avoid nesting Instead, you check for a condition; if that isn't met, you return early.\nFor example, here is some code I saw recently during a meetup talk:<\/p>\n\n There are no 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>\n\n If the target class is one where the code shouldn't be called from, it returns immediately with the violation.<\/p>\n\n Finally, if no violations were found within the referenced classes, it returns an empty array.<\/p>\n\n The code always returns an array of rule violations but does so as soon as possible at each point.<\/p>\n\n 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>\n\n Whilst there are some situations to use if<\/code> statements within other
if<\/code> statements.\nIf I look at some code, I want to see as few indentation levels as possible, making the code easier to read and understand.<\/p>\n\n
What should I do instead?<\/h2>\n\n
$callingClass = $scope->getClassReflection()->getName();\n\nif ($callingClass === TextMessageQueueProcessor::class) {\n\u00a0 \u00a0 return [];\n}\n\n$type = $scope->getType($node->var);\n\nforeach ($type->getReferencedClasses() as $targetClass) {\n\u00a0 \u00a0 if ($targetClass === TextMessageSender::class) {\n\u00a0 \u00a0 \u00a0 \u00a0 return [\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 RuleErrorBuilder::message(\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 sprintf(\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \"Can not call %s from %s\",\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $targetClass,\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $callingClass\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 )\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 )->build()\n\u00a0 \u00a0 \u00a0 \u00a0 ];\n\u00a0 \u00a0 }\n}\n\nreturn [];\n<\/code><\/pre>\n\n
else<\/code> statements.<\/p>\n\n
Here's the thing<\/h2>\n\n
else<\/code>, most of the time I've found that I can use an early return instead.<\/p>\n\n ",
"format": "full_html",
"processed": "\n
if<\/code> statements within other
if<\/code> statements.\nIf I look at some code, I want to see as few indentation levels as possible, making the code easier to read and understand.<\/p>\n\n
What should I do instead?<\/h2>\n\n
$callingClass = $scope->getClassReflection()->getName();\n\nif ($callingClass === TextMessageQueueProcessor::class) {\n return [];\n}\n\n$type = $scope->getType($node->var);\n\nforeach ($type->getReferencedClasses() as $targetClass) {\n if ($targetClass === TextMessageSender::class) {\n return [\n RuleErrorBuilder::message(\n sprintf(\n \"Can not call %s from %s\",\n $targetClass,\n $callingClass\n )\n )->build()\n ];\n }\n}\n\nreturn [];\n<\/code><\/pre>\n\n
else<\/code> statements.<\/p>\n\n
Here's the thing<\/h2>\n\n
else<\/code>, most of the time I've found that I can use an early return instead.<\/p>\n\n ",
"summary": null
}
]
}