유연성이 높은 설계와 결합도가 높은 설계의 차이

OverdrawAnalyzer overdrawAnalyzer1 = new OverdrawAnalyzer(5, 5);
CommandHistoryManager commandHistoryManager = new CommandHistoryManager(overdrawAnalyzer1);
commandHistoryManager.execute(new ToUpper(2, 0));
commandHistoryManager.execute(new ToUpper(0, 1));
commandHistoryManager.execute(new ToLower(4, 3));
commandHistoryManager.execute(new FillHorizontalLine(0, 'e'));
commandHistoryManager.execute(new DecreasePixel(4, 4));
commandHistoryManager.execute(new DecreasePixel(0, 1));
commandHistoryManager.execute(new ToLower(0, 0));
commandHistoryManager.execute(new DrawPixel(3, 2, 'Z'));
commandHistoryManager.execute(new IncreasePixel(3, 4));
commandHistoryManager.execute(new ToUpper(4, 4));
commandHistoryManager.execute(new DrawPixel(4, 0, '+'));
commandHistoryManager.execute(new FillVerticalLine(4, '^'));
commandHistoryManager.execute(new ToLower(0, 3));
commandHistoryManager.execute(new ToLower(1, 0));
commandHistoryManager.redo();
commandHistoryManager.undo();
commandHistoryManager.execute(new ToLower(1, 3));
commandHistoryManager.execute(new FillVerticalLine(3, 'I'));
commandHistoryManager.execute(new IncreasePixel(4, 4));
commandHistoryManager.redo();

overdrawAnalyzer1.toUpper(2, 0);
//위 analyzer의 직접 메서드 호출에 의해서 Manager는 analyzer의 상태 변경을 알아차릴 수 없다.

commandHistoryManager.undo();
//위 undo 메서드가 호출되면 increasePixel메서드를 undo 하게 되는데 이때 increasePixel이
//자신이 실행해도 되는 메서드인지 확인하는 검증 로직이 필요하게 된다.

 

  • 유연성이 높을수록 설계한 개체가 다른 상황에서도 사용될 수 있도록 설계 해야 한다 → 즉, 객체마다 자신이 정상적으로 사용될 수 있는 상태를 체크하는 검증 로직이 필요해진다
    • Manager 개체가 관리하는 개체들이 오직 Manager에서만 사용된다는 보장이 없다
    • 위의 예시에서 toUpper을 analyzer개체가 먼저 호출해버리면 manager는 어떠한 동작이 실행되었는지를 알 방법이 없다
  • 유연성이 높은 설계는 각 개체 하나의 메서드 하나하나가 자신의 책임이 명확해야 한다. → 책임 연쇄 패턴을 예로 들자면 다른 메서드나 개체에서 다른 개체의 메서드를 활용하게 되는 경우에는 자신의 책임이 명확하지 않다면 오류나 버그 존재시 디버깅이 매우 어려워진다. 또한 어디에서 어떤 역할을 잘 수행하지 못하는지 알기 어려워진다.

 

https://k0102575.github.io/articles/2020-02/chain-of-responsibility-pattern

 

  • 결합도가 높을 수록 유지보수시 고쳐야할 코드가 많아지는것은 맞지만, 설계에 있어서 유연성이 높은 설계는 처음부터 만들기에는 매우 어려운 작업이 될것이고 검증로직등 개체마다 만들어줘야 하는 보일러 코드가 많아질 수 있다.
  • 그럼에도 유연성을 활용해야 하는것은 로직의 변화가 빠르게 필요할때, 다른 부품을 빠르게 바꿔 껴야 하는 시점에서 필요하다.

 

 

 

 

 

 

 

 

 

 

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기