클린코드 15

클린코드 17장 - 냄새와 휴리스틱

마틴파울러의 리팩토링 책에서도 언급하는 것처럼, 우리가 소스를 보다보면 리팩토링이 필요한 나쁜 냄새나는 부분들을 찾을 수 있다. 주석 C1. 부적절한 정보 : 변경이력, 작성자, 최종수정일 등은 다른시스템(소스관리, 버그추적, 이슈추적 등)에 저장할 정보이다. 주석은 코드와 설계에 기술적인 설명을 부연하는 수단이다. C2. 쓸모 없는 주석 : 오래되거나 엉뚱하고 잘못된 주석은 더이상 쓸모다 없다. 코드와 무관하게 혼자서 따로 놀며 코드를 그릇된 방향으로 이끈다. C3. 중복된 주석 : 코드에 이미 있는 내용을 구구절절 반복할 필요는 없다. /** * @param sellRequest * @return * @throws ManagedComponentException */ public SellResponse..

클린코드 13장 - 동시성

동시성과 깔끔한 코드는 양립하기 어렵다. 이런 어려움을 대처하고 깨끗한 코드를 작성하는 방법을 알아보자. 동시성이 필요한 이유? 쓰레드가 하나인 프로그램은 무엇과 언제가 서로 밀접하다. 동시성은 무엇과 언제를 분리하는 전략이다. 웹애플리케이션에서 서블릿 모델을 보면, 웹 요청이 올때마다 각 서블릿 스레드가 각각 자신만의 세상에서 돌아감에 따라 많은 구조적 이점을 가진다. 또한, 많은 배치프로그램에서 하나의 쓰레드가 수행할 때보다 많은 일을 동시성을 이용해서 해결하고 있다. 하지만, 동시성은 각별히 주의하지 않으면 난감한 상황에 처하게 되며, 동시성과 관련된 일반적인 미신과 오해가 있다. 1) 동시성은 항상 성능을 높여준다 : 동시성은 때로 성능을 높여준다. 대기시간이 길거나, 독립적인 계산이 충분히 많은..

클린코드 11장 - 시스템

도시를 설계할때에도 수도관리팀, 전력관리팀, 교통관리팀, 치안관리팀, 건축물관리팀 등 각 분야의 담당자들이 적절한 추상화와 모듈화로 일을 하기 때문에 잘 돌아갈 수 있다. 소프트웨어도 추상화와 관심사 분리를 통해 깨끗한 시스템을 유지해야 한다. 생성(Configuration) 과 사용(애플리케이션, Service) 분리 아래와 같이 서비스 사용부에서 생성까지 책임지는 소스는 아래와 같은 문제가 있다. 1. getService()에서 MyServiceImpl이라는 구체적인 객체에 의존한다. 2. 단위테스트 구현시 MyServiceImpl이 복잡한 로직이라면, Test Double 을 service에 할당해야 하는데 불가능하다. 3. service가 null일 경우와 아닐 경우 등 객체 생성에 대한 테스트도..

클린코드 - 2장 의미있는 이름

의도를 분명히 밝혀라 변수의 존재 이유, 기능, 사용법 등이 변수, 메소드, 클래스명에 드러나야 한다. 따로 주석이 필요하지 않을 정도로 // Bad public List getThem() { List list1 = new ArrayList(); for (int[] x : theList) { if (x[0] == 4) { list1.add(x); } } return list1; } // Good public List getFlaggedCells() { List flaggedCells = new ArrayList(); for (int[] cell : gameBoard) { if (cell[STATUS_VALUE] == FLAGGED) { flaggedCells.add(cell); } } return fla..

클린코드 1장 - 깨끗한 코드

