목록clean architecture (8)
블로그명..?

REP(Reuse/Release Equivalence Principle) - 재서용/릴리스 등가 원칙 CCP(Common Closure Principle) - 공통 폐쇄 원칙 CRP(Common Reuse Principle) - 공통 재사용 원칙 REP: 재사용/릴리스 등가 원칙 재사용 단위는 릴리스 단위와 같다. 소프트웨어 컴포넌트가 릴리스 절차를 통해 추적 관리되지 않거나 릴리스 번호가 부여되지 않는다면 해당 컴포넌트를 재사용하고 싶어도 할 수도 없고, 하지도 않을 것이다. 릴리스 번호를 통해 재사용 컴포넌트들이 서로 호환되는지 알 수 있다. 개발자들은 릴리스 변경사항을 살펴보고 이를 적용할지 결정할 수 있다. 이 원칙은 소프트웨어 설계와 아키텍처 관점에서 보면 단일 컴포넌트는 응집성 높은 클래스와 ..

SOLID 원칙이 벽과 방에 벽돌을 배치하는 방법을 알려준다면, 컴포넌트 원칙은 빌딩에 방을 배치하는 방법을 설명해준다. 큰 빌딩과 마찬가지로 대규모 소프트웨어 시스템은 작은 컴포넌트들로 만들어진다. 컴포넌트는 배포 단위다. 컴포넌트는 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위다. 예시) 자바 - jar 루비 - gem 닷넷 - DLL 여러 컴포넌트를 서로 링크하여 실행 가능한 단일 파일로 생성할 수 있다. 또는 여러 컴포넌트를 서로 묶어서 .war 파일과 같은 단일 아카이브로 만들 수도 있다. 또는 컴포넌트 각각을 .jar나 .dll 같이 동적으로 로드할 수 있는 플러그인이나 .exe 파일로 만들어서 독립적으로 배포할 수도 있다. 잘 설계된 컴포넌트는 반드시 독립적으로 배포 가능한, 따라서 ..

개방-폐쇄 원칙(OCP)라는 용어는 1988년에 버트란트 마이어가 만들었는데, 다음과 같다. 소프트웨어 개체는 확장에는 열려 있어야하고, 변경에는 닫혀 있어야 한다. 이는 소프트웨어 개체의 행위는 확장할 수 있어야 하지만, 이때 개체를 변경해서는 안 된다는 뜻이다. 만약 요구사항을 확장하는 데 소프트웨어를 많이 수정해야 한다면, 그 소프트웨어 시스템을 설계한 아키텍트는 엄청난 실패를 한 것이다. 사고 실험 재무제표를 웹 페이지로 보여주는 시스템이 있다고 생각해보자. 웹 페이지에 표시되는 데이터는 스크롤할 수 있으며, 음수는 빨간색으로 출력한다. 이것을 이해관계자가 보고서 형태로 변환해서 흑백 프린터로 출력해 달라고 요청했다고 해보자. 바뀌는 부분 데이터 : 재무 데이터 -> 보고서용 재무 데이터 출력 방..

SOLID 원칙 중에서 그 의미가 가장 잘 전달되지 못한 원칙은 바로 단일 책임 원칙이다. -> 모든 모듈이 단 하나의 일만 해야 한다는 의미가 아니다. 단 하나의 일만 해야 한다는 원칙은 따로 있다. 바로 함수는 반드시 하나의, 단 하나의 일만 해야 한다는 원칙이다. 이 원칙은 커다란 함수를 작은 함수들로 리팩토링 하는 더 저수준에서 사용된다. 이 원칙은 SOLID 원칙이 아니며, SRP도 아니다. SRP는 다음과 같이 기술되어 왔다. 단일 모듈은 변경의 이유가 하나, 오직 하나뿐이어야 한다. 소프트웨어 시스템은 사용자와 이해관계자를 만족시키기 위해 변경된다. SRP가 말하는 '변경의 이유'란 바로 이들 사용자와 이해관계자를 가리킨다. 이 원칙은 아래와 같이 바꿔 말할 수도 있다. 하나의 모듈은 하나의..

