본문 바로가기

강의/TDD, Clean Code with Java 12기

(33)
사다리타기 교육 Out -> In 접근근 방식 vs In -> Out 접근 방식 out -> in 접근 방식은 도메인 지식이 없거나 요구사항 복잡도가 높은 경우 적합 in -> out 접근 방식은 도메인 지식이 있거나 요구사항이 단순한 경우 적합 out -> in 접근 방식은 tdd로 하기가 쉽지 않다. tdd로 수월하게 하기 위해서는 in -> out 방식으로 진행해야 한다. Ladder: 전체 사다리게임의 이동 Line : 한개의 라인에 대해서 왼쪽, 오른쪽으로 이동할 지 결정 Ladder와 Line 중 어디서부터 구현을 시작하는 것이 좋을까? 위 다이어그램에서 Out의 시작점은 어느 곳을 의미할까? (Ladder) Line 부터 완성한 다음 -> Ladder 구현 (in -> out 방식) Ladder 부터 완성한..
로또 게임 - 강의 정리 AS-IS 학습 테스트 - JUnit 사용법 및 단위 테스트 연습 단위 테스트 - 내가 구현한 코드에 대한 단위 테스트 TDD - TDD 사이클을 맛보기 단계 아무런 설계가 없는 상태에서 TDD를 구현하기가 어렵다. 대상이 되는 클래스가 너무 많은 책임을 지니고 있기 때문에 TDD로 구현하기 어렵다. 클래스를 어떻게 작게 나눌까를 고민하다 보면, 객체 설계에 대한 힌트를 얻는 경우가 많다. TO-BE TDD - TDD 사이클이 익숙해질 때까지 같은 미션으로 반복 연습 TDD로 Lotto 구현하기 기능 요구사항 로또 구입 금액을 입력하면 구입 금액에 해당하는 로또를 발급해야 한다. 로또 1장의 가격은 1000원이다. 시작하기 요구사항 분석을 통한 기능 목록 작성 객체 설계를 통해 어느 부분부터 구현을 시작..
엘레강트 오브젝트 좋은 교육이란 교육 과정에서 그치지 않고 교육을 받는 교육생이 행동하도록 함으로써 실질적인 변화를 만드는 교육. 개인에서 한발 더 나아가 팀, 회사에 변화를 만드는 교육 - 교육에 대한 포비의 철학 나의 영향력 범위 내에서 변화를 만들 수 있는 최소한의 변화를 만든다. - 코드 컨벤션, 커밋 로그 컨벤션을 적용 - 유틸성 클래스에 학습 테스트 적용하고 리팩토링하기 - else문 쓰지 않기, indent depth를 줄이는 리팩토링 (메서드 추출 리팩토링) 자신감과 용기가 쌓이면 더 큰 변화를 만든다. - 문자열과 원시값 포장, 일급 콜렉션 적용 리팩토링 (클래스 분리 리팩토링)을 TDDfh wlsgod - 정적 분석 도구 (예를 들어 sonarqube)를 적용하고 리팩토링 - 지속적 통합 도구 (CI)를..
자동차 게임 프로젝트 - 강의 정리 자동차 게임 프로젝트 구현시 주의할 점 domain은 view에 대한 의존관계를 가지지 않게 코드를 작성하라. 자동차 경주 프로젝트 RacingGame 클래스가 n개의 자동차를 가지고 있는 형태로 구현해보자. Random 값을 생성하는 클래스를 분리하여 테스트가 쉽도록 구현. 요구사항 분석 후, 가장 작은 단위로 기능을 쪼개서 기능 목록을 만드는 것을 추천한다. ToDo list를 기반으로 commit 로그를 작성하자. ToDo list를 기반으로 test case를 만들자. 객체 설계만큼 기능 목록을 만드는 것이 중요하다. 기능 목록 분리가 어렵다면 아래의 순서로 프로젝트를 진행해보자 일단 구현 (프로그램에 대한 전반적인 지식을 쌓기) -> 구현한 모든 코드를 버린다. -> 기능 목록 작성 -> 만만한..
옵셔널 요구사항 1 - Optional을 활용해 조건에 따른 반환 nextstep.optional.User의 ageIsInRange1() 메소드는 30살 이상, 45살 이하에 해당하는 User가 존재하는 경우 true를 반환하는 메소드이다. 같은 기능을 Optional을 활용해 ageIsInRange2() 메소드에 구현한다. 메소드 인자로 받은 User를 Optional로 생성하면 stream의 map, filter와 같은 메소드를 사용하는 것이 가능하다. nextstep.optional.UserTest의 테스트가 모두 pass해야 한다. 힌트 Guide To Java 8 Optional 문서를 참고해 Optional 사용 방법을 익힌다. Optional.ofNullable(user)을 활용해 User을 Opt..
스트림 실습 map, reduce, filter 실습 1 List에 담긴 모든 숫자 중 3보다 큰 숫자를 2배 한 후 모든 값의 합을 구한다. 지금까지 학습한 map, reduce, filter를 활용해 구현해야 한다. nextstep.fp.StreamStudyTest 클래스의 sumOverThreeAndDouble() 테스트를 pass해야 한다. 구현 결과 public static long sumOverThreeAndDouble(List numbers) { return numbers.stream() .filter(integer -> integer > 3) .map(integer -> integer * 2) .reduce(0, (x,y) -> x + y); } map, reduce, filter 실습 2 nextst..
스트림(stream) map, filter, reduce Collection에 담긴 데이터를 처리하려면 Collection을 순회하면서 각 Element를 처리하는 것이 일반적이다. 앞으로는 순회하는 것을 잊고, Element 처리에만 집중하자. filter 요구사항은 파일 문자 중 길이가 12보다 큰 문자의 수를 구한다. // nextstep.fp.StreamStudy countWords method String contents = new String(Files.readAllBytes( Paths.get("../ war-and-peace.txt")), StandardCharsets.UTF_8); List words = Arrays.asList(contents.split("[\\P{L}]+")); long count = 0;..
람다 실습 2 - 람다를 활용해 중복 제거 람다 실습 2 - 람다를 활용해 중복 제거 3개의 비슷한 기능을 가진 메서드가 존재한다. sumAll, sumAllEven, sumAllOverThree method 소스 코드를 확인하고 중복 제거한다. 람다를 사용하여 중복된 부분을 제거하여 보자. public static int sumAll(List numbers) { int total = 0; for (int number : numbers) { total += number; } return total; } public static int sumAllEven(List numbers) { int total = 0; for (int number : numbers) { if (number % 2 == 0) { total += number; } } retur..