리팩토링 001 - 세터 제거

세터는 불변성을 위반하고 우발적인 결합을 추가합니다.

TL;DR: Make your attributes private to favor mutability



해결된 문제


  • 가변성
  • setXXX()는
  • 에 존재하지 않기 때문에 올바른 이름 지정 정책을 위반합니다.
  • 사고

  • 관련 코드 냄새











    단계


  • 세터 사용법 찾기
  • 필수 속성을 설정하는 경우 생성자로 이동하고 메서드를 제거합니다
  • .
  • 우발적 속성을 변경해야 하는 경우 이는 setter가 아닙니다. setXXX 접두사 제거

  • 샘플 코드



    전에




    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 convention
    
    location.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
    


    후에




    //1. We locate setters usage
    location.setX(1);
    
    location.setY(2);
    
    //2. If you are setting essential properties move 
    //them to the constructor and remove the method
    public 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 prefix
    
    
    Car tesla = new Car();
    //Our car is stopped
    
    tesla.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
    


    유형



    [X] 반자동

    우리는 IDE로 세터(메타 프로그래밍을 사용하지 않는 한)를 감지해야 합니다.

    커버리지가 좋은 경우 테스트를 제거하고 어떤 테스트가 실패하는지 확인할 수도 있습니다.

    태그


  • 가변성

  • 관련 리팩토링


  • 게터 제거
  • 생성자에서 필수 속성을 전달합니다
  • .
  • 생성자에서 필수 속성을 초기화합니다
  • .

    크레딧



    Comfreak에서 Pixabay의 이미지


    이 문서는 리팩토링 시리즈의 일부입니다.

    좋은 웹페이지 즐겨찾기