함수형 프로그래밍이라는 개념은 프로그래밍그 자체보다 앞서 등장했다. 이 패러다임에서 핵심이 되는 기반은 람다 계산법으로 알론조 처치가 1930년대에 발명했다. 아래는 25까지의 정수의 제곱을 출력하는 자바 언어의 예시이다. public class Squint { public static void main(String args[]) { for (int i=0; i ex) range 함수 호출 : (range) 표현식 (fn [x] (* x x)) 는 익명 함수로, 곱셈 함수를 호출하면서 입력 인자를 두 번 전달한다. (입력의 제곱을 계산한다.) 전체 코드를 다시 해석해보자. range 함수는 0부터 시작해서 끝이 없는 정수 리스트를 반환한다. 반환된 정수 리스트는 map 함수로 전달되고, 각 정수에 대해 ..

OO란 무엇인가? 데이터와 함수의 조합? 이는 터무니없는 말이다. o.f() f(o)와 다르다는 의미를 내포하기 때문이다. 실제 세계를 모델링하는 새로운 방법? 이는 얼버무리는 수준에 지나지 않는다. 의도가 불분명하며, 그 정의가 너무 모호하다. 캡슐화, 상속, 다형성? OO(Obejct-Oreiented)가 이 세 가지 개념을 적절하게 조합한 것이거나, 또는 최소한 세 가지 요소를 반드시 지원해야 한다고 말한다. 이 세 가지 개념에 대해 살펴보자. 캡슐화? OO를 정의하는 요소 중 하나로 캡슐화를 언급하는 이유는 데이터와 함수를 쉽교 효율적으로 캡슐화하는 방법을 OO언어가 제공하기 때문이다. 데이터와 함수가 응집력 있게 구정된 집단을 서로 구분 짓는 선을 그을 수 있다. 구분선 바깥에서 데이터는 은닉되..
구조적 프로그래밍 최초로 적용된 패러다임(최초로 만들어진 패러다임은 아니다) 1968년 에츠허르 비버 데이크스트라가 발견 데이크스트라는 무분별한 점프(goto 문장)는 프로그램 구조에 해롭다는 사실을 제시 데이크스트라는 점프들을 if/then/else와 do/while/untill과 같이 더 익숙한 구조로 대체했다. 구조적 프로그래밍은 제어흐름 직접적인 전환에 대해 규칙을 부과한다. 객체 지향 프로그래밍 1966년, 올레 요한 달과 크리스텐 니가드에 의해 등장 ALGOL언어의 함수 호출 스택 프레임을 힙(Heap)으로 옮기면, 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오랫동안 유지될 수 있었음을 발견 이러한 함수가 클래스의 생성자가 되었고, 지역 변수는 인스턴스 변수, 중첩 함수는 메서드..

모든 소프트웨어 시스템은 이해관계자에게 서로 다른 두 가지 가치를 제공하는데, 행위(behavior)와 구조(structure)가 바로 그것이다. 소프트웨어 개발자는 두 가지를 모두 반드시 높게 유지해야 하는 책임을 진다. 행위 소프트웨어의 첫 번째 가치를 바로 행위(behavior)다. 프로그래머를 고용하는 이유는 이해관계자를 위해 기계가 수익을 창출하거나 비용을 절약하도록 만들기 위해서다. 그리고 이해관계자의 기계가 이러한 요구사항을 만족하도록 코드를 작성한다. 그리고 기계가 이러한 요구사항을 위반하면, 프로그래머는 디버거를 열고 문제를 고친다. 많은 프로그래머가 이러한 활동이 자신이 해야 할 일의 전부라고 생각한다. 이들은 요구사항을 기계에 구현하고 버그를 수정하는 일이 자신의 직업이라고 믿는다. ..