본문 바로가기

카테고리 없음

tdd 강의

좋은 교육이란 어떤 교육일까?
교육 효과가 높은 교육은 어떤 교육일까?

교육 과정에서 그치지 않고

교육을 받는 교육생이 행동하도록 함으로써 실질적인 변화를 만드는 교육.

개인에서 한발 더 나아가 팀, 회사에 변화를 만드는 교육 - 교육에 대한 포비의 철학

 

교육에서 그치지 않고, 현장에서 적용을 해야한다.

 

나의 영향력 범위 내에서 변화를 만들 수 있는 최소한의 변화를 만든다.

- 코드 컨벤션, 커밋 로그 컨벤션을 적용

- 유틸성 클래스에 학습 테스트 적용하고 리팩토링하기

- else문 쓰지 않기(early return), indent depth를 줄이는 리팩토링(메서드 추출 리팩토링)

 

자신감과 용기가 쌓이면 더 큰 변화를 만든다.

- 문자열과 원시값 포장, 일급 콜렉션 적용 리팩토링 (클래스 분리 리팩토링)을 TDD로 진행

- 정적 분석 도구 (예를 들어 sonarqube)를 적용하고 리팩토링

- 지속적 통합 도구 (CI)를 도입한다.

- 코드 리뷰 문화를 만든다.

 

엘레강트 오브젝트

객체지향 프로그래밍이 지향해야할 23가지 조언을 담고 있따.

23가지 원칙이 지향하는 궁극적인 목적은 유지보수하기 좋은 코드구현이다.

다소 극단적인 원칙도 있지만 극단적인 연습을 하다보면 영감을 얻는 경우가 많다.

 

-er로 끝나는 이름을 사용하지 마세요

클래스는 객체의 팩토리(factory)이다.

클래스는 객체를 만들고, 추적하고, 적절한 시점에 파괴한다.

즉, 객체의 라이프 사이클을 관리한다.

 

종종 클래스를 객체의 템플릿으로 설명하지만, 이 설명은 완전히 잘못된 설명이다.

이런 식의 설명은 수동적이고, 멍청한 코드 덩어리로 클래스를 격하 시킨다.

 

클래스는 객체의 능동적인 관리자.

즉, 객체를 꺼내거나 반환할 수 있는 역할이기 때문에 저장소(storage) 또는 웨어하우스 라고 불러야한다.

 

사실 객체를 살아있는 생명체로 생각한다면 클래스는 객체의 어머니라고 할 수 있다.

이 은유가 가장 정확한 표현이다.

 

클래스 이름을 짓는 방식

1. 클래스의 객체들이 무엇을 하는지(what he does)를 살펴본 후 기능에 기반해서 이름을 짓는방법

2. 클래스의 객체들이 무엇인지(what he is)에 기반해 이름을 짓는 방법

 

2번으로 사용하라

객체는 그의 역량(capability)으로 특징지어야 한다.

 

객체는 캡슐화된 데이터의 대표자(representative)이다.

대표자는 스스로 결정을 내리고 행동할 수 있는 자립적인 엔티티이다.

 

즉, 객체지향은 현실 세계를 모방한 것이 아니라 현실 세계를 참조하여 새로운 세상을 만들어야 한다.

 

마트에서 우유를 결제하는 의인화 예시

DBconnection connection = new DBConnection();

Milk milk = connection.findItem("우유");
int price = mile.getPrice();

Person wonik = connection.findPerson("포비");
Wallet wallet = wonik.getWallet()
wallet.setAmount(wallet.getAmount() - price);

wonik.setItem(mile);

connection.save(wonik);

getter 사용을 최대한 자제하라

Wallet wallet = wonik.getWallet()
wallet.setAmount(wallet.getAmount() - price);
>>>>
wonik.paymentFor(price);

능동적으로 활용하고

객체에 메세지를 보내도록 노력해라

DBconnection connection = new DBConnection();

Milk milk = connection.findItem("우유");
Person wonik = connection.findPerson("포비");

