[공부] 독서/클린 코드(10)
-
[2019.03.01] 클린 코드 (점진적 개선)
시스템을 망가뜨리는 변형을 하지 말아야한다. 어떤 목적 달성을 위해 코드를 작성하는 와중에도 해당 목적 만을 위한 TDD를 사용할 수 있다. 리팩토링 할 때의 TDD1. 현재 코드에서 동작하는 테스트 코드를 만든다.2. 코드를 리팩토링 할 때마다 테스트 케이스를 모두 돌려본다.3. 테스트가 실패하면, 리팩토링으로 인해 발생하는 실패 사례를 해결할 때까지 다음 리팩토링으로 넘어가지 않는다. 객체가 특정 클래스인지 확인하는 논리 연산Object instance of Class하지만 해당 논리연산을 너무 자주 사용하게 될 경우, 프로그램이 확장될 때 분기문에 의한 상황 처리가 계속 추가되게 된다. 그러므로 이를 사용하기 보다는 구조적으로 해결하려하자. 소프트웨어 설계는 분할만 잘해도 품질이 크게 높아진다.
2019.03.01 -
[2019.02.14] 클린 코드 (정리 : 냄새와 휴리스틱)
클린 코드를 위한 주석 이름 안좋은 예시비고 부적절한 정보 변경 이력 시스템이 저장해주는 정보는 더이상 저장할 필요없다. 쓸모없는 정보 성의없는 주석 주석 처리된 코드 맘놓고 그냥 지워라. Git에서 복구하면 된다. 코드로 충분한 정보 add(3, 5) // 3+5 환경 이름안좋은 예시비고 한번에 build 가능해야한다 한번에 test 가능해야한다 함수 이름안좋은 예시비고 매개변수는 적을 수록 좋다 매개변수에 boolean을 넣지마라 사용자는 true 또는 false 로 호출하면 결과가 어떻게 달라지는지 짐작이 안간다. 애초에 이것이 존재한다는 것은 함수를 쪼갤수 있다는 증거다. 출력인수는 사용하지 마라 int num; scanf("%d", &num); scanf에 num을 넣는건 입력이 아니라 scan..
2019.02.14 -
[2019.02.14] 클린 코드 (SerialDate 리팩토링 사례 분석)
SerialDate : java.util.Date의 불편함을 해소하고자 만든 라이브러리 변경이력을 나타내는 주석은 더 이상 필요없다.주석을 HTML 태그를 사용해서 표시하지마라 명칭에 관한 고민어떤 기준을 기점으로 얼마나 ~가 지났는지를 표현하기에 Serial 은 적합한가? relative offset이 더 적합하다.Serial은 일련번호, 즉 식별 번호에 사용하기 적합하다. 옛날 프로그래밍에서 사용하던 기교를 피하라ex. Constant 클래스를 상속하게 해서 TARGET_CONSTANT에 접근할 때 Constant.TARGET_CONSTANT 와 같이 접근하는 것을 피하려던 기교.바람직하지 못하므로 enum을 써라. 독자적인 enum 소스파일을 만들어 사용하라. enum에는 toInt()와 같은 것이..
2019.02.14 -
[2019.02.09] 클린 코드 (JUnit 리팩토링 사례 분석)
JUnit 리팩토링 사례 분석 이제는 더 이상 필요없는 접두어를 제거하자 지저분한 조건문은 메소드로 boolean 을 반환 받도록 분리하자 특정 메소드에 사용되는 함수들이 있다면해당 함수들의 사용 방식에 일괄성을 주자(모두 반환하는 데이터가 있게 하도록 하거나 모두 없게 하거나 하자) 숨겨진 시간 결합을 끊자. 숨겨진 시간 결합findA가 멤버변수 A를 찾아내서 할당하는 함수고,findB가 멤버변수 A를 이용해서 B를 찾아내는 함수라면,다음 코드는 숨겨진 시간 결합이 존재한다.findA();findB(); 아래와 같이 바꿔서 숨겨진 시간 결합을 깰 수 있다.A = findA();B = findB(A); 좀 더 개선하면 findB를 다음과 같이 고치고 findAAndB함수를 사용해라.public void ..
2019.02.09 -
[2019.02.09] 클린 코드 (동시성1)
동시성 동시성과 깔끔한 코드는 양립하기 어렵다.그러나 동시성은 결합을 없애는 전략이다.무엇과 언제를 분리하기 때문이다. 동시성은 필요하다.동시성은 다소 부하가 생긴다.동시성은 코드도 더 짜야한다.동시성은 복잡하다.동시성은 버그를 재현하기 힘들다.동시성은 근본적인 설계 전략을 재고해야한다. 동시성 방어 원칙1. 단일 책임 원칙 -> 동시성 코드는 다른 코드와 분리하라2. 자료 범위 제한 -> 공유자료를 최대한 줄이고 캡슐화하라, synchronized로 임계영역을 보호하라3. 자료 사본 사용하기4. 스레드를 독립적으로 구현하라.5. 라이브러리를 이해하라. 스레드 환경에 안전한 컬랙션java.util.concurrent 패키지java.util.concurrent.atomic 패키지java.util.concu..
2019.02.09 -
[2019.02.09] 클린 코드 (시스템, 창발성)
시스템 시스템 생성과 시스템 사용을 분리하라아래는 이것을 실제로 적용하기 위한 기법들이다. 1. 초기화 지연public SystemService getSystemService(){if(systemService == null)systemService = new SystemServiceImpl();return systemService;}+ 객체가 필요할 때까지 객체 생성을 미룰 수 있다.+ null을 반환하지 않는다.- SystemServiceImpl 생성자에 의존적이다.- SystemServiceImpl 가 적절한 기본값인지 모른다.- 환경에 따라 SystemService를 다르게 줄경우 SRP 원칙에 위배된다. 2. Main 분리하기*메인 함수는 시스템에 필요한 객체를 생성만한다.*애플리케이션은 이 객체..
2019.02.09