세가지 프로그래밍 패러다임은 프로그래머에게서 권한을 박탈한다.
프로그램은 순차, 분기, 반복, 참고로 구성된다.
구조적 프로그래밍 → 함수
•
구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
◦
goto 문의 무분별한 흐름 이동 X
•
go to문 → if/then/else 또는 do/while/until 같은 구조로 대체
•
모듈을 더 작은 모듈로 나누는데 goto문은 문제를 일으킴 → 유클리드 계층 구조로 분리 불가능
•
현대의 언어는 goto 문이 거의 사라짐 (java의 break나 예외처리가 goto랑 비슷할 수는 있지만 제약이 있다는 점이 다름. 이전은 굉장히 자유롭게 흐름이동이 가능했음)
•
구조적 프로그래밍을 통해 기능을 더 작은 기능으로 끊임없이 분해 가능
•
객체 지향 프로그래밍 → 컴포넌트 분리
•
객체 지향 프로그래밍은 제어 흐름의 간접적인 전환에 대해 규칙을 부과한다.
•
함수 호출 스택 프레임을 힙으로 옮기면 함수 호출이 반환된 이후(함수가 종료된 이후)에도 지역 변수가 오랫동안 유지될 수 있음 → 클래스의 생성자
•
지역 변수 → 인스턴스 변수, 중첩 함수 → 메서드
•
함수 포인터 특정 규칙에 따라 사용하는 과정을 통해 → 다형성이 등장
•
캡슐화
◦
데이터가 은닉되고 일부 함수를 통해 이를 사용할 수 있다
◦
C++에서 클래스를 헤더 파일에 선언할 것이 요구됨(c++ 컴파일러는 클래스의 인스턴스 크기를 알 수 있어야 함.) → 사용자가 헤더파일에서 클래스 내부의 데이터를 확인할 수 있으므로 은닉성이 깨짐
•
상속
◦
원래도 c로 상속 비슷하게 흉내내며 살고 있음. 하지만 c++과 자바에서 휠씬 자유롭게 사용가능.
•
다향성
◦
하나의 객체가 여러가지 타입을 가질 수 있음
◦
의존성 역전 : 저수준 함수가 고수준 함수를 호출가능
◦
다형성을 안전하고 편리하게 제공한다 → 소스 코드 의존성을 어디에서든 역전시킬 수 있다
◦
소스 코드 의존성을 원하는 방향으로 설정 가능
◦
배포 독립성 : 코드 변경이 된 컴포넌트만 다시 배포할 수 있음
◦
개발 독립성 : 서로 다른 팀에서 각 모듈을 독립적으로 개발 가능
◦
저수준의 세부사항 모듈 → 중요도가 낮은 플로그인 모듈, 고수준의 정책을 포함한 모듈 → 독립적으로 개발 배포
함수형 프로그래밍 → 데이터 관리
•
함수형 프로그래밍은 할당문에 대해 규칙을 부과한다.
•
람다 계산법의 영향을 받아 만들어짐
◦
불변성 : 심볼의 값이 변경되지 않는다는 개념 → 함수형 언어에는 할당문이 전혀 없다는 뜻
•
자바에서는 가변 변수(프로그램 실행 중 상태가 변할 수 있음)를 사용
for (int i = 0; i < 5; ++i) <- i가 가변 변수
C++
복사
but 함수형은 변수가 변경되지 않음!
•
경합(rare)조건, 교착상태(deadlock)조건, 동시 업데이트(concurrent update) 문제는 가변 변수로 인해 발생
•
다수의 스레드와 프로세스를 사용하는 애플리케이션에서 마주치는 모든 문제는 가변 변수가 없다면 존재하지 않는다.
•
저장 공간이 무한하고 프로세서의 속도가 무한히 빠르면 불변성이 실현 가능하다.
•
가변 컴포넌트와 불변 컴포넌트(순수하게 함수형 방식, 어떠한 가변 변수도 불허)로 분리
•
트랜잭션 메모리와 같은 실천법을 사용하여 동시 업데이트와 경합 조건 문제로부터 가변 변수 보호
•
이벤트 소싱 : 상태가 아닌 트랜젝션을 저장하자는 전략
•
결론적으로 프로그램은 CRUD가 아니라 CR만 수행 like 코드 버전 관리 툴