Software Lab

필수 변수는 생성자 함수를 통하여 본문

코드 리펙토링

필수 변수는 생성자 함수를 통하여

아임코더 2022. 6. 28. 15:57
class Line{
    
    Point start;
    Point end;

    public void setStart(Point point){

        this.start = start;
    }


    public void setEnd(Point point){

        this.end = end;
    }


    public void draw(){

        if(self.start == null)
            return;
            
        if(self.end == null)
            return;

        ....
        ....
    }
}


void main(){

    Line line = new Line();
    line.setStart(new Point(10, 10));
    line.setEnd(new Point(20, 30));
    line.draw();        
}

<개선 전>

 

class Line{

    Point start;
    Point end;
        
    private Line(){}


    public Line(Point start, Point end){
    
        self.start = start;
        self.end = end;
    }


    public void draw(){

        ....
        ....
    }
}


void main(){
    
    Line line = new Line(new Point(10, 10), new Point(20, 30));
    line.draw();
}

<개선 후>

 

 

객체가 생성될 때, 필수 변수는 생성자 함수를 통해서 설정한다.

<개선 전> 코드에서 멤버 변수인 start, end는 Line 객체가 정상 동작 하기 위한 필수 변수이다. 이러한 필수 변수를 일반 멤버 함수(setStart, setEnd와 같이..)로 설정하게 되어있다. 이렇게 되면 객체가 비정상 동작하는, 즉 불안정한 상태의 객체도 만들 수 있게 허용하게 되는 것이다.

<개선 전> 코드에서 35, 36번 줄 없이, Line 객체 생성(34번 줄) 후 바로 draw 함수(37번 줄)의 호출이 가능하다. draw 함수 내부 적으로 null 처리한다면 죽지는 않을 것이다. 그렇지만 draw 함수가 호출은 되었는데, Line은 그려지지 않을 것이므로 비정상 동작하게 되는 것이다.

반면 <개선 후> 코드와 같이 그 객체가 정상 동작하기 위한 필수 변수는 생성자 함수를 통하여 설정하도록 한다. 그러면 객체가 생성된 후 즉시 정상 동작이 가능한 상태가 된다. 불 안정한 상태의 객체를 만들 수 있는 여지가 없다. 또한 draw 함수 내부에서 null 처리 코드가 필요 없다.

Comments