티스토리 뷰
OOP in VBA: Immutability & The Factory Pattern
이 글은 Rubberduck Blog의 OOP in VBA: Immutability & The Factory Pattern 글을 번역하며 공부하기 위한 기록으로, 일부 생략된 부분이 있을 수 있습니다. 오역, 오타에 관한 자유로운 의견 감사드립니다.
이 포스팅은 OOP(객체지향프로그래밍)을 다루는 포스팅입니다.
해당 기사에 대한 코드는 GitHub의 여기에 있습니다.
공장 패턴 (Factory Pattern)
공장이라는 말 그대로입니다: 물건을 만드는 역할을 하는 객체입니다; 객체 생성의 개념을 캡슐화합니다.
Dim thing As Something
Set thing = New Something '<~ type is known at compile-time
Dim lateBoundThing As Object
Set lateBoundThing = CreateObject("Some.ProgID") '<~ Windows Registry lookup at run-time
우리가 New 키워드나, CreateObject 함수를 사용할 때마다, 우리는 새로운 클래스의 인스턴스를 만듭니다.
왜 그걸 캡슐화하고 싶나요? (Why would you want to encapsulate that?)
VBA 클래스는 기본적으로 "Private" 입니다: 그들은 정의된 프로젝트 내에서만 사용할 수 있습니다. 클래스 모듈은 "Public, not creatable" 로 만들어질 수도 있는데, 이 VBA 프로젝트를 참조로 추가하는 다른 VBA 프로젝트에서도 사용됩니다. (Scripting 라이브러리를 참조하는 것처럼 보이지만, 다른 .xlsm이나 .xlam을 참조하는 것입니다.) 즉 참조하는 VBA 프로젝트에서, 다른 참조된 프로젝트의 클래스를 조회하고 사용할 수 있지만, 클래스의 인스턴스를 만들 수는 없습니다. 따라서 Public 클래스의 인스턴스를 반환하기 위해서 VBA 프로젝트 참조를 기능적으로 노출하기 위한 방법이 필요합니다.
공개 함수(public function)를 반환하는 표준 모듈(standard module)은 공개 클래스 인스턴스(public class instance)를 만들고 반환합니다. 그러나, 표준 모듈은 속한 멤버를 캡슐화하지 않으며, 함수 호출을 적절하게 한정하는지에 대한 것은 클라이언트 코드에 달려 있습니다: MyFactoryModule.CreateMyClass는 CreateMyClass와 동일하게 유효한데, 표준 모듈의 공개 멤버가 전역 네임스페이스(namespace)를 오염시키기 때문입니다. 단독 책임 객체는 주어진 종류의 객체를 만들고, 전역 네임스페이스를 클린하게 유지합니다. 한 마디로 공장 패턴 인 것입니다.
그러나 레퍼런스-프로젝트 시나리오가 공장을 원하기만은 아닙니다: 때로 클래스의 새로운 인스턴스를 만드는 것은 해당 클래스에서 인스턴스를 자주 만들어야할 때 불필요한 부분이 쉽게 중복되는 지루한 설정 코드를 포함합니다. (sometimes creating a new instance of a class involves some amount of tedious setup code that can easily become redundant if we often need to create instances of that class in our code.)
Set thing = New Something
thing.SomeProperty = someValue
thing.AnotherProperty = anotherValue
thing.OneMoreProperty = oneMoreValue
Set thing.OtherThing = New OtherThing '<~ imagine OtherThing also needs setup code!
'...
공장에서, 코드는 한 곳에만 존재하면 되는데, 그것이 DRY(Don't Repeat Yourself./반복하지마시오.)입니다. 이로 인해 그렇게 하지 않을 때 보다 유지보수하기 좋은 깨끗한 코드를 의미합니다.
싱글톤 (Singleton)
기본 인스턴스 (Default Instances)
불변성 (Immutability)
예제: 크로스-프로젝트 시나리오 (Example: Cross-Project Scenario)
인터페이스 (Interface)
주의! 하나의 인터페이스에는 하나의 상속 (One Interface, One Implementation: Caution!)
구현 (Implementation)
문서 모듈을 하지 마세요. (Document Modules: Don’t.)
언더스코어를 하지 마세요. (Underscores: Don’t.)
공장 메소드 (Factory Method)
언제 무엇을 사용하나 (What to use When)
공장공장 (ThingFactoryFactory)
다시 지구로 (Back on Earth)
이어지는글
'VBA > RubberDuck' 카테고리의 다른 글
VBA Rubberducking (Part 4) (0) | 2022.05.18 |
---|---|
VBA Rubberducking (Part 3) (0) | 2022.05.10 |
VBA Rubberducking (Part 2) (0) | 2022.05.09 |
VBA Rubberducking (Part 1) (0) | 2022.05.01 |
VBA Rubberduck / 러버덕 (0) | 2022.05.01 |