본문 바로가기

내 코드가 그렇게 이상한가요?17

16장 설계를 방해하는 개발 프로세스와의 싸움 개발 프로세스 자체가 레거시 코드의 발생 원인이 되기도 한다. 문제는 기술 부족 이외에도 심리적 안정감, 커뮤니케이션, 조직적 요인 등 굉장히 다양한 원인으로 발생한다. 각각의 문제와, 그 해결 방법에 대해 설명해보자 16.1 커뮤니케이션 16.1.1 커뮤니케이션이 부족하면 설계 품질에 문제가 발생 팀 개발에서는 팀원과 어떤 코드를 작업할 때 서로의 로직이 제대로 맞물리지 않아 버그로 이어지는 상황이 매우 흔하다. 커뮤니케이션이 부족해 서로가 무엇을 하고 있는지 잘 모르기 때문이다. 16.1.2 콘웨이 법칙 커뮤니케이션 문제 해결과 관련된 콘웨이 법칙 콘웨이 법칙은 ‘시스템의 구조는 그것을 설계하는 조직의 구조를 닮아간다’ 라는 법칙이다. 개발 부문이 3개의 팀으로 구분되어 있다면 모듈의 수도 팀의 수와.. 2024. 4. 13.
15장 설계의 의의와 설계를 대하는 방법 15.1 이 책은 어떤 설계를 주제로 집필한 것인가? 품질 특성 설명 품질 관련 부가적인 특성 기능 적합성 기능이 니즈를 만족하는 정도 기능 무결성, 기능 정확성, 기능 적절성 성능 효율성 리소스 효율과 성능 정도 시간 효율성, 자원 효율성, 용량 만족성 호환성 다른 시스템과 정보 공유, 교환할 수 있는 정도 공존성, 상호 운용셔ㅓㅇ 사용성 사용자가 시스템을 만족하며 사용하는지 나타내는 정도 적절도 인식성, 습득성, 운용 조작성, 사용자 오류 방지성, 사용자 인터페이스 편의성, 접근성 신뢰성 필요할 때 기능을 실행할 수 있는 정도 성숙성, 가용성, 장애 허용성, 회복성 보안 허용되지 않은 사용으로부터 보호할 수 있는 정도 기밀성, 무결성, 부인 방지성, 책임 추적성, 인증성 유지 보수성 시스템이 정상 운.. 2024. 4. 13.
14장 리팩터링: 기존의 코드를 성장시키는 기술 이미 구현되어 있는 코드의 구조가 좋지 않다면 리팩터링해야 한다. 14.1 리팩터링의 흐름 리팩터링은 실질적 동작은 유지하면서, 구조만 정리하는 작업이다. 실질적인 동작이 변하지 않았음을 확인할 수 있는 방법으로는 단위 테스트가 있다. 예시 - 웹툰 서비스 로직 다음의 조건을 모두 만족해야 결제를 할 수 있다. 구매자의 계정이 유효해야 한다. 구매하려는 만화가 현재 구매 가능한 상태여야 한다. 구매자가 갖고 있는 포인트가 만화 구매 포인트 이상이어야 한다. public class PurchasePointPayment { final CustomerId customerId; // 구매자의 ID final ComicId comicId; // 구매할 웹툰의 ID final PurchasePoint purchas.. 2024. 4. 12.
13장 모델링: 클래스 설계의 토대 13.1 악마를 불러들이기 쉬운 User 클래스 로그인 사용자를 나타내는 User 클래스는 사양 변경이 굉장히 잦아서 여러 가지 문제를 일으키기 쉬운 클래스이다. 처음에는 식별 ID만 존재하다가 email, password 등이 추가되고 할인 포인트, 자기소개, 법인 등록번호 등등 다양한 인스턴스 변수를 추가하는 상황이 발생할 수 있다. 그러다보면 null로 인한 문제나 기타 유효성 검사와 관련된 사소한 문제가 다양하게 발생할 것이다. 이런 문제는 왜 발생할까? 모델링을 제대로 하지 않았기 때문이다. 13.2 모델링으로 접근해야 하는 구조 13.2.1. 시스템이란? 예를 들어, 사람은 두 다리를 움직이며 이동하는 ‘이족 보행 시스템’을 따르는데, 자동차와 비행기 등 다른 시스템으로 대체하여 활용할 수 있.. 2024. 4. 12.
14장 리팩터링: 기존의 코드를 성장시키는 기술 이미 구현되어 있는 코드의 구조가 좋지 않다면 리팩터링해야 한다. 14.1 리팩터링의 흐름 리팩터링은 실질적 동작은 유지하면서, 구조만 정리하는 작업이다. 실질적인 동작이 변하지 않았음을 확인할 수 있는 방법으로는 단위 테스트가 있다. 예시 - 웹툰 서비스 로직 다음의 조건을 모두 만족해야 결제를 할 수 있다. 구매자의 계정이 유효해야 한다. 구매하려는 만화가 현재 구매 가능한 상태여야 한다. 구매자가 갖고 있는 포인트가 만화 구매 포인트 이상이어야 한다. public class PurchasePointPayment { final CustomerId customerId; // 구매자의 ID final ComicId comicId; // 구매할 웹툰의 ID final PurchasePoint purchas.. 2024. 4. 12.
12장 메서드(함수): 좋은 클래스에는 좋은 메서드가 있다 12.1 반드시 현재 클래스의 인스턴스 변수 사용하기 인스턴스 변수를 안전하게 조작하도록 메서드를 설계하면 클래스 내부가 정상적인 상태인지 보장할 수 있다. 예외가 있기는 하지만 메서드는 반드시 현재 클래스의 인스턴스 변수를 사용하도록 설계해야한다. 12.2 불변을 활용해서 예상할 수 있는 메서드 만들기 가변 인스턴스 변수 등을 변경하는 메서드는 의도하지 않게 다른 부분에 영향을 줄 수 있다. 이렇게 되면 예상하지 못한 동작이 발생할 수 있으며 유지보수가 어려워진다. 따라서 불변을 활용해 예상치 못한 동작 자체를 막을 수 있게 설계해야한다. 12.3 묻지 말고 명령하라 어떤 클래스가 다른 클래스의 상태를 판단하거나, 상태에 따라 값을 변경하는 등 ‘다른 클래스를 확인하고 조작하는 메서드 구조’는 응집도가.. 2024. 4. 4.
11장 주석: 유지 보수와 변경의 정확성을 높이는 주석 작성 방법 읽는 사람을 혼란스럽게 만드는 주석은 무엇인지 살펴보고, 읽는 사람에게 도움을 주어 유지 보수와 변경의 정확성을 높이는 주석 작성 방법에 대해 알아보자! 11.1 내용이 낡은 주석 class Member { private final States state; // 힘든 상태일 때 true 리턴 // 중독, 마비 상태일 때 true 리턴 boolean isPainful() { if (states.contains(StateType.poison) || states.contains(StateType.paralyzed) || states.contains(StateType.fear)) { return true; } return false; } } 주석에는 중독, 마비 상태만 적혀있는데 실제 로직은 세 가지 상태를 판.. 2024. 4. 4.
10장 이름 설계: 구조를 파악할 수 있는 이름 10.1 악마를 불러들이는 이름 온라인 쇼핑몰을 예로 들자면 흔히 볼 수 있는 좋지 않은 이름은 상품을 그대로 ‘상품 클래스’라고 이름을 붙이는 것이다. 온라인 쇼핑몰은 상품을 중심으로 이루어지기 때문에 출고, 예약, 주문, 발송 등 상품을 다루는 유스케이스가 많다. 그러면 상품 클래스가 여러 클래스와 관련있는 로직을 갖게 되고, 점점 거대하고 복잡해진다. 거대해진 상품 클래스에 사양 변경이 발생하면 관련된 부분에 버그가 생기지는 않았는지 관련된 클래스를 모두 확인 해야한다. 10.1.1 관심사 분리 상품이 예약,주문,발송 등 다양한 관심사에 관한 로직을 가지고 있다. 즉 강한 결합 로직 강한 결합을 해소하고 결합이 느슨하고 응집도가 높은 구조로 만들려면 관심사 분리를 할 수 있어야한다. 관심사 분리는 .. 2024. 4. 2.
9장 단위 테스트 1997년만 해도 TDD(Test Driven Development)라는 개념을 아무도 몰랐다. 대다수에게 단위 테스트란 자기 프로그램이 ‘돌아간다’는 사실만 확인하는 일회성 코드에 불과했다. 현재는 애자일과 TDD 덕분에 단위 테스트를 자동화하는 프로그래머들이 이미 많아졌다. 하지만, 우리 분야에 테스트를 추가하려고 급하게 서두르는 와중에 많은 프로그래머들이 제대로 된 테스트 케이스를 작성해야 한다는 중요한 사실을 놓쳐버린다. TDD 법칙 세 가지 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 위 세 가지 규칙을 따르면 개발과 테스트가 거의 동.. 2024. 4. 2.