book/Clean Code 7

[Clean Code] 8장, 경계

외부 코드 사용하기 패키지 제공자나 프레임워크 제공자는 적용성을 최대한 넓히려 애쓴다. 사용자는 자신의 요구에 집중하는 인터페이스를 바란다. java.util.Map Map은 다양한 인터페이스로 수많은 기능 제공. Map이 제공하는 기능성과 유연성은 유용하지만 그만큼 위험이 크다. 문제 1 : Map 사용자라면 누구나 Map 내용을 지울 권한이 있다 - clear() 문제 2 : Map은 객체 유형을 제한하지 않기에 사용자는 어떤 객체 유형도 추가할 수 있다. 개선이 필요한 예시 (문제 1, 문제 2 존재) Map이 반환하는 Objet를 올바른 유형으로 변환할 책임은 Map을 사용하는 클라이언트에 있다. clear() 함수를 이용해서 누구나 Map의 내용을 지울 수 있다. Map sensors = new..

book/Clean Code 2022.09.01

[Clean Code] 7장, 오류 코드

오류 처리는 중요하다. 상당수 코드 기반은 전적으로 오류 처리 코드에 좌우된다. 여기서 좌우된다는 표현은 코드 기반이 오류만 처리한다는 의미가 아니다. 여기저기 흩어진 오류 처리 코드 때문에 실제 코드가 하는 일을 파악하기가 거의 불가능하다는 의미이다. 오류 코드보다 예외를 사용하라 오류 플래그 설정, 혹은 호출자에게 오류 코드를 반환하는 방법 함수를 호출한 즉시 오류를 확인해야 함 → 호출자 코드가 복잡해짐. public class DeviceController { ... DeviceHandle handle = getHandle(DEV1); if (handle != DeviceHandle.INVALID) { retrieveDeviceRecord(handle); if (record.getStatus() ..

book/Clean Code 2022.08.31

[Clean Code] 6장, 객체와 자료구조

자료 추상화 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수만 공개하는 편이 좋다. 아무 생각 없이 get/set 함수를 추가하는 방법이 가장 나쁘다. 구체적인 Point 클래스 (구현을 외부로 노출) → 나쁜 케이스 내부 구조를 노출 (변수를 private로 설정하더라도 get,set 함수 제공시 구조가 외부로 노출) 개별적으로 좌표값을 읽고 설정하게 강제. public class Point { private double x; private double y; } 추상적인 Point 클래스 (구현을 완전히 숨김) → 좋은 케이스 클래스 메서드가 접근 정책을 강제. 좌표를 읽을 때는 각 값을 개별적으로 읽도록 강제 좌..

book/Clean Code 2022.08.30

[Clean Code] 5장, 형식 맞추기

형식을 맞추는 목적 코드 형식은 의사소통의 일환. 전문 개발자의 일차적인 의무 오늘 구현한 기능이 다음 버전에서 바뀔 확률은 아주 높다. 하지만 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 미친다. 적절한 행 길이를 유지하라 일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다. 신문 기사처럼 작성하라 소스 파일의 이름은 간단하면서도 설명이 가능하게 짓는다. 파일의 첫 부분은 고차원 개념과 알고리즘을 설명한다. 파일의 아래로 내려갈수록 의도를 세세하게 묘사한다. 파일의 마지막에는 가장 저차원 함수와 세부 내역이 나온다. 개념은 빈 행으로 분리하라 코드의 각 행은 수식이나 절을 나타내고, 일련의 행 묶음은 완결된 생각 하나를 표현한다. 생각 사이에는 빈 행을 넣어 분리한다. // 패키..

book/Clean Code 2022.08.29

[Clean Code] 4장, 주석

좋은 주석은 나쁜 코드를 보완하지 못한다 코드에 주석을 추가하는 일반적인 이유는 코드 품질이 나쁘기 때문. 주석으로 코드의 의미를 표현하기보다는 코드를 리팩터링 하자. 코드로 의도를 표현하라 코드를 깔끔하고 짜임새 있게 작성해서 주석을 달지 않는 것이 좋음. // 1. 개선 전 코드 + 주석 추가 // 직원에게 복지 혜택을 받을 자격이 있는지 검사한다. if ((employee.flags & HOURLY_FLAG) && (emplyee.age > 65)) // 2. 개선 후 코드 + 주석 삭제 if (employee.isEligibleForFullBenefits()) 좋은 주석 법적인 주석 회사가 정립한 구현 표준에 맞춰 법적인 이유로 추가하는 특정 주석 (ex : 저작권, 소유권) // Copyrigh..

book/Clean Code 2022.08.28

[Clean Code] 3장, 함수

작게 만들어라 함수를 작게 만들수록 각 함수들의 의도가 명확해짐 블록과 들여쓰기 if문/else문/while문 등에 들어가는 블록은 한 줄이어야 한다. 들여쓰기의 수준은 1단이나 2단을 넘어서는 안된다. 한 가지만 해라 함수는 한 가지만 처리해야 한다. 함수가 한 가지만 하는지 판단하는 방법 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러가지 작업을 하는 것. 아래 함수는 지정된 함수 이름 안에서 추상화 수준이 하나다. 따라서 한 가지 역할만 수행. public static String renderPageWithSetupsAndTeardowns( PageData pageData, boolean isSUite) thorows Exception { if (isTestPage(pageData..

book/Clean Code 2022.08.27

[Clean Code] 2장, 의미 있는 이름

의도를 분명히 밝혀라 변수는 ‘측정하려는 값’과 ‘단위’를 표현하는 이름이어야 한다. int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays; 그릇된 정보를 피해라 널리 쓰이는 의미가 있는 단어를 다른 의미로 사용하지 않는다. ex : ap, aix, sco 등 여러 계정을 그룹으로 묶을 때, 실제 단위가 아니라면 사용하지 않는다. ex : List가 아니라면 accountList라 명명하지 않는다. → accountGroup, accouts 등으로 변환. 서로 흡사한 이름을 사용하지 않는다. ex : 한 모듈에서 XYZControllerForEfficientHandlingOfStrings를 사용하..

book/Clean Code 2022.08.27