Bjarne Stroustrup(C++ 창시자) : 코드가 우아하다는 의미는 군더더기 없이 깔끔하다는 의미이고, 효과적이라는 것은 기능을 수행하는 코드를 최대한 작은 라인으로 구현한다는 의미
단순하고 직접적
모든 팀원이 이해하기 쉽도록 작성
→ 코드를 '새로 작성' 하는 시간 보다 '수정' 하는 시간이 훨씬 많기 때문 = 리소스 소모가 많다.
<aside> 💡 좋은 앱이란 빠르고 효율적인 앱이 아니라 요구사항 변경(수정)에 잘 대처할 수 있는 앱을 뜻한다.
</aside>
라인 개발팀 정의 : 의존성
Type X depends on type Y
def foo():
bar_instance = Bar()
bar_instance.some_method()
class Foo:
def __init__(self):
self.bar = Bar()
...
의존성 있으면 생기는 문제점?
bar()에 영향을 많이 받는다.
테스트 하기 어려움 → Bar 클래스가 존재해야함
def test_foo_should_work():
foo = Foo() # 이렇게 작성할때 이미 Bar는 작성이 되어있어야함
assert foo is not None
객체를 생성하지 말고 인자로 받자
def foo(bar_instance):
bar_instance.some_method()
bar_instance = bar()
foo(bar)
class Foo:
def __init__(self, bar):
self.bar = bar
bar에 대한 의존성이 역전됨
Foo에 대한 코드 작성시 Bar가 존재안해도 됨
def test_foo_should_work():
mock_bar = mock(bar())
foo = Foo(mock_bar)
assert foo is not None
Bar가 다른 클래스로 바뀌어도 영향 받는 부분이 미비함
여기서 추상화라는 개념이 등장
Bar, Bar_some, Bar_poll 등의 class 등이 있다고 할 경우... 이들을 모두 BaseBarInterface를 상속받게끔 한다면
class Foo:
def __init__(self, BaseBarInstance):
self.bar = BaseBarInstance