티스토리 뷰

클래스는 단 한 개의 책임을 가져야 한다.

 

단일 책임 원칙이 지켜지지 않은 예

public class DataViewer{

	public void display(){
    	String data = loadHtml();
        updateGui(data);
    }
    
    public String loadHtml(){
    	HttpClient client = new HttpClient();
        client.connect(url);
        return client.getResponse();
    }
    
    private void updateGui(String data){
    	GuiData guiModel = parseDataToGuiData(data);
        tableUI.changeData(guiModel);
    }
    
    private GuidData parseDataToGuiData(String data){
    	//파싱 처리 코드...
    }
    //기타 코드
}

display() 메서드에서 loadHtml()로 HTML response 문자열을 읽어서 updateGui()로 보낸다. updateGui는 이를 받아서 tableUI를 활용해 데이터를 보여준다.

 

DataViewer를 잘 사용하다가 이제 데이터를 HTTP 프로토콜이 아닌 소켓 기반 프로토콜로 받게 되었다. 이 프로토콜은 response를 String이 아닌 byte 배열로 제공한다. 그러면 DataViewer에 어떤 변화가 생길까?

 

public class DataViewer{

	public void display(){
    	//String data = loadHtml();
        byte[] data = load();
        updateGui(data);
    }
    /*
    public String loadHtml(){
    	HttpClient client = new HttpClient();
        client.connect(url);
        return client.getResponse();
    }
    */
     public byte[] loadHtml(){
    	SocketClient client = new SocketClient();
        client.connect(server,port);
        return client.read();
    }
    private void updateGui(byte[] data){
    	GuiData guiModel = parseDataToGuiData(data);
        tableUI.changeData(guiModel);
    }
    
    private GuidData parseDataToGuiData(byte[] data){
    	//파싱 코드 변경...
    }
    //기타 코드
}

바뀐 내용을 살펴보면, loadHtml() 코드, updateGui() 파라미터, GuiData로 파싱하는 parseDataToGuiData()의 파라미터, 코드를 수정했다. 달라진 것은 분명 데이터를 읽어들이는 방식인데, 이와 관련이 없는, 데이터를 화면에 보여주는 코드도 함께 바꿔야만 했다.

이렇게 수정한 내용이 많아진 것은, DataViewer가 두 개의 책임( 1.데이터를 읽는다, 2. 화면에 보여준다)을 갖기 때문이다. 

 

위와 같이 데이터를 읽는 책임(DataLoader), 화면에 보여주는 책임(DataDisplayer)을 분리하고, Data를 String이나 Byte[] 타입으로 특정하지 않고 알맞게 추상화한다면 데이터를 읽어오는 부분의 변경으로 화면을 보여주는 부분을 바꿀 필요가 없어진다. 다시 말해 한 클래스에 섞여 있던 책임을 두 클래스로 분리했기 때문에 요구사항이 변경되었을 때 코드를 수정하기가 용이해진 것이다.

 

그렇다면 단일 책임 원칙이 위배되었는지 확인할 수 있는 방법이 있을까?

한가지 팁은 메서드를 실행하는 것이 누구인지 살펴보는 것이다. 위 예시의 경우, DataViewer의 display()를 사용하는 객체와 loadData()를 사용하는 객체가 서로 달랐을 것이다. 이처럼 객체의 사용자들이 한 객체 내에 있는 서로 다른 메서드를 사용한다면 이 메서드들은 SRP를 위반하고 있을 가능성이 높다.

 

 


코드 출처, 참고 도서 : 개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴, 최범균 지음, 인투북스

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함