Code Smell 66 - Shotgun Surgery
28 April, 2023
3
3
0
Contributors
TL;DR: Don't fire!
Say it only once
Problems
- Bad Responsibilities Assignments
- Code Duplication
- Maintainability
- Single Responsibility Violation.
- Copy-pasted code.
Solutions
- Refactor
Sample Code
Wrong
<?
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');
}
// ...
}
}
Right
<?
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.
}
}
}
Detection
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.
Tags
- Code Duplication
Conclusion
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.
More Info
(Wikipedia)[https://en.wikipedia.org/wiki/Shotgun_surgery]
(Refactoring Guru)[https://refactoring.guru/es/smells/shotgun-surgery]
(NDpend Blog)[https://blog.ndepend.com/shotgun-surgery]
(Dzone)[https://dzone.com/articles/code-smell-shot-surgery]
Credits
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.