코드가 존재하리라 혹자는 코드를 자동으로 생성하는 시대가 올 거라는 말과 함께, 모델이나 요구사항에 집중해야 한다고 얘기한다. 프로그래밍 언어의 추상화 수준은 점차 높아지겠지만, 요구사항을 상세하게 명시하여 기계가 이해하고 실행할 정도로 정확하고 상세하게 정형화하는 코드는 없어질 수 없다. 모호한 요구사항에서 정형화된 표현과 제대로 명시된 요구사항을 뽑아내는 것은 개발자의 역할이다. 나쁜 코드 나쁜 코드는 개발 속도를 크게 떨어뜨린다. 코드를 고칠 때마다 엉뚱한 곳에서 문제가 생기기 때문이다. 팀의 생산성은 계속해서 떨어진다. 이에 새로운 인력을 추가로 투입하지만, 새 인력은 나쁜 코드를 더 양산하며 결국 생산성은 거의 0이 된다. 이에 대해, 새로 차세대 프로젝트를 시작하지만, 기존 시스템에서 계속해서..

클린코드 목차

클린코드의 정의 1장. 깨끗한 코드 좁은 범위의 클린코드 2장 - 의미있는 이름 3장 - 함수 4장 - 주석 5장 - 형식 맞추기 넓은 범위의 클린코드 6장 - 객체와 자료구조 7장 - 오류처리 8장 - 경계 9장 - 단위테스트 10장 - 클래스 더 넓은 범위의 클린코드 11장 - 시스템 12장 - 창발성 13장 - 동시성 14장 - 점진적인 개선 추가적인 클린코드 15장 - JUnit 들여다보기 16장 - SerialDate 리팩토링 17장 - 냄새와 휴리스틱

자바 코딩의 기술 - 9장 ( 실전 준비 )

코드의 첫 90%에 개발 시간의 첫 90%가 쓰인다. 코드의 나머지 10%에 개발 시간의 마지막 90%가 쓰인다. - 톰 카길 9-1 정적 코드 분석 도구 - SpotBugs( https://spotbugs.github.io/) 자바에서 가장 오래된 정적 코드 분석도구이다. - Checkstyle(https://checkstyle.sourceforge.io/), PMD(https://pmd.github.io/) 도 유명하나, 다소 장황하고 특정 코드 방식을 고집하는 등 선호도를 탄다. - Error Prone(https://errorprone.info/) 은 ConcurrentHashMap 내 버그를 감지하면서 유명해 졌는데, 구글이 자체 개발했다. - Code Inspection( https://www..

자바 코딩의 기술 - 8장 ( 데이터 흐름 )

객체 지향 프로그래밍은 동작부를 캡슐화해 코드를 이해하기 쉽게 만든다. 함수형 프로그래밍은 동작부를 최소화해 코드를 이해하기 쉽게 만든다. - 마이클 페더스 8-1. 익명 클래스 대신 람다 사용하기 Map values = new HashMap(); Double square(Double x) { Function squareFunction = new Function() { @Override public Double apply(Double value) { return value * value; } }; return values.computeIfAbsent(x, squareFunction); } 위와 같이 익명클래스(squareFuction)을 만드는 것보다 람다 표현식이 낫다 Map values = new H..

자바 코딩의 기술 - 7장 ( 객체 디자인 )

컴퓨터 과학의 모든 문제는 또 다른 간접 게층을 추가해 풀 수 있다. 하지만 대부분 또 다른 문제를 양산한다. - 데이비드 휠러 7-1. boolean 매개변수로 메서드 분할 void log(String message, boolean classified) throws IOException { if (classified) { writeMessage(message, CAPTAIN_LOG); } else { writeMessage(message, CREW_LOG); } } 위는 기장(Captain)과 승무원(Crew)로그 처리 부분과 같이 서로 연관 없는 부분을 메서드를 각각 분리하는게 좋다. void writeToCaptainLog(String message) throws IOException { write..

자바 코딩의 기술 - 6장 ( 올바르게 드러내기)

코드는 꼭 테스트하라. 아니면 사용자가 하게 된다. - 데이브 토마스, 앤드류 헌트 6-1. Given-When-Then으로 테스트 구조화 @Test void setPlanetarySpeedIs7667() { CruiseControl cruiseControl = new CruiseControl(); cruiseControl.setPreset(SpeedPreset.PLANETARY_SPEED); Assertions.assertTrue(7667 == cruiseControl.getTargetSpeedKmh()); } 주석을 추가하고, 띄워쓰기를 넣어서 Given, When, Then을 확실히 인지할 수 있다. void otherTest() { // given CruiseControl cruiseControl..

반응형