객체 비대하지 않게 책임 기반 설계
ex) Employee가 design, coding, analysing을 다 가지면 안됨
변경 없이 확장 가능해야 함
ex) 추상인 Employee.work에 의존해야 함.
부모 객체의 역할은 자식 객체도 할 수 있어야 함.
ex) 자식을 부모로 대체 가능해야 함. 정사각형 is 직사각형
상속보다는 구성(composition, 부분의 합, is part of) 고려
구성
Class House():
bedroom: Bedroom
livingroom: Livingroom
SRP가 객체 단일 책임이라면, ISP는 인터페이스 단일 책임
인터페이스를 잘 쪼개두면, 클라이언트는 필요한 인터페이스만 구현(or 상속)할 수 있다
to-be
class Telephone(metaclass=ABCMeta):
@abstractmethod
def call(self):
...
@abstractmethod
def send_message(self):
...
class Camera(metaclass=ABCMeta):
@abstractmethod
def take_picture(self):
...
class Application(metaclass=ABCMeta):
@abstractmethod
def see_youtube(self):
...
class PhoneWithNoCamera(Telephone, Application):
...
의존성 역전 & 의존성 주입. 객체 생성을 외부(사용하는 클라이언트)에 맡겨.
class App():
def __init__(self, db: DB):
self.db = db
def save_user(self, data):
self.db.store_data(data)
if __name__ == "__main__":
inmemory_db = InMemoryDatabase()
app = App(inmemory_db)
app.save_user({"id":1, "name":"grab"})