반응형

cleancode 13

[클린코드(CleanCode)] 13장 동시성

개요이 장에서는 여러 스레드를 동시에 돌리는 이유를 논한다.여러 스레드를 동시에 돌리는 어려움도 논한다.이런 어려움에 대처하고 깨끗한 코드를 작성하는 방법도 몇 가지 제안한다.마지막으로, 동시성을 테스트하는 방법과 문제점을 논한다.동시성이 필요한 이유?동시성은 결합을 없애는 전략이다. 즉, 무엇과 언제를 분리하는 전략이다. 스레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다.그래서 호출 스택을 살펴보면 프로그램 상태가 곧바로 드러난다.흔히 단일 스레드 프로그램은 정지점(breakpoint)을 정한 후 어느 정지점인지 살펴보면서 시스템 상태를 파악한다.무엇과 언제를 분리하면 애플리케이션 구조와 효율이 극적으로 나아진다.구조적인 관점에서 프로그램은 거대한 루프 하나가 아니라 작은 협력 프로그램 여럿으로 ..

[클린코드(CleanCode)] 12장 창발성

프로그래밍에서 창발성이란, 단순한 요소들이 결합하여 복잡한 결과를 나타내는 것을 의미창발적 설계로 깔끔한 코드를 구현하자켄트 벡은 다음 규칙을 따르면 설계는 '단순하다'라고 말한다.모든 테스트를 실행한다.중복을 없앤다.프로그래머 의도를 표현한다.클래스와 메서드 수를 최소로 줄인다.네 가지 규칙을 따르면 우수한 설계가 나오고, 코드 구조와 설계를 파악하기 쉬워지고, SRP 나 DIP 와 같은 원칙을 적용하기 쉬워지며, 우수한 설계의 창발성을 촉진한다.단순한 설계 규칙1: 모든 테스트를 실행하라설계는 의도한 대로 돌아가는 시스템을 내놓아야 한다.시스템이 의도한 대로 돌아가는지 검증할 간단한 방법이 있어야 한다. 시스템은 모든 테스트 케이스를 통과해야 한다.이런 시스템은 '테스트가 가능한 시스템'이다. 테스트..

[클린코드(CleanCode)] 11장 시스템

개요“복잡성은 죽음이다. 개발에게서 생기를 앗아가며, 제품을 계획하고 기획하고제작하고 테스트하기 어렵게 만든다.” - 레이오지, 마이크로소프트 최고 기술 책임자도시를 세운다면?도시를 혼자서 건설하고 관리하는 건 불가능할 것이다.도시가 잘 돌아가는 이유는 수도 관리팀, 전력 관리팀 등 각 분야를 관리하는 팀이 있기 때문이다. 도시가 잘 돌아가는 또 다른 이유는 적절한 추상화와 모듈화 때문이다.그래서 큰 그림을 이해하지 못할지라도 개인과 개인이 관리하는 '구성요소'는 효율적으로 돌아간다. 소프트웨어 또한 이와 비슷한데 도시만큼이나 추상화를 이루어내지 못하는 경우가 많다.이번 장에서는 높은 추상화 수준, 즉 시스템 수준에서도 깨끗함을 유지하는 방법을 살펴본다.시스템 제작과 시스템 사용을 분리하라우선 제작과 사..

[클린코드(CleanCode)] 10장 클래스

개요지금까지 코드 행, 코드 블록, 함수 구현 방법과 함수 간의 관련 맺는 방식을 공부했다.하지만 좀 더 차원 높은 단계까지 신경 쓰지 않으면 코드를 얻기는 어렵다.이 장에서는 깨끗한 클래스를 다룬다.클래스 체계클래스를 정의하는 표준 자바 관례에 따르면 가장 먼저 변수 목록이 나온다. static public 상수 => static private 변수 => private 인스턴스 변수 이렇게 나온다.public 변수는 필요한 경우가 거의 없다.변수 목록 다음에는 공개 함수가 나온다. 비공개 함수는 자신을 호출하는 공개 함수 직후에 나온다. 즉, 추상화 단계가 순차적으로 내려간다.그래서 프로그램은 신문 기사처럼 읽힌다. 캡슐화변수와 유틸리티 함수는 가능한 공개하지 않는 편이 낫지만 반드시 숨겨야 한다는 법..

