Uncategorized

클린 소프트웨어

공학 설계를 가장 잘 나타내는 문서는 소스 코드이다.

소프트웨어의 악취 요소 7가지

경직성 : 소프트웨어를 변경하기 어려운 경향
취약성 : 코드를 변경하였을 때 많은 부분이 잘못되는 경향
부동성 : 기능을 다른 시스템에 옮기기 어려운 경향
점착성 : 소프트웨어의 설계를 유지하기 어려운 경향
불필요한 복잡성 : 현재 작동하지 않는 요소가 설계에 포함되어 코드가 복잡한 경향
불필요한 반복 : 추상화로 통합할 수 있는 반복적인 코드가 코드에 포함된 경향
불투명성 : 코드를 읽고 이해하기 어려운 경향

소프트웨어는 요구사항이 변하면 언제든 변할 수 있다.
요구사항이 변하면, 그 요구사항에 맞게 코드를 수정한다.
이 때, 추상화 기술을 이용하여 이런 비슷한 변화에 대응할 수 있도록 코딩해야 함

소프트웨어의 악취 제거 5가지 원칙

1.SRP : 단일 책임 원칙 (Single responsibility Principle)

실세계의 특정 객체를 클래스로 만들어서 기능을 묶을 수는 있다. 하지만 해당 클래스는 여러 개의 책임을 갖을 수 있다. 이럴 떄는 해당 클래스를 다른 여러 책임 클래스로 나누면 된다.

2.OCP : 개방 폐쇄 원칙 (Open-Closed Principle)

추상 클래스(템플릿 메소드 패턴) 또는 인터페이스(스트래터지 패턴)를 만드므로서, 수정에는 폐쇄적이고, 확장에는 개방 적인 구조를 만들자.
if-elssif 또는 switch에 추상적으로 같은 기능을 하는 것이 있는 경우 개방 폐쇄 원칙을 거스른것임을 알 수 있다. 모든 enum은 의심해볼 필요가 있다. 클래스가 아닌 이유는?

중요도가 다른 것 뿐 몯느 상황에서 자연스러운 모델은 없다. 따라서, 닫혀 있지 않은 것에 대한 변경은 항상 존재한다.

OCP는 불필요한 복잡성을 늘릴 수 도 있다.
따라서, 올가미보다는 필요할 때 확장해나가자.

테스트 주도 방식을 사용하면, 어느정도 변화를 앞당겨서 확인 가능하다.

3.LSP : 리스코프 치환 원칙(Liskov SUbsitution Principle) -> 어렵다

리스코프 치환 원칙 : 서브 타입은 그것의 기반 타입으로 치환 하고, 기반 타입의 기능의 의도를 위반하지 않는 것을 의미한다. 기반 타입의 f 함수가 서브 타입의 g로서 작동한다면 이것은 LSP 위반이고, 잠재적인 OCP 위반이다.

4.DIP : 의존 관계 역전 원칙(Dependency Inversion Principle)

의존성이란 a가 바뀌면 b가 바뀌어야할 때, b가  a에 의존적이라 한다. 라이브러리간에 의존성이 있으면 안된다. 따라서, 인터페이스를 만든다. 이렇게 되면, 원래 모듈간에 있던 의존성은 사라지고, 다른 모듈든은 이 인터페이스에 의존성이 생기게된다. 이것을 역전된 의존성이라 한다.

미숙한 레이어 나누기역전된 레이어
미숙한 레이어역전된 레이어

5.ISP : 인터페이스 분리 원칙(Interface Segregation Principle)