General 썸네일형 리스트형 [클린 코드] 12장 창발성 창발성이란 하위계층(구성 요소)에는 없는 특성이나 행동이 상위계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상을 말한다. 영어로는 '불시에 솟아나는 특성'(emergent property) 또는 이머전스(emergence)라고 한다. 창발적 설계로 깔끔한 코드를 구현하자 켄트 벡은 다음 규칙을 따르면 설계가 단순하다고 말한다. 켄트 백이 제시한 이 단순한 설계 규칙 4가지가 소프트웨어 설계 품질을 크게 높여줄 수 있다. 모든 테스트를 실행한다. 중복을 없앤다. 프로그래머 의도를 표현한다. 클래스와 메서드 수를 최소로 줄인다. 단순한 설계규칙 1: 모든 테스트를 실행하라 테스트가 가능한 시스템을 만들려고 애쓰면, 설계 품질이 더불어 높아진다. 크기가 작고 목적 하나만 수행하는 클래스가 나온다. SRP를.. 더보기 [클린 코드] 11장 시스템 Complexity kills. Complexity sucks the life out of users, developers and IT. Complexity makes products difficult to plan, build, test and use. Complexity introduces security challenges. Complexity causes administrator frustration. - Ray Ozzie, 마이크로소프트 CTO 도시를 세운다면? 소프트웨어 팀을 구성하는 것은 도시를 구성하는 것과 비슷하다. 도시는 수도관리팀, 전력관리팀, 교통관리팀, 치안관리팀, 건축물관리팀 등 각 분야를 담당하는 팀이 있어 잘 돌아간다. 도시에는 큰 그림을 그리는 사람들도 있고, 작은 사항에 .. 더보기 [클린 코드] 10장 클래스 클래스 체계 클래스를 정의하는 표준 자바 관례에 따르면, 추상화 단계가 순차적으로 내려간다. 그래서 프로그램은 뉴스 기사처럼 읽힌다. 일반적인 순서 변수 목록: static public 상수 -> static private 변수 -> private instance 변수 -> (드물게) public 변수 함수 목록: public 함수 -> private 함수(자신을 호출하는 public 함수 직후에) 캡슐화 변수와 유틸리티 함수는 공개하지 않는 편이 낫다. 테스트 코드가 함수를 호출해하거나 변수를 사용해야한다면 protected로 선언하거나 패키지 전체에 공개할 수는 있겠다. 그러나 그것은 최후의 수단이 되어야한다. 클래스는 작아야 한다! 함수에서 물리적인 행 수로 크기를 작게 유지했다면, 클래스에서는 클.. 더보기 [클린 코드] 9장 단위 테스트 TDD 법칙 세 가지 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 깨끗한 코드 유지하기 테스트 코드에도 실제 코드 못지 않게 높은 품질 기준을 적용해야 한다. 실제 코드가 진화하면 테스트 코드도 변해야한다. 그런데 테스트 코드가 지저분하다면 변경이 어려워지고, 실제 코드를 짜는 시간보다 테스트 케이스를 변경하는 시간이 더 걸리게 될 수도 있다. 결국 테스트 스위트를 폐기하지 않으면 안되는 상황에 처한다. 깨끗한 테스트 코드 깨끗한 테스트 코드를 만들려면 '가독성'이 필요하다. 가독성을 높이려면 명료성, 단순성, 풍부한 표현력이 필요하다. 테스트.. 더보기 [클린 코드] 8장 경계 시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다. 때로는 사내 다른 팀이 제공하는 컴포넌트를 사용한다. 이 장에서 이러한 외부 코드(Third-Party Code)를 우리 코드에 깔끔하게 통합할 수 있도록, 소프트웨어 경계(Software Boundaries)를 깔끔하게 처리하는 기법을 살펴본다. 외부코드를 사용하는 것 인터페이스 제공자-사용자 간에는 특유의 텐션이 있다. 이런 텐션으로 시스템 경계에서 문제가 생길 소지가 많다. 인터페이스 제공자 적용성을 최대한 넓히려 애쓴다. 더 많은 환경에서 돌아가야 더 많은 고객이 구매하니까. 다양한 인터페이스로 수많은 기능을 제공한다. 유용하지만 그만큼 위험도 크다. 사용자가 필요하지 않은 기능까지 제공한다. 인터페이스 사용자 자신의 요구에 집중하.. 더보기 [클린 코드] 7장 오류 처리 흩어진 오류 처리 코드는 실제 코드가 하는 일을 파악하기 어렵게 한다는 점에서, 오류 처리는 클린 코드와 밀접하게 연관이 있다. 오류 코드보다 예외를 사용하라 오류가 발생하면 예외를 던지는 편이 낫다. 함수를 호출한 즉시 오류를 확인하는 방법은 오류 확인 단계를 잊어버릴 확률이 높다. 반면 예외를 던지면 로직과 오류처리 코드를 분리할 수 있어 호출자 코드도 더 깔끔해진다. // ❌ class DeviceController { sendShutDown(): void { const handle: DeviceHandle = getHandle(DEV1); // 디바이스 상태를 점검한다. if (handle !== DeviceHandle.INVALID) { // 레코드 필드에 디바이스 상태를 저장한다. retrie.. 더보기 [클린 코드] 6장 객체 vs 데이터구조 자료 추상화 자료를 세세하게 공개하기 보다는, 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 조회/설정 함수만으로는 추상화가 이루어지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다. // ❌ public class Point { public x: number; public y: number; } // ✅ public interface Point { getX(): number; getY(): number; setCartesian(x: number, y: number): void; getR(): number; getTheta(): number; setPolar(r: number, theta: n.. 더보기 [클린 코드] 5장 포맷 맞추기 코드가 마치 술 취한 무리가 짜놓은 듯 어수선해 보인다면, 독자들은 프로젝트의 다른 측면도 똑같이 무성의한 태도로 처리했으리라 생각할 것이다. 프로그래머라면 코드의 포맷을 깔끔하게 맞춰 코드를 작성할 의무가 있다. 포맷에 대한 간단한 규칙을 정하고, 그 규칙들을 착실하게 따라야한다. 필요하다면 규칙을 자동으로 적용하는 도구를 활용한다. 포맷을 맞추는 목적 전문 개발자가 1차 의무는 '돌아가는 코드'를 작성하는 것이 아닌, '의사소통'을 하는 것이다. 포맷을 맞추는 목적은 이 '의사소통'을 원활하게 하는 데 있다. 세로 형식 맞추기 일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다. 500줄을 넘지 않고 주로 200줄 정도인 파일로도 대규모 시스템을 구축할 수 있다. 뉴스 기사처럼 작성하라 잘 작성된 뉴.. 더보기 이전 1 2 3 4 5 다음