[클린코드(CleanCode)] 9장 단위 테스트

용어 설명테스트 주도 개발(Test-driven development TDD)은 매우 짧은 개발 사이클을 반복하는 소프트웨어 개발 프로세스 중 하나이다. 개발자는 먼저 요구사항을 검증하는 자동화된 테스트 케이스를 작성한다. 그런 후에, 그 테스트 케이스를 통과하기 위한 최소한의 코드를 생성한다. 마지막으로 작성한 코드를 표준에 맞도록 리펙토링한다. - Wikipedia유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. 이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다.-..

[클린코드(CleanCode)] 8장 경계

개요시스템에 들어가는 모든 소프트웨어를 직접 개발하는 경우는 드물다.패키지, 오픈소스, 사내 다른 팀이 구현한 컴포넌트를 사용할 수 있다.이 외부 코드를 우리 코드에 깔끔하게 통합해야 한다.이 장에서는 소프트웨어 경계를 깔끔하게 처리하는 기법과 기교를 살펴본다.외부 코드 사용하기인터페이스 제공자(또는 프레임워크 제공자)는 적용성을 최대한 넓히려고 애쓴다.반면 사용자는 자신의 요구에 집중하는 인터페이스를 바란다.이 두 의견의 입장 차이로 인해 시스템 경계에서 문제가 생길 소지가 많다. java.utill.Map을 예시로 설명을 들어보자면Map은 다양한 인터페이스로 수많은 기능을 제공한다.Map이 제공하는 기능성과 유연성은 확실히 유용하지만 그만큼 위험도 크다.왜냐하면 Map이 제공하는 함수 중에 Map 내..

[클린코드(CleanCode)] 7장 오류 처리

