클린아키텍쳐 2부 3~4장
클린아키텍쳐 2부 3장 패러다임
구조적 프로그래밍
- 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
- 최초로 적용된 패러다임이다.
객체 지향 프로그래밍
- 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
- 알골언어의 함수 호출 스택 프레임을 힙으로 옮기면 함수 호출이 반환된 후에도 함수 내에 선언된 지역 변수가 오랫동안 유지될 수 있음을 발견했다.
- 이 함수가 클래스의 생성자가 되었고, 지역변수는 인스턴스 변수, 그리고 중첩함수는 메서드가 되었다.
함수형 프로그래밍
- 할당문에 대해 규칙을 부과한다.
- 함수형 프로그래밍은 컴퓨터 프로그래밍 자체보다 먼저 등장했다.
정리
- 패러다임은 무엇을 하면 안 되는 지를 알려준다.
- 아키텍쳐의 경계를 넘나들기 위한 메커니즘으로 다형성을 이용한다.
- 우리는 함수형 프로그래밍을 이용하여 데이터의 위치와 접근 방법에 대한 규칙을 부과한다.
- 우리는 모듈 기반의 알고리즘으로 구조적 프로그래밍을 사용한다.
- 세가지 패러다임과 아키텍쳐의 함수, 컴포넌트 분리, 데이터관리가 어떻게 연관되는지를 주목하자.
클린아키텍쳐 2부 4장 구조적 프로그래밍
증명
다익스트라가 초기에 인식한 문제
- 프로그래밍은 어려우며 프로그래머는 프로그래밍을 잘 하지 못한다.
- 프로그램은 너무 많은 세부사항을 담고 있고, 작은 세부사항이라도 간과하게 된다면 예상 외의 방식으로 실패하게 된다.
수학적인 원리인 증명을 통해 이런 문제를 해결하고자 했다.
- 수학에서의 유클리드 계층 구조를 프로그래머도 사용할 수 있을 것이라고 믿었다.
- 다익스트라는 공리,정리,다름정리,보조정리로 구성되는 유클리드 계층 구조를 만드려고 했다.
- 프로그래머는 입증된 구조를 통해 구조를 코드와 결합하고 코드가 올바르다는 것을 스스로 증명하게 되는 방식을 기대했다.
기능적 분해
-
"goto 문의 해로움" 으로 편지를 써서 세 가지 제어 구조에 대한 자신의 의견을 피력했다.
-
이 논쟁이 10년 이상 지속되었지만.. 컴퓨터 언어가 진화하면서 goto 문장은 밀려나고 구조적 프로그래밍이 자리잡게 되었다.
-
구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있게 되었다.
-
이는 결국 모듈을 기능적으로 분해할 수 있음을 뜻한다.
거대한 문제 기술서 - > 고수준의 기능들 - > 저수준의 함수들 - > 구조적 프로그래밍의 제어 구조로 표현 가능
테스트
-
버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다
-
프로그램이 잘못되었음을 테스트를 통해 증명할 수는 있지만, 프로그램이 맞다고 증명할 수는 없다.
-
테스트에 충분한 노력을 들였다면 테스트가 보장할 수 있는 것은 프로그램이 목표에 부합할 만큼은 충분히 참이라고 여길 수 있게 해주는 것이 전부다.
정리
- 구조적 프로그램의 가치는 반증 가능한 단위를 만들 수 있는 능력이다.
- 소프트웨어는 과학과 같고, 따라서 반증 가능성에 의해 주도된다.
- 소프트웨어 아키텍트는 모듈, 컴포넌트, 서비스가 쉽게 반증 가능하도록 만들기 위해 분주히 노력해야 한다.