설계 시점에 따라 다른 추상화 기법

김유상·2022년 12월 22일
0

객체 지향에서는 추상화라는 개념을 사용해서 실질적인 데이터 중복을 없애고 단순하고 유지 보수가 쉬운 디자인을 추구한다.

그러면 함수 인자 전달에 있어서 최소한의 인자가 필요한 함수를 만드는 것이 어떻게 보면 추상화의 작은 한 걸음 정도로 볼 수 있다.

그런데 추상화 수준이 높아 여러 인자를 객체로 묶어서 전달하게 되면 함수 caller 입장에서는 해당 객체의 내부 구조를 필수적으로 알아야 한다. 이렇게 되면 생각보다 trade off가 심할 것 같다는 문제 의식이 피어난다. 물론 추상화 개념은 반드시 필요하지만 인자를 여러 개 전달할 때 명시성이 더 좋다면 가독성과 추상화를 조금 포기할 필요가 있지 않을 까라는 생각이다.

class Test:
    def __init__(self):
        self._test_num = 0
        self._folder = Folder()
        
class Main:
    def fun1(self, test, widget):
        self.setImage(test.get_test_num(), test.get_folder(), widget)
        self.setImage2(test, widget)
        
    def setImage(self, test_num, folder, widget):
        #객체를 풀어서 전달받는 함수
        ...
        
    def setImage2(self, test, widget):
        #객체를 직접 전달받는 함수
        ...

일반적으로 객체를 풀어서 인자로 전달하는 것이 더 명시성이 좋은 경우는 설계 초기 단계에 속할 것 같다. (혹은 단순한 프로그램)
설계 초기에는 클래스에 구체적인 로직이 구현되지 않았을 것이고 실제로 필요한 변수 또한 모두 정의되지 않았을 확률이 높다. 그러면 확실히 클래스라는 개념으로 정보를 저장하는 의미가 무색할 시점이라 아마도 인자를 풀어서 전달하는 것이 명시성이 좋다고 생각될 것 같다.
하지만 프로그램의 확장이 뻔하게 예상된다면 바로 객체를 전달하는 것도 좋은 선택이라고 생각한다.

마지막으로 정리를 해보자면

  1. 설계 초기에는 객체를 직접 전달하는 것보다 객체 변수를 풀어서 여러 인자로 전달하는 것이 명시적으로 좋을 수 있음.
  2. 하지만 프로그램이 확장된다면 해당 객체를 소유하는 객체가 생길 수도 있고 해당 객체의 변수가 추가될 수 있으므로 여러 인자를 객체로 통합해서 전달해야 될 수 있음.
  3. 현재 설계 수준에서 1번과 2번 중 선택이 고민된다면 일단 1번을 선택하고 나중에 필요에 따라 리팩토링을 통해 2번으로 전환할 수 있음.
profile
continuous programming

0개의 댓글