의존성 역전 원칙 - 2

hyuckhoon.ko·2022년 9월 5일
0

1. 상황 설명

입력한 텍스트를 보여주는 윈도우 창 클래스를 설계해야 한다.


2. 초기 설계

class Window:
	def __init__(self):
		self.text = ""
        
	def write_text(self, text):
		self.text += text
        
	def show_window(self):
		print(f"{self.text}")
        
	def save_text(self):
        msg = "Text saved in text file."
        print(f"{msg}")


       
>>> w = Window()
>>> w.write_text("What is Dependency Injection?")
>>> w.show_window()
What is Dependency Injection?

3. 문제점

텍스트를 나타내는 창과 텍스트 로직이 Window클래스에 강하게 결합되어 있다.

디커플링이 필요하다.

왜일까?

  • 텍스트 관점 : =지금은 윈도우 창으로 보여지고 있지만, 향후 csv파일, txt파일 또는 html 파일로 바꿔달라고 요구사항이 생길 수 있다.

  • 윈도우 관점 : 윈도우라는 창 안에 출력물을 보여주는 것에 집중만 할 뿐, 그것이 텍스트이든, 이미지이든, 동영상이든, 음악 파일이든 중요하지 않다. 근데 지금은 윈도우 창에 text로 보여져야만 한다는 강한 종속성을 띠고 있다.

고수준 모듈이 저수준 모듈에 의존하면 안 된다. 둘 다 추상화에 의존해야 한다.


4. 개선

class Window:
    def __init__(self, storage):
        self.storage = storage

    def write(self, data):
        self.storage.data = data

    def show(self):
        print(f"{self.storage.data}")

    def save(self):
    	"""DB에 저장: 영속성"""
        self.storage.save()


class TextFile:
    data = ""

    def save(self):
        msg = f"Text saved : {self.data}."
        print(msg)


class ImageFile:
    data = ""

    def save(self):
        msg = f"Image saved : {self.data}."
        print(msg)

class VideoFile:
    data = ""

    def save(self):
        msg = f"Video saved : {self.data}."
        print(msg)

기존 계획대로 TextFile을 활용해보자.

>>> text_storage = TextFile()
>>> w = Window(text_storage)
>>> w.write("hello")

>>> w.save()

>>> w.show()
hello

이번엔 VideoFile을 활용해보자

>>> video_storage = VideoFile()
>>> w = Window(video_storage)
>>> w.write("DIP moving")

>>> w.save()

>>> w.show()
DIP moving


5. 분석

클라이언트는 텍스트, 이미지 또는 동영상을 입력한다.
윈도우는 보여지는 방식에 관심이 없고 데이터를 보여주기만 한다.

스토리지는 각 파일에 해당하는 데이터를 저장한다.

클라이언트와 윈도우가 분리됐다.
둘 모두 중간의 추상화에 의존하기 때문이다.

  • 클라이언트는 동영상이 어떻게 저장되고 어떻게 보여질지 관심이 없다. 그저 동영상만 잘 업로드하고 잘 보여지길 원할 뿐, 동영상의 저장 원리와 보여지는 방식을 생각하고 싶지 않다.
  • 윈도우는 자기가 어떤 파일을 보여줄지에 대해 관심이 없다. 그것이 텍스트인가? 동영상인가? 등은 관심 사항이 아니다. 데이터가 있어? 그럼 show()만 할게. 복잡한 건 중간의 추상화 영역이 다 알아서 했다며

0개의 댓글