2020. 2. 28. 02:03ㆍ[공부] 독서/클린 아키텍처
소프트웨어 아키텍쳐의 목표
필요한 시스템을 만들고 유지보수하는데 투입 되는 인력을 최소화한다.
개발자 입장에서 전력을 기울이지 않는 개발자는 없다.
소프트웨어의 어원처럼 소프트웨어는 반드시 부드러워야한다.
구조적 프로그래밍
Goto 문이 없어진 이유: Goto 문은 재귀 호출, 구조적 분해라는 과정을 방해하는 요소
모든 프로그램은 순차 분기 반복이라는 구조로 만들 수 있다. =>프로그램에서도 유클리드 계층 구조 를 만들 수 있다.
객체 지향 프로그래밍
객체 지향의 3가지 키워드 : 캡슐화, 상속, 다형성
자바와 C# 은 헤더와 구현체 분리하는 방식을 버렸고 코드상에 어떤 멤버변수가 있는지 알게됨으로서 캡슐화이 가치가 일정 훼손되었다.
자바와 C# 에서의 상속은 C++에서도 눈속임으로 가능한 방법이었다.
다형성이라는 것도 결국은 포인터를 응용한 것이다.
객체 지향 언어가 만든 완전히 새로운 개념은 없다. 다만 더 안전하고 편리하게 사용할 수 있도록 도와준 것이다.
다형성을 이용하면 소스 코드의 의존성을 역전 시킬 수 있다.
다형성을 활용해서 구현할 수 있는 대표적인 아키텍쳐가 플러그인 아키텍쳐이다.
함수형 지향 프로그래밍
함수형 프로그래밍의 매력은 락을 없앨 수 있다는 점
함수형 프로그래밍은 순수 함수, 불변성이 지켜져야 한다.
순수 함수, 불변성으로 모든 코드를 짤 수 있는가에 대한 질문은 대체적으로 긍정적이나 리소스가 무한정하다는 전제하에 가능한 이야기다.
그러므로 불편성은 타협해야하는 여지가 있고 가변성과 불변성은 분리되어야한다.
가변 데이터를 사용하지 않고 트랜잭션만을 저장하는 방식의 프로그래밍도 생각해볼 수 있다. 이런 경우 CRUD 가아닌 오로지 CR만 한다. 대표적인 예로 깃허브가 그렇다.
SOLID
SRP 액터가 다를 경우 의존하는 코드는 분리하라.
OCP 시스템 확장은 쉽고 변경이 미치는 영향은 줄여라.
LSP 인터페이스가 치환 가능해야한다.
ISP 인터페이스를 분리하라
DIP 의존성이 추상에만 의존하면 구체에는 의존하지 않도록한다. 자바와 같은 정적 타입 언어에서 import 는 오로지 인터페이스, 추상 클래스만 해야된다. => 다소 비현실적이므로 변동성이 큰 구체에 의존하는 것을 피해라 정도로 받아드려라.
DIP
- 변동성이 큰 구체 클래스를 참조 하지마라
- 변동성이 큰 구체 클래스를 상속 하지마라
- 구체 클래스를 오버라이드 하지마라
대다수의 경우 유지보수가 재사용성 보다 우선된다.
단독으로 개별 클래스가 재사용되는 경우는 거의 없다.