VB에서 템플릿 필요성 이해하기

프로그래밍에서 DRY 원칙—“자기 반복 금지”—은 깔끔하고 효율적이며 유지 관리가 용이한 코드를 작성하는 데 필수적입니다. 이 원칙은 Visual Basic for Applications (VBA)와 같은 언어로 작업할 때 특히 중요해지며, 그 이유는 C++와 같은 언어에서 템플릿과 같은 추상화 기술에 대한 지원이 제한되어 있어 중복이 흔하게 발생하기 때문입니다.

유사한 기능을 수행하는 여러 코드 조각이 서로 다른 객체 유형에서 필요하다면, 더 효율적인 솔루션을 고려해야 할 때입니다. 질문은 다음과 같습니다: 어떻게 반복 코드를 피하면서 유사한 작업을 통합할 수 있을까요?

VBA 내에서 또는 바람직하게는 적용 가능한 경우 최신 도구를 사용하여 템플릿(일종의)을 활용할 수 있는 방법을 알아보도록 하겠습니다.

문제: VBA의 반복 코드 조각

다음 예를 살펴보겠습니다. 여기서는 서로 다른 유형에 대해 본질적으로 동일한 작업을 수행하는 두 코드 조각이 있습니다:

Dim i as Obj1
Set i = RoutineThatReturnsObj1()
i.property = newvalue

Dim i as Obj2
Set i = RoutineThatReturnsObj2()
i.property = newvalue

이 경우, 두 루틴 모두 서로 다른 객체 유형에 대해 할당 및 속성 설정 작업을 수행하고 있음을 알 수 있습니다. 프로그래머는 중복을 줄이는 보다 일반화된 솔루션을 만들고자 합니다.

의도된 솔루션

일반 루틴 만들기

반복 코드를 제거하기 위해 프로그래머는 두 시나리오를 처리할 수 있는 루틴을 제안합니다:

Sub MyRoutine(o as ObjectType, r as RoutineToInitializeObject, newvalue as value) 
   Dim i as o
   Set i = r
   i.property = newvalue
End Sub

하지만, 기본 VBA는 C++와 같은 언어에서 제공하는 정교한 템플릿 기능이 부족하다는 점을 유의해야 합니다. 따라서 VBA의 한계 내에서 유사한 효과를 얻는 것은 도전적일 수 있습니다.

대안: VBA와 함께 .NET 사용하기

전통적인 VBA는 C++와 같은 제네릭이나 템플릿을 지원하지 않지만, **Visual Studio Tools for Office (VSTO)**로 전환하면 실용적인 대안이 제공됩니다. 접근 방식을 현대화할 의지가 있거나 가능하다면, .NET에서 제네릭을 사용할 수 있습니다.

제네릭 구현하기

다음은 .NET 컨텍스트 내에서 제네릭을 활용하는 방법입니다:

Function MyRoutine(Of O)(R As Delegate, newvalue As Object) As O
    Dim i As O = CType(r.Method.Invoke(Nothing, Nothing), O)

    ' 어떤 속성을 사용할지 지정하기 위해 또 다른 매개변수가 필요하며
    ' 그런 다음 반사를 사용하여 값을 설정합니다.
    i.property = newvalue 
    return i
End Function

이 예제에서:

  • Of O는 런타임에 지정할 수 있는 형식 매개변수를 나타냅니다.
  • CType는 호출된 델리게이트의 반환 값을 원하는 형식으로 캐스팅하는 데 사용됩니다.
  • 속성 값을 설정하기 위해 반사를 사용하여 지정된 속성에 동적으로 접근합니다. 이는 전통적인 VBA에서는 불가능한 작업입니다.

결론

전통적인 VBA는 C++와 같은 고급 프로그래밍 언어에서 볼 수 있는 템플릿 기능이 부족하지만, 코드 반복을 최소화할 수 있는 대체 방법이 있습니다. Visual Studio Tools for Office와 .NET을 사용하면 제네릭을 활용하여 동적이고 재사용 가능한 코드 구조를 만들 수 있습니다.

VBA 프로젝트 내에서 다양한 객체 유형에 대해 유사한 코드를 자주 작성해야 한다면, 개발 환경의 현대화를 고려해 보세요. 이러한 변화를 수용하는 것은 코드의 명확성을 향상시킬 뿐만 아니라 소프트웨어 개발의 모범 사례와도 일치합니다.

VB 내의 한계와 가능성을 이해함으로써, 더 깔끔하고 효율적인 코드를 작성하고 효과적으로 DRY 원칙을 준수할 수 있습니다.