TL;DR: Don't fire!
Say it only once
-
Bad Responsibilities Assignments
-
Code Duplication
-
Maintainability
-
Single Responsibility Violation.
-
Copy-pasted code.
- Refactor
<?
final class SocialNetwork {
function postStatus(string $newStatus) {
if (!$user->isLogged()) {
throw new Exception('User is not logged');
}
// ...
}
function uploadProfilePicture(Picture $newPicture) {
if (!$user->isLogged()) {
throw new Exception('User is not logged');
}
// ...
}
function sendMessage(User $recipient, Message $messageSend) {
if (!$user->isLogged()) {
throw new Exception('User is not logged');
}
// ...
}
}
<?
final class SocialNetwork {
function postStatus(string $newStatus) {
$this->assertUserIsLogged();
// ...
}
function uploadProfilePicture(Picture $newPicture) {
$this->assertUserIsLogged();
// ...
}
function sendMessage(User $recipient, Message $messageSend) {
$this->assertUserIsLogged();
// ...
}
function assertUserIsLogged() {
if (!$this->user->isLogged()) {
throw new Exception('User is not logged');
// This is just a simplification to show the code smell
// Operations should be defined as objects with preconditions
// etc.
}
}
}
Some modern linters can detect repeated patterns (not just repeated code) and also while performing our code reviews we can easily detect this problem and ask for a refactor.
- Code Duplication
Adding a new feature should be straightforward in our model maps 1:1 to real-world and our responsibilities are in the correct places. We should be alert for small changes spanning several classes.
Photo by William Isted on Unsplash
Duplication is the primary enemy of a well-designed system.
Robert Martin
Software Engineering Great Quotes
This article is part of the CodeSmell Series.