본문 바로가기

분류 전체보기

(80)
[Clean Code] Chapter 13 동시성 해당 포스팅 내용은 책 'Clean Code - Robert C. Martin' 출처로 합니다. 동시성과 깔끔한 코드는 양립하기 어렵다. 동시성이 필요한 이유 동시성이란? · 결합(coupling)을 없애는 전략 · 무엇(what)과 언제(when)을 분리하는 전략 무엇과언제를 분리하면 · 애플리케이션 구조와 효율이 극적으로 나아진다. - 구조적인 관점에서 프로그램은 거대한 루프 하나가 아닌 작은 협력 프로그램 여럿으로 보이며, 이로 인해 시스템을 이해하기 쉬워지고 문제를 분리하기도 쉬워진다. · 응답시간과 작업 처리량 개선에도 도움이 된다 - crawler같이 요청하고 오래 기다려야 하는 작업을 하는 경우, 여러 작업을 병렬적으로 해도 좋은 경우 동시성에 대한 오해 1. 동시성은 항상 성능을 높여준다...
[Clean Code] Chapter 12 창발성 해당 포스팅 내용은 책 'Clean Code - Robert C. Martin' 출처로 합니다. 먼저 창발성이 무엇인지에 대해 알아보자 창발: 하위 계층(구성 요소)에는 없는 특성이나 행동이 상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상 창발성: 단순한 결합이 복잡한 결과를 나타내는 특징을 의미 - 창발적 설계란 ? -> 어떤 규칙과 원칙에 따라 설계를 하였을 때, 그것들이 모여 아주 좋은 거시적 설계가 되었을 때 이를 창발적 설계라 한다. 소프트 웨어의 설계 품질을 크게 높여주는 4가지 중요도 순 모든 테스트를 실행한다. 중복을 없앤다. 프로그래머의 의도를 표현한다. 클래스와 메서드 수를 최소로 줄인다. 위와 같은 규칙을 따를 때, 켄트벡은 설계가 '단순하다' 라고 말한다. 이러한 규칙을 ..
[Effective Java] 아이템 39 - 명명 패턴보다 애너테이션을 사용하라 전통적으로 도구나 프레임워크가 특별히 다뤄야 할 프로그램 요소에는 딱 구분되는 명명 패턴을 적용해왔다 (ex. Junit의 test 메소드명) 효과적이긴 하나 단점도 크다. - 오타가 나는 경우 테스트를 통과했다고 오해할 수 있다 (ex. tsetSafetyOverride) - 올바른 프로그램 요소에서만 사용되리라 보증할 방법이 없다 (ex. 메소드명이 아닌 클래스명을 TestSafetyMechnism인 경우 Junit은 pass) - 프로그램 요소를 매개변수로 전달한 마땅한 방법이 없다 (ex. 특정한 예외를 검출해야 하는 테스트인 경우, 클래스명에 예외를 덧붙인 예외를 넘겨도 컴파일러가 알 방법이 없다) 이를 보완하기 위해 등장한 것이 (Junit 4 이후의) 애너테이션(annotation)이다. 다..
[Clean Code] Chapter 11 시스템 서론 : 도시 만들기 거대한 도시가 돌아가는 이유 : 각각의 전원, 교통 등이 모듈로 모듈화되어 관리 / 일정 수준의 추상화를 통해 큰 도시 전체에 대한 이해 없이 개인과 개인이 관리하는 구성요소를 통해 효율적으로 동작 SW = 하나의 도시 - 하나의 도시의 모듈화만큼의 추상화를 이루지 못하는 것이 클린코드답지 못한 문제 낮은 단계의 추상화를 통해 관심사(Concern)을 분리하고 높은 추상화 수준(시스템 수준)에서도 클린 코드를 유지해보자 # 시스템의 생성(제작)과 사용을 분리 public Service getService() { if (service == null) service = new MyServiceImpl(...); // Good enough default for most cases? ret..
[Effective Java] 아이템 38 - 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라 열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴(typesafe enum pattern)보다 우수하다. 하지만 단 하나의 예외가 있는데, 이는 바로 타입 안전 열거 패턴은 확장할 수 있으나 열거 타입은 그럴 수 없다는 점이다. 달리 말하면, 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있는 반면, 열거 타입은 그럴 수 없다. 대부분의 상황에서 열거 타입을 확장하는건 좋지 못한 생각이다. 또한 확장성을 높이려면 고려할 요소가 늘어나 설계와 구현이 더 복잡해진다. 그렇지만 열거 타입을 확장할 쓰임이 연산 코드(operation code)에서는 유용하다. 연산 코드의 각 원소는 특정 기계가 수행하는 연산을 뜻한다. API가 제공하는 기본 연산 외에 사용..
[Effective Java] 아이템 37 - ordinal 인덱싱 대신 EnumMap을 사용하라 배열이나 리스트에서 원소를 꺼낼 때 ordinal 메소드로 인덱스를 얻는 코드가 있다..... 아이템 35를 참조해보면 ordinal() 메소드가 EnumSet과 EnumMap 같이 열거 타임 기반의 자료구조에 쓸 목적으로 설계되었다고는 하나, 절대 사용하지 말자는 멘션이 있다는 점을 회고해보자. 정원에 심은 식물들을 배열 하나로 관리하고, 이들을 생애주기 별로 묶어보는 등과 같은 기능을 위해 다음과 같이 코드를 짰다고 하자. class Plant{ enum LifeCycle { ANUUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle){ this.name ..
[Effective Java] 아이템 36 - 비트 필드 대신 EnumSet을 사용하라 열거한 값들이 주로 집합으로 사용되는 경우, 예전에는 각 상수에 서로 다른 2의 거듭제곱 값을 할당한 정수 열거 패턴(아이템 34)을 사용해 왔다. public class Text{ public static final int STYLE_BOLD= 1
[Effective Java] 아이템35 - ordinal 메서드 대신 인스턴스 필드를 사용하라 ordinal 메서드 : 열거 타입의 해당 상수가 그 열거 타입에서 몇 번째 위치인지를 반환하는 메서드 ordinal을 잘못 사용한 예 public enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians() { return ordinal() + 1; } } 위 코드는 동작하지만 유지보수하기 어려운 코드다. 상수 선언 순서를 바꾸는 순간 numberOfMusicians가 오동작하며, 이미 사용 중인 정수와 값이 같은 상수는 추가할 방법이 없다. 값을 중간에 비워둘 수도 없다. → 12번째 상수를 추가할 경우 11번째의 더미 상수를 같이 추가해야 한다...
[Effective Java] 아이템34 - int 상수 대신 열거 타입을 사용하라 열거타입 : 일정 개수의 상수 값을 정의한 다음, 그 외의 값은 허용하지 않는 타입이다. 자바에서 열거 타입을 지원하기 전에는 다음 코드처럼 정수 열거 패턴(int enum pattern) 기법을 사용했다. public static finalintAPPLE_FUJI = 0; public static finalintAPPLE_PIPPIN = 1; public static finalintAPPLE_GRANNY_SMITH = 2; public static finalint ORANGE_NAVEL = 0; public static finalint ORANGE_TEMPLE = 1; public static finalint ORANGE_BLOOD = 2; 정수 열거 패턴 기법의 단점 타입 안전을 보장할 방법이 없으며..
[Clean Code] Chapter 10 클래스 저차원에서 깨끗한 코드를 구현하였다 하더라도 고차원까지 고려하지 않으면 깨끗한 코드를 얻기는 어렵다. 이번 챕터 에서는 깨끗한 클래스에 대해 다룬다. 클래스 체계 표준 자바 관례 상에서의 등장 순서 정적 공개 상수(public static) 정적 비공개 변수(private static) 비공개 인스턴스 변수(private instance) 공개 함수 비공개 함수 표준 자바 관례에 따르면, 가장 먼저 변수 목록이 나온다. 정적 공개 상수가 있다면 맨 처음에 나오고, 다음으론 정적 비공개 변수, 비공개 인스턴스 변수가 나온다. 공개 변수가 필요한 경우는 거의 없다. 변수 목록 다음에는 공개 함수가 나온다. 비공개 함수는 자신을 호출하는 공개 함수 직후에 넣는다. 이는 추상화 단계가 순차적으로 내려간다는 것으..