개요깨끗한 코드를 다루는 책에서 오류 처리를 다루는 장이 있어 이상하게 여길 수 있지만오류 처리는 프로그램에 반드시 필요한 요소 중 하나일 뿐이다. 깨끗한 코드와 오류 처리는 확실히 연관성 있다.상당수 코드 기반은 전적으로 오류 처리 코드에 좌우된다.오류 처리 코드 때문에 길제 코드가 하는 일을 파악하기 불가능한 일이 발생하고프로그램 논리를 이해하기 어려워진다면 깨끗한 코드라 부르기 어렵다.오류 코드보다 예외를 사용하라public class DeviceController { ... DeviceHandle handle = getHandle(DEV1); if (handle != DeviceHandle.INVALID) { retrieveDeviceRecord(handle); if (record.getSta..

[클린코드(CleanCode)] 6장 객체와 자료 구조

개요변수를 비공개(private)로 정의하는 이유가 있다.남들이 변수에 의존하지 않게 만들고 싶어서다.충동이든 변덕이든, 변수 타입이나 구현을 맘대로 바꾸고 싶어서다.그렇다면 어째서 수많은 프로그래머가 조회(get) 함수와 설정(set) 함수를 당연하게 공개(public)하여 비공개 변수를 외부에 노출할까?자료 추상화아래 두 클래스 모두 2차원 점을 표현한다.그런데 한 클래스는 구현을 외부로 노출하고 다른 클래스는 구현을 완전히 숨긴다.public class Point { public double x; public double y;}public interface Point { double getX(); double getY(); void setCartesian(double x, double y)..

[클린코드(CleanCode)] 5장 형식 맞추기

개요독자들에게 주고 싶은 인상코드가 깔끔일관적꼼꼼하다고 감탄질서 정연하다고 탄복모듈을 읽으며 두 눈이 휘둥그레 놀람전문가가 짰다는 인상 심어줌프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다.코드 형식을 맞추기 위한 간단한 규칙을 정하고 그 규칙을 착실히 따라야 한다.팀으로 합의해 규칙을 정하고 모두가 그 규칙을 따라야 한다.필요하다면 규칙을 자동으로 적용하는 도구를 활용한다.형식을 맞추는 목적코드 형식은 중요하다.너무나 중요해서 무시하기 어렵고 너무나 중요해서 융통성 없이 맹목적으로 따르면 안 된다.코드 형식은 의사소통의 일환이고 의사소통은 전문 개발자의 일차적 의무다. 오늘 구현한 기능이 다음 버전에서 바뀔 확률은 아주 높다.그런데 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영..

[클린코드(CleanCode)] 4장 주석

개요잘 달린 주석은 그 어떤 정보보다 유용하다.하지만 부정확하고 근거 없는 주석은 코드를 이해하기 어렵게 만든다.오래되고 조잡한 주석은 거짓과 잘못된 정보를 퍼뜨려 해악을 미친다.우리가 프로그래밍 언어를 치밀하게 사용해 의도를 표현할 능력이 있다면, 주석은 거의 필요하지 않으리라. 코드만이 자기가 하는 일을 진실되게 말한다.코드만이 정확한 정보를 제공하는 유일한 출처다.그러므로 우리는 (간혹 필요할지라도) 주석을 가능한 줄이도록 꾸준히 노력해야 한다.주석은 나쁜 코드를 보완하지 못한다코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문이다. 표현력이 풍부하고 깔끔하며 주석이 거의 없는 코드가, 복잡하고 어수선하며 주석이 많이 달린 코드보다 훨씬 좋다. 자신이 저지른 난장판을 주석으로 설명하려 ..

[클린코드(CleanCode)] 3장 함수

작게 만들어라!함수를 만드는 첫째 규칙은 '작게!'다, 함수를 만드는 둘째 규칙은 '더 작게!'다.얼마나 짧아야 하는지에 대한 규칙은 없지만 아래처럼 짧은 게 좋다public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throws Exception { if (isTestPage(pageData)) { includeSetupAndTeardownPages(pageData, isSuite); } return pageData.getHtml();}블록 들여쓰기if 문 / else 문/ while 문 등에 들어가는 블록은 한 줄이어야 된다. 대게 함수를 호출하여 처리한다.바깥은 감싸..

[클린코드(CleanCode)] 2장 의미있는 이름

들어가면서소프트웨어에서 이름은 어디나 쓰이므로 이름 잘 지으면 여러모로 편해진다이 장에서는 이름을 잘 짓는 간단한 규칙 몇 가지 소개한다의도를 분명히 밝혀라의도가 분명하게 이름을 지어야 한다좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 많아진다그러므로, 이름을 주의 깊게 살펴 더 나은 이름이 떠오르면 개선하면 된다변수나 함수 클래스의 존재 이유, 수행 기능, 사용 방법에 대해 주석이 필요하다면 의도를 분명히 드러내지 못한 것이다int d; // 경과 시간(단위: 날짜)아래처럼 의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다int elapsedTimeInDays; // 날짜에서 잰 시간int daysSinceCreation; // 만들어진 이래로 며칠이 지났는가int..

[클린코드(CleanCode)] 1장 깨끗한 코드

개요이 책을 읽고 있다면 이유는 두 가지프로그래머라서더 나은 프로그래머가 되려고이 책은 좋은 프로그램 작성 요령을 설명하는 책읽고 나면 코드에 대해 많은 사실을 배울 수 있음좋은 코드와 나쁜 코드를 구분하는 능력도 생김좋은 코드를 작성하는 방법도 익힘나쁜 코드를 좋은 코드로 바꾸는 실력도 쌓임코드가 존재하리라코드가 자동으로 생성하는 시대가 왔다고 하지만 코드가 사라질 가망은 전혀 없음코드는 요구사항을 상세히 표현하는 수단이기 때문!어느 수준에 이르면 코드의 도움 없이 요구사항을 상세히 표현하고 추상화하는 것이 불가능기계가 실행할 정도로 상세하게 요구사항을 명시하는 작업, 바로 이것이 프로그래밍이며, 이렇게 명시한 결과가 코드임언어의 추상화 수준은 높아지고 특정 응용 분야에 적합한 프로그래밍 언어 수도 많..

728x90