로버트 C. 마틴의 클린코드 책을 정리했고, 일부 예제 코드들을 typescript로 고쳐서 정리하였다. 창발(emergence) 또는 떠오름 현상은 하위 계층에는 없는 특성이나 행동이 상위 계층에서 자발적으로 돌연히 출현하는 현상이다. 컨트 벡이 제시한 단순한 설계 규칙 네 가지 (중요도 순) 모든 테스트를 실행한다. 중복을 없앤다. 프로그래머의 의도를 표현한다. 클래스와 메서드 수를 최소로 줄인다. 단순한 설계 규칙 1 : 모든 테스트를 실행하라 무억보다 중요한 것은 의도한 대로 돌아가는 시스템을 내놓는 것. 테스트를 철저히 거쳐 모든 테스트 케이스를 항상 통과하는 시스템은 테스트가 가능한 시스템이다. 테스트가 불가능한 시스템은 검증도 불가능하다. 테스트가 쉬운 시스템을 만드려고 하면 설계 품질이 더..
로버트 C. 마틴의 클린코드 책을 정리했고, 일부 예제 코드들을 typescript로 고쳐서 정리하였다. 깨끗한 코드를 구현하면 낮은 추상화 수준에서 관심사를 분리하기 쉬워진다. 높은 추상화 수준(시스템) 수준에서도 깨끗함을 유지하는 방법을 살펴보자. 시스템 제작과 시스템 사용을 분리하라 제작construction은 사용use과 다르다. 소프트웨어 시스템은 애플리케이션 객체를 제작하고 의존성을 서로 연결하는 준비 과정(제작)과 준비 과정 이후에 이어지는 런타임 로직(사용)을 분리해야 한다. 관심사 분리는 가장 오래되고 가장 중요한 설계 기법 중 하나다. function getService(): Service { if (this.service === null) { this.service = new MySe..
로버트 C. 마틴의 클린코드 책을 정리했고, 일부 예제 코드들을 typescript로 고쳐서 정리하였다. 코드의 표현력, 그 코드로 이루어진 함수에 신경써야 하지만 더 높은 차원까지 신경쓰지 않으면 깨끗한 코드를 얻기는 어렵다. 클래스 체계 자바의 경우, 표준 관례에서는 - 변수 목록이 먼저 나온다. static public 변수 -> static private 변수 -> 비공개 인스턴스 변수 - public 함수 -> private 함수 (자신을 호출하는 공개 함수 직후에 넣는다. 추상화 단계가 순차적) 캡슐화 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 내부에 감추어 은닉한다. 가능한 공개하지 않는 편이 낫지만, protected로 선언하..
로버트 C. 마틴의 클린코드 책을 정리했고, 일부 예제 코드들을 typescript로 고쳐서 정리하였다. 시스템에 들어가는 소프트웨어를 직접 개발하는 경우는 드물다. 대부분 패키지, 컴포넌트들을 이용하므로 외부 코드와 시스템 코드의 소프트웨어 경계를 깔끔하게 처리하는 것이 정말 중요하다. 외부 코드 사용하기 인터페이스 제공자는 적용성을 최대한 넓히려 애쓴다. 반면 사용자는 자신의 요구에 집중하는 인터페이스를 원한다. 이런 긴장으로 인해 시스템 경계에 문제가 생길 소지가 많다. 예를 들어 Map 객체에 대해 생각해보자. 프로그램에서 Map을 만들어 이곳저곳에 넘길 때, 넘기는 쪽에서는 아무도 그 내용을 삭제하지 않을 거라 생각할 수 있다. 그러나, Map 메서드를 살펴보면 가장 위에있는 메서드가 Map.p..
로버트 C. 마틴의 클린코드 책을 정리했고, 일부 예제 코드들을 typescript로 고쳐서 정리하였다. 깨끗한 코드와 오류처리? 상당수 코드 기반이 오류 처리 코드에 좌우된다. 오류 처리 코드가 여기저기 흩어져있다면 프로그램 논리를 이해하기 어려워진다. 클린 코드를 위해서는 우아하고 고상하게 오류를 처리해야한다. 오류 코드보다는 예외(Exception)을 사용하라. class DeviceController { sendShutdown(): void { const handle: DeviceHandle = getHandle(DEV1); // 디바이스 상태 점검 if (handle !== DeviceHandle.INVALID) { // 레코드 필드에 디바이스 상태를 저장한다. retrieveDeviceReco..
로버트 C. 마틴의 클린코드 책을 정리했고, 일부 예제 코드들을 typescript로 고쳐서 정리하였다. 자료 추상화 구체적인 Point 클래스 class Point { x: number; y: number; } 추상적인 Point 클래스 - 직교 좌표계를 사용한다. - 개별적으로 좌표값을 읽고 설정하도록 강제한다. - 구현을 노출한다. private변수라도 개별 getter, setter가 있다면 구현을 외부로 노출하는 것과 같다. interface Point { getX(): number; getY(): number; setCartesian(x: number, y: number): void; getTheta(): number; getR(): number; setPolar(r: number, theta..