Reading/Clean Architecture

2부 - 패러다임의 개요

데이25 2020. 7. 30. 22:02

구조적 프로그래밍

기능적 분해 . 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있다.

 

객체지향 프로그래밍

  • 캡슐화

    데이터와 함수가 응집력 있게 구성된 집단을 서로 구분 짓는 선을 그을 수 있다.

    구분선 밖에선 데이터는 은닉되고, 일부 함수만이 외부에 노출된다.

    →그러나, OO 언어는 오히려 C가 표현했던 완전한 캡슐화를 약화시켰다. ( 사용자가 멤버변수의 존재를 알게 된다. )

  • 상속

    어떤 변수와 함수를 하나의 유효범위로 묶어서 재정의 하는 일이다.

    → OO 언어가 고안 되기 전부터 상속과 유사한 기법이 사용되었다.

    OO언어가 완전히 새로운 개념을 만들지는 못했지만 데이터 구조에 가면씌우는 일에 편리한 방식을 제공했다.

  • 다형성

1.함수를 가리키는 포인터 응용한 것이 다형성이다. 

→ OO로 다형성을 새로 구현한게 쉽게만들어 준 것이다.

→ 쉽게 만든 부분 : 원래 C에서 관례 ( 포인터 초기화 해야한다. ) 을 완화시켜주었다.

 

2. 장치적 의존성을 없애주었다. 프로그램이 각각의 장치들에서 장치들에 대해서도 동일하게 해야한다는 의존성을 제거 해 주었다. 

ex) 드라이버가 새로 복사 프로그램을 Plugin 하는 것과 같다. (이미 있는 복사프로그램 안만든다.)

 

Plugin Architecture : 의존성을 없앤다.

  • OO가 있기 전 : 의존성은 제어흐름에 따라 결정된다. 제어흐름은 시스템의 흐름에 의해 그리고 소스코드 의존성은 제어흐름으로 결정된다.

  • OO가 있은 후 : 소스의 의존성을 인터페이스 추가를 통해 "의존성 역전"과정을 거친다. \

    → OO 언어는 소스코드 의존성 전부에 대해 방향 결정이 가능하다.

    소사 코드의 의존성을 원하는 방향으로 바꾼다.

3. 배포 독립성을 실행 할 수 있다. 

→ 개발 독립성을 보장해준다.

다형성을 이용해 시스템의 모든 소스코드 의존성에 대한 절대적인 제어 권한을 획득하는 능력

 

함수형 프로그래밍

** 다음 아키텍쳐 문제들 → 가변 변수 때문에 하게 된다.

  1. 경합 : 데이터 갱신 시 발 생
  2. 교착상태 : 데드락
  3. 동시 업데이트 : 데이터 갱신시

이러한 문제들은 불변성을 보장해야 한다.

이는 가능한 것이나 자원이 무한한 경우, 즉, 저장공간이 한없이 크고 속도가 빠른 경우에만 가능하다. (단순한 불변을 무한 반복하는 방식으로 가능하다. )

  • 불변 컴포넌트와 가변 컴포넌트를 나눈다.

    → 상태변경 : 컴포넌트 동시성 문제를 발생시킨다.

    → 트랜잭션 메모리 같은 실천법을 사용해서 동시업뎃 경합 조건으로 부터 가변 변수를 보호한다.

  • 변수를 변경하려는 컴포넌트를 분리해야한다.

  • 가능한 많은 불변 컴포넌트와 가능한 적은 가변 컴포넌트로 구성 해야한다.

  • 이벤트 소싱 방식으로도 구현이 가능하다.

    → 상태가 아닌 트랜 젝션을 저장한다. 상태가 필요한 경우에 시작점부터 모든 트랜젝션을 처리하는 방식이다.