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?
텍스트를 나타내는 창과 텍스트 로직이 Window클래스에 강하게 결합되어 있다.
디커플링이 필요하다.
왜일까?
텍스트 관점 : =지금은 윈도우 창으로 보여지고 있지만, 향후 csv파일, txt파일 또는 html 파일로 바꿔달라고 요구사항이 생길 수 있다.
윈도우 관점 : 윈도우라는 창 안에 출력물을 보여주는 것
에 집중만 할 뿐, 그것이 텍스트이든, 이미지이든, 동영상이든, 음악 파일이든 중요하지 않다. 근데 지금은 윈도우 창에 text로 보여져야만 한다는 강한 종속성을 띠고 있다.
고수준 모듈이 저수준 모듈에 의존하면 안 된다. 둘 다 추상화에 의존해야 한다.
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
클라이언트는 텍스트, 이미지 또는 동영상을 입력한다.
윈도우는 보여지는 방식에 관심이 없고 데이터를 보여주기만 한다.
스토리지
는 각 파일에 해당하는 데이터를 저장한다.
클라이언트와 윈도우가 분리됐다.
둘 모두 중간의 추상화에 의존하기 때문이다.
show()
만 할게. 복잡한 건 중간의 추상화 영역이 다 알아서 했다며