가독성 높은 코드 만들기 방법 #4 – 잘못된 상속 피하기

Sub class에서 super class 기능을 일부만 사용하는 경우는 가독성을 떨어 지게 합니다. 아래와 같이 Line, Circle, Square 가 있습니다.
여기서 Circle, Square 에서 Border 가 필요해 Shape 에 가상함수를 정의 하였습니다.

class Border{

	int boderThickness;
	Color color;

	public Border(int boderThickness, Color color){...}
}

class Shape {

	protected Border border;

	public void setBorder(Border bdr) {

		border = bdr;
	}
	
	public virtual void draw();

	protected virtual void drawBorder();
}

class Line extends Shape {
	
	public override void draw(){

		// draw Line
		// draw border <- 필요 없어!
	}

	protected override void drawBorder() {
		// 난 Line이고 Border가 없어... 이 함수가 필요 없는데..
	}
}

class Circle extends Shape {

	public override void draw(){
		// draw Circle
		drawBorder();
		
	}

	protected override void drawBorder() {...}
}

class Square extend Shape{

	public override void draw(){
		// draw square
		drawBorder();
	
	}

	protected override void drawBorder() {...}
}

위의 코드에서 보면 Circle과 Square에 drawBorder 가 들어간게 이치에 맞지만, Line은 그렇지 않습니다. Line 은 사용하지 않는 drawBorder 기능을 불필요하게 가지고 있어야 합니다.
Line 소스 분석시에 개발 당사자가 아니면 “이런게 여기 왜있지?” 라고 생각하겠죠.
해결 방법은 drawBorder 기능을 Shape 에서 빼고 Circle 와 Square에서 각각 처리하는 방법이 있고, 다른 하나는 중간에 Shape을 상속 받은 DrawerShape 을 만들고 거기서 drawBorder를 추가 하는것 입니다.
아래 그 예 입니다.

class Shape { 
	public abstract void draw();    
}
      
class DrawerShape extends Shape {

	protected Border border;

	public void setBorder(Border bdr) {
		border = bdr;
	}
	
	protected virtual void drawBorder();            
}

class Line extends Shape {
       
	public void draw(){
		// draw Line	
	}
}
   
class Square extends DrawerShape{
    
	public void draw(){
		// draw Square
		drawBorder();
	}
       
	protected void drawBorder(){
		// draw Square border
	}             	
}
  
class Circle extends DrawerShape {
    
	public void draw(){

		// draw Circle
		drawBorder();
	}
       
	protected void drawBorder(){
		// draw Circle border
	}
}

super class 기능의 일 부분만 사용하는것이 항상 나쁜다는 것은 아닙니다.
저도 그렇게 가끔 사용하여 더 좋은 경우도 있습니다. 하지만 이것은 OOP 위반이라는것은 아셔야 됩니다. 이것을 남발 할 수록 모듈화 또는 가독성과는 점점 멀어지게 됩니다.

가독성 높은 코드 만들기 방법 #4 – 잘못된 상속 피하기”의 1개의 생각

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중