티스토리 뷰
CH1 - 오리 시뮬레이션 게임 2편 / 인터페이스 확장
이 글은 Excel VBA 에서 객체지향 디자인 패턴을 사용하는 것을 학습하며 정리하기 위한 글입니다.
내용은 책 "헤드 퍼스트 디자인 패턴 : 14가지 GoF 필살 패턴! 유지 관리가 편리한 객체지향 소프트웨어를 만드는 법"을 변형하여 적용하였습니다.
모든 코드는 GitHub의 Commit History에서 변경된 내용을 볼 수 있습니다.
Excel Office 365 with RubberDuck Add-In
GitMind - UML-클래스 다이어그램
GitHub with Visual Studio Code
이전 편에서는 오리 시뮬레이터를 Excel VBA에서 실행해보았고, 인터페이스 사용법에 대해서도 알아보았습니다.
원문에서는 JAVA의 상속을 이용하지만, 사실 VBA에는
상속
이 없습니다! 따라서 인터페이스를 대안으로 사용하고 있습니다.
오리 날기 추가
GitHub Commit History / VBA OOP / CH1 - 오리 시뮬레이션 게임 2편 / 문제 발생
오리 시뮬레이터는 잘 작동하고 있지만, 오리가 날 수 있으면 더 귀여울 것 같아요! IDuck 인터페이스 클래스
에 fly() 메소드를 추가하면 될 것 같은데요?

문제 발생
이런.. 실제로 날 수 있는 일부 오리 서브클래스만 날아야 되는 사실을 깜빡했습니다. 그리고 IDuck 인터페이스를 참조하는 수많은 서브클래스에 일일이 코드를 추가
해주어야 합니다. 그렇지 않으면 다음 그림과 같은 오류를 보게될테니까요.

오리 종류가 많을 수록 지루한 반복작업이 되겠네요. 오히려 인터페이스를 쓰지 않은 RedheadDuck 클래스의 형식으로 코드를 입력하는 것이 답이었을까요?
인터페이스 설계
기존 인터페이스을 수정하여 구현한다면 앞으로 규격이 바뀔때마다 메소드를 일일이 살펴보고, 모든 코드를 바꾸어주어야 합니다.
따라서 다음 그림과 같이, 특정 오리만 날거나 꽥꽥거릴 수 있도록 깔끔한 방법을 사용할 것입니다!

IFlyable
인터페이스와 IQuackable
인터페이스를 추가하여 해당 기능을 사용할 오리에만 구현하면 될 것 같네요.
물론 메소드 조금을 쓰고 싶지 않아서 이런 인터페이스를 만든 것은 아닙니다. 재사용성을 고려하지 않은 것처럼 보이기도 합니다. 하지만, 객체지향 소프트웨어 디자인 원칙을 적용하여 해법을 찾아보겠습니다. 어떠한 프로그래밍 언어를 쓰든, 어떤 무언가를 만들든 항상 변화
합니다. 즉, 아무리 설계를 잘 하여도 수정하고 변경해야한다는 것
입니다.
한 가지를 바꿀 때마다 (나는 것을 추가하거나 수영하는 것을 수정하거나) 모든 서브클래스에서 코드를 일일이 고치고, 새로운 버그가 생길 가능성이 있습니다. 이런 상황에서의 디자인 원칙은 다음과 같습니다.
디자인 원칙 1
애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다.
-> 기존 코드를 수정하는 과정에서 의도치 않은 영향을 줄이도록, 유연성을 향상시키기 위함입니다.
오리 행동 인터페이스 추가
GitHub Commit History / VBA OOP / CH1 - 오리 시뮬레이션 게임 2편 / 오리 행동 인터페이스 추가
이제, 날아다니는 행동과 꽥꽥거리는 행동을 구현하는 클래스를 디자인할 것입니다. 유연하게 만드는 것이 좋으므로, 각각의 MallardDuck이나 RedheadDuck 등에 인터페이스를 추가로 구현하거나 오리의 행동을 동적으로 바꿀 수 있으면 더 좋을 것 같습니다. 오리 행동을 다른 인터페이스로 구현할 것이므로, IDuck 인터페이스에는 행동을 구체적으로 구현할 필요가 없습니다!
디자인 원칙 2
구현보다는 인터페이스에 맞춰서 프로그래밍한다.
이렇게 행동 인터페이스를 추가한 것은, 지금까지 IDuck 클래스에 구현하거나, 각각의 서브클래스에서 별도로 구현하는 방법과는 다릅니다. 항상 특정 구현에 의존했기 때문에, 행동을 변경할 여지가 없었습니다. 따라서, 실제 행동 구현은 IDuck 클래스가 아닌, 행동 인터페이스로 표현되는 행동을 사용합니다.

fly()와 quack()은 IFlyBehavior과 IQuackBehavior로 옮겼으므로, 대신 performFly()와 performQuack()이라는 메소드를 사용할 것입니다.

잘 작동합니다! IDuck 인터페이스 클래스를 구현하지 않은 RedHead는 .quack 메소드와 .fly 메소드를 그대로 사용하지만, 나머지 오리들은 .performQuack과 .performFly 메소드를 사용함으로써 행동 인터페이스인 IQuackBehavior와 IFlyBehavior에 실제 구현 코드를 위임하였습니다! 다음 그림과 같이 말이죠!

이번에는 행동 인터페이스를 추가하고 확장하여 작동까지 확인하였으니, 이후에는 오리의 행동 형식을 IDuck의 서브클래스(MallardDuck 등)에서 세터 메소드(setter method)로 설정하여 동적으로 오리의 행동을 지정해보겠습니다!
INDEX
'VBA > OOP' 카테고리의 다른 글
VBA OOP / INDEX (0) | 2022.09.22 |
---|---|
CH2 - 기상 모니터링 3편 / 옵저버 패턴 방식 변경 (1) | 2022.09.22 |
CH2 - 기상 모니터링 2편 / 시스템 설계 및 구현 (0) | 2022.09.22 |
CH2 - 기상 모니터링 1편 / 옵저버 패턴의 이해 및 구조 파악 (1) | 2022.09.22 |
CH1 - 오리 시뮬레이션 게임 3편 / 인터페이스 동적 활용 및 정리 (0) | 2022.09.14 |
CH1 - 오리 시뮬레이션 게임 1편 / VBA 객체지향 사용방법 예시 (0) | 2022.09.12 |