본문 바로가기

Clean Code

(17)
[Clean Code] Chapter 18 동시성 2 클라이언트/서버 예제 책에서는 단일 스레드로 동작하던 서버를 다중 스레드로 변경하는 것과 코드를 깨끗하게 변경하는 내용을 다룬다. 우리는 다중 스레드를 적용하기 전에 어플리케이션이 어디서 시간을 보내는지 알아야 한다. I/O - 소켓 사용, 데이터베이스 연결, 가상 메모리 스와핑 기다리기 등에 시간을 보낸다. 프로세서 - 수치계산, 정규표현식 처리, 가비지 컬렉션 등에 시간을 보낸다. 대개 시스템은 둘 다 하느라 시간을 보내지만, 특정 연산을 살펴보면 대개 하나가 지배적이다. 1. 프로그램이 주로 프로세서 연산에 시간을 보내는 경우 새로운 하드웨어를 추가해 성능을 높여 테스트를 통과하는 방식이 적합하다. 프로세서 연산에 시간을 보내는 프로그램은 스레드를 늘인다고 해서 빨라지지 않는다. 왜냐하면 CPU 사..
[Clean Code] Chapter 17 냄새와 휴리스틱 해당 포스팅 내용은 책 'Clean Code - Robert C. Martin' 출처로 합니다. 휴리스틱(Heuristics) 불충분한 시간이나 정보로 인해 합리적인 판단을 할 수 없거나, 체계적이면서 합리적인 판단이 굳이 필요하지 않은 상황에서 사람들이 빠르게 사용할 수 있도록 보다 용이하게 구성된 간편 추론의 방법 문제의 답을 경험 법칙, 경험에 의한 추측, 직관적 판단, 상식, 시행착오 등의 방법을 사용하여 구하는 것 알고리즘 (논리적 해답) 여기서 나쁜 냄새가 난다 주석 (Comment) C1 - 부적절한 정보 다른 시스템에 저장할 정보는 주석으로 작성하지 말자 주석은 코드와 설계에 기술적인 설명을 부연하는 수단 C2 - 쓸모 없는 주석 오래되거나 엉뚱하거나, 잘못된 주석은 과감하게 버리고, 재빨..
[Clean Code] Chapter 16 SerialDate 리팩터링 SerialDate란? [http://www.jfree.org/jcommon/index.php]에서 JCommon 라이브러리를 제공 JCommon 라이브러리 내 org.jfree.data 패키지가 있으며 이 패키지 내 SerialDate 클래스가 있다. SerialDate는 날짜를 표현하는 자바 클래스이다. 이미 java.util.Date, java.tuil.Calendar 등과 같은 클래스가 있는데 SerialDate를 새로 구현한 이유는? Javadoc에 의하면... 돌려보자! SerialDateTests라는 클래스는 단위 테스트 케이스 몇 개를 포함한다. 돌려보면 실패하는 테스트 케이스는 없다. 하지만 주의깊게 코드를 보게되면 모든 코드를 점검하지 않는다는 사실을 알 수 있다. 이를 검증하기 위해서..
[Clean Code] Chapter 15 JUnit 들여다보기 JUnit이란? Java 단위 테스팅(unit-testing) 프레임워크 ComparisonCompactor: 두 문자열을 받아 차이를 반환하는 모듈 import junit.framework.TestCase; import junit.framework.ComparisonCompactor; public class ComparisonCompactorTest extends TestCase { public void testMessage() { String failure= new ComparisonCompactor(0, "b", "c").compact("a"); assertTrue("a expected: but was:".equals(failure)); } public void testStartSame() { St..
[Clean Code] Chapter 14 점진적 개선 프로그래밍은 과학보다 공예에 가깝다. 깨끗한 코드를 짜기 위해서는 돌아만 가는 지저분한 코드를 작성한 뒤에 정리해야 한다 Args의 간단한 사용. public static void main(String[] args) { try { Args arg = new Args("l,p#,d*", args); boolean logging = arg.getBoolean('l'); int port = arg.getInt('p'); String directory = arg.getString('d'); executeAppliocation(logging, port, directory); } catch (ArgsException e) { System.out.printf("Argument error: %s\n", e.errorM..
[Clean Code] Chapter 13 동시성 해당 포스팅 내용은 책 'Clean Code - Robert C. Martin' 출처로 합니다. 동시성과 깔끔한 코드는 양립하기 어렵다. 동시성이 필요한 이유 동시성이란? · 결합(coupling)을 없애는 전략 · 무엇(what)과 언제(when)을 분리하는 전략 무엇과언제를 분리하면 · 애플리케이션 구조와 효율이 극적으로 나아진다. - 구조적인 관점에서 프로그램은 거대한 루프 하나가 아닌 작은 협력 프로그램 여럿으로 보이며, 이로 인해 시스템을 이해하기 쉬워지고 문제를 분리하기도 쉬워진다. · 응답시간과 작업 처리량 개선에도 도움이 된다 - crawler같이 요청하고 오래 기다려야 하는 작업을 하는 경우, 여러 작업을 병렬적으로 해도 좋은 경우 동시성에 대한 오해 1. 동시성은 항상 성능을 높여준다...
[Clean Code] Chapter 12 창발성 해당 포스팅 내용은 책 'Clean Code - Robert C. Martin' 출처로 합니다. 먼저 창발성이 무엇인지에 대해 알아보자 창발: 하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상 창발성: 단순한 결합이 복잡한 결과를 나타내는 특징을 의미 - 창발적 설계란 ? -> 어떤 규칙과 원칙에 따라 설계를 하였을 때, 그것들이 모여 아주 좋은 거시적 설계가 되었을 때 이를 창발적 설계라 한다. 소프트 웨어의 설계 품질을 크게 높여주는 4가지 중요도 순 모든 테스트를 실행한다. 중복을 없앤다. 프로그래머의 의도를 표현한다. 클래스와 메서드 수를 최소로 줄인다. 위와 같은 규칙을 따를 때, 켄트벡은 설계가 '단순하다' 라고 말한다. 이러한 규칙을 ..
[Clean Code] Chapter 11 시스템 서론 : 도시 만들기 거대한 도시가 돌아가는 이유 : 각각의 전원, 교통 등이 모듈로 모듈화되어 관리 / 일정 수준의 추상화를 통해 큰 도시 전체에 대한 이해 없이 개인과 개인이 관리하는 구성요소를 통해 효율적으로 동작 SW = 하나의 도시 - 하나의 도시의 모듈화만큼의 추상화를 이루지 못하는 것이 클린코드답지 못한 문제 낮은 단계의 추상화를 통해 관심사(Concern)을 분리하고 높은 추상화 수준(시스템 수준)에서도 클린 코드를 유지해보자 # 시스템의 생성(제작)과 사용을 분리 public Service getService() { if (service == null) service = new MyServiceImpl(...); // Good enough default for most cases? ret..
[Clean Code] Chapter 10 클래스 저차원에서 깨끗한 코드를 구현하였다 하더라도 고차원까지 고려하지 않으면 깨끗한 코드를 얻기는 어렵다. 이번 챕터 에서는 깨끗한 클래스에 대해 다룬다. 클래스 체계 표준 자바 관례 상에서의 등장 순서 정적 공개 상수(public static) 정적 비공개 변수(private static) 비공개 인스턴스 변수(private instance) 공개 함수 비공개 함수 표준 자바 관례에 따르면, 가장 먼저 변수 목록이 나온다. 정적 공개 상수가 있다면 맨 처음에 나오고, 다음으론 정적 비공개 변수, 비공개 인스턴스 변수가 나온다. 공개 변수가 필요한 경우는 거의 없다. 변수 목록 다음에는 공개 함수가 나온다. 비공개 함수는 자신을 호출하는 공개 함수 직후에 넣는다. 이는 추상화 단계가 순차적으로 내려간다는 것으..
[Clean Code] Chapter 9 단위 테스트 해당 포스팅 내용은 책 'Clean Code - Robert C. Martin' 출처로 합니다. TDD(Test-Driven Development)란? 테스트 작성 후 테스트를 통과하기 위한 실제 코드를 만들고 반복하는 개발 프로세스 TDD 법칙 세 가지 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. (최소 실제 코드 작성) 위 세 가지 규칙을 통해, 실제 코드에 대해 기대되는 바를 보다 명확하게 정의함으로써 불필요한 설계를 피할 수 있고, 정확한 요구 사항에 집중할 수 있다. 이렇게 일하면 실제 코드를 사실상 전부 테스트하는 테스트 케이스가 나..