milk.sellTo(wonik);

connection.save(wonik);

 

메소드의 이름을 지을 때 간단한 경험 법칙은

빌더(builder)의 이름은 명사로,

조정자(manipulator)의 이름을 동사로 짓는 것이다.

 

빌더(builder)란?

뭔가를 만들고 새로운 객체를 반환하는 메서드.

빌더는 항상 뭔가를 반환

 

빌더의 반환 타입은 절대 void가 될 수 없으며 명사가 되어야 한다.

 

빌더 메서드의 예시

int pow(int base, int power);

float speed()

Employee employee(int id);

String parsedCell(int x, int y);

 

마지막 예인 parsedCell는 형용사를 덧붙여 메서드의 의미를 좀 더 풍부하게 설명하고 있는 명사로 원칙을 위반하지 않는다.

 

조정자란?

객체로 추상화한 실세계 엔티티를 수정하는 메서드

반환 타입은 항상 void이고 ,이름은 동사여야 한다.

 

조정자 메서드 예시

void save(String contetn);

void put(String key, Float value);

void remove(Employee emp);

void quicklyPrint(int id);

 

마지막 예인 quicklyPrint는 부사를 덧붙여 메서드의 문ㅁ맥과 목적에 관한 풍부한 정보를 제공하는 동사로 원칙을 위반하지 않는다.

 

잘못된 예시

int save(String content);

boolean put(String key, Float value);

 

리팩토링 

앞의 put 메서드는 PutOperation과 같은 

 

class Bakery {
	Food cookBrownie(); // 브라우니를 요리해서 반환한다.
    Drink brewCupofCoffee(String flavor); // 커피를 끓여서 반환한다.
}

Bakery를 자율적인 객체로 존중해서는 안되기 때문에 객체에게 할일을 일일이 명령해야 한다고 속상된다.

 

객체는 자신의 의무를 수행하는 방법을 알고 있고 존중 받기를 원하는 살아있는 유기체이다.

객체는 단순히 지시에 따르는 것이 아니라 계약에 기반해 일하고 싶어한다.

 

바텐더에게 음악을 틀어 달라고 요청할 때

1. 음악을 틀어주세요

2. 음악을 틀고, 현재의 볼륨 상태를 말해주세요.

 

바텐더 입장에서 각각의 느낌이 어떤가?

의존하고 있는 객체를 자율적인 존재로 존중하는 방법은 어느 방법인가?

 

생성자 하나를 주 생성자로 만들어라

클래스를 잘 설계한다면, 클래스는 많은 수의 생성자와 적은 수의 메서드를 포함할 것이다.

2~3개의 메서드와 5~10개의 생성자를 포함하는 것이 적당하다.

 

테스트를 위한 생성자를 추가하는 것도 좋다.

부 생성자는 주 생성자를 호출하는 형식으로 만들어라

주 생성자는 마지막에 구현하고, 주 생성자 앞에 부 생성자를 구현한다.

 

불변 객체로 만들어라

모든 클래스를 상태 변경이 불가능한 불변 클래스로 구현하면 유지보수성을 크게 향상시킬 수 있다.

불변 객체를 기반으로 사고하면 더 깔끔하고, 더 작고, 더 쉽게 이해할 수 있는 코드를 구현할 수 있다.

 

toy 프로젝트로 할 때는 극단적으로 연습을 해보라

불변 객체를 만들었을 때 인스턴스가 많아지고, 가비지 콜렉션이 많아져서 성능이 떨어질 때도 해결방법은 존재한다.

도저히 안될 때만 가변객체를 사용한다.

 

문서를 작성하는 대신 테스트를 만드세요

코드를 문서화하는 대신 코드를 깔끔하게 구현하기 위해 노력한다.

깔끔하게 만든다 라는 말에는 단위 테스트도 함께 만든다는 의미가 포함되어 있다.

단위 테스트의 유지 보수는 당연한 것이다.