An Interest In:
Web News this Week
- April 25, 2024
- April 24, 2024
- April 23, 2024
- April 22, 2024
- April 21, 2024
- April 20, 2024
- April 19, 2024
Refactoring 001 - Remove Setters
Setters violate immutability and add accidental coupling
TL;DR: Make your attributes private to favor mutability
Problems Addressed
Mutability
setXXX() violates good naming policies since it does not exist on the MAPPER
Accidental coupling
Related Code Smells
Code Smell 01 - Anemic Models
Maxi Contieri Oct 20 '20 2 min read
Steps
Locate the setters usage
If you are setting essential properties move them to the constructor and remove the method
If you need to change an accidental property it is not a setter. Remove the setXXX prefix
Sample Code
Before
public class Point { protected int x; protected int y; public Point() { this.x = 0; this.y = 0; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } }Point location = new Point();//At this momment, it is not clear which points represent//It is coupled to constructor decision.//Might be null or some other conventionlocation.setX(1);//Now we have point(1,0)location.setY(2);//Now we have point(1,2)
public class Car { protected int speed; public Car() { } public void setSpeed(Speed desiredSpeed) { this.speed = desiredSpeed; } }Car tesla = new Car();//We have no speed??tesla.setSpeed(100 km/h);//Now our car runs fast
After
//1. We locate setters usagelocation.setX(1);location.setY(2);//2. If you are setting essential properties move //them to the constructor and remove the methodpublic class Point { public Point(int x, int y) { this.x = x; this.y = y; //We remove the setters }Point location = new Point(1, 2);
public class Car { protected int speed; public Car() { this.speed = 0 km/h; } public void speed(Speed desiredSpeed) { this.speed = desiredSpeed; } }//1. Locate the setters usage//3. If you need to change an accidental property// it is not a setter. Remove the setXXX prefixCar tesla = new Car();//Our car is stoppedtesla.speed(100 km/h);//We tell the desired speed. We don't set anything//We don't care if the car stores its new speed.//if it manages through the engine//if the road is moving etc
Type
[X] SemiAutomatic
We should detect setters (unless they use meta programming) with our IDEs.
We can also remove them and see which tests fails if we have good coverage
Tags
- Mutability
Related Refactorings
Remove Getters
Pass essential properties in the constructor
Initialize essential properties in the constructor
Credits
Image by Comfreak from Pixabay
This article is part of the Refactoring Series.
Original Link: https://dev.to/mcsee/refactoring-001-remove-setters-26cg
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To