Study
-
13. 모델링 : 클래스 설계의 토대Study/내 코드가 그렇게 이상한가요? 2024. 2. 26. 06:18
동작 원리와 구조를 간단하게 설명하기 위해, 사물의 특징과 관계를 그림으로 나타낸 것을 모델, 모델을 만드는 것을 모델링이라고 한다. 1. 악마를 불러들이기 쉬운 User 클래스 로그인 사용자를 나타내는 User 클래스는 웹 서비스에서 자주 볼 수 있다. 이러한 User 클래스는 사양 변경이 굉장히 잦아서 여러 문제를 일으키기 쉽다. class User { int id; String name; String email; String passwordDigest; String address; String phoneNumber; String bio; String url; int discountPoint; String themeMode; LocalDate birthday; String corporationNumb..
-
12. 메서드(함수) : 좋은 클래스에는 좋은 메서드가 있다Study/내 코드가 그렇게 이상한가요? 2024. 2. 13. 06:23
메서드 설계가 좋지 않으면 클래스 설계가 나빠지고, 반대로 메서드 설계가 좋으면 클래스 설계도 좋아진다. 클래스 설계 방법을 염두에 두고, 메서드를 어떻게 설계하면 좋을지 집중적으로 알아보자. 1. 반드시 현재 클래스의 인스턴스 변수 사용하기 인스턴스 변수를 안전하게 조작하도록 메서드를 설계하면, 클래스 내부가 정상적인 상태인지 보장할 수 있다(3장 참고). 각 메서드는 반드시 현재 클래스의 인스턴스 변수만 사용하도록 설계하는 것을 기본 원칙으로 잡는다. 여기에 각 메서드에 인스턴스 변수를 안전하게 조작하는 로직을 추가하거나, 생성자에는 완전 생성자 패턴을 사용해서 가드를 만들어두면 인스턴스 변수를 안전하게 사용하기 위한 첫걸음을 뗀 것이다. 다른 클래스의 인스턴스 변수를 변경하는 메서드는 응집도가 낮은..
-
11. 주석 작성 방법Study/내 코드가 그렇게 이상한가요? 2024. 2. 12. 21:59
주석은 코드를 더 쉽게 이해하는 데 도움이 되기 위해 작성하지만, 오히려 읽는 사람을 혼란스럽게 만들 수도 있다. 읽는 사람에게 도움을 주어 유지 보수와 변경의 정확성을 높이는 주석 작성 방법에 대해 알아보자. 1. 내용이 낡은 주석 서비스의 사양은 계속해서 변화한다. 하지만, 업무가 바쁘고 충분히 주의하지 않으면 코드가 변경되면서 주석은 변경되지 않는 경우가 생긴다. 이처럼, 정보가 오래되어 구현 상태를 제대로 설명하지 못하는 주석은 내용이 낡은 주석이므로 주의해야 한다. 가짜 정보를 담고 있는 주석은 읽는 사람에게 혼란을 주고, 이로 인해 버그를 발생시킬 가능성이 있다. 주석이 낡아 버리지 않게, 구현을 변경할 때 주석도 함게 변경하는 것이 좋다. 이 때, 주의해야 할 점은 아래와 같다. 주석은 실제..
-
10. 이름 설계 : 구조를 파악할 수 있는 이름Study/내 코드가 그렇게 이상한가요? 2024. 2. 11. 16:55
이름을 짓는 기본적인 방법은 목적 중심 이름 설계이다. 이는 소프트웨어가 달성해야 하는 목적을 기반으로 이름을 설계하는 방법으로, 이름에서 목적과 의도를 읽고 이해할 수 있게 설계해아 한다는 것이다. 1. 부적절한 이름 온라인 쇼핑몰을 예로 들어보자. 흔히 볼 수 있는 좋지 않은 이름 설계는 상품을 그대로 '상품 클래스'라고 이름을 붙이는 것이다. 대부분의 로직이 상품을 중심으로 이루어지는 온라인 쇼핑몰 특성상 '상품 클래스'라고 단순하게 이름을 붙이는 순간, 해당 클래스는 수많은 클래스와 관련 있는 로직을 갖게 되고 점점 거대하고 복잡해진다. 1.1 관심사 분리 상품은 예약, 주문, 발송 등 다양한 관심사와 연관이 있다. 즉, 상품 클래스는 다양한 관심사와 결합되어, 온갖 것과 관련된 로직을 품게 되는..
-
9. 설계의 건전성을 해치는 여러 악마Study/내 코드가 그렇게 이상한가요? 2024. 2. 11. 05:15
이번 장에서는 지금까지 소개한 것 이외의 나쁜 코드 및 대처 방안을 공부한다. 1. 데드 코드 절대 실행되지 않는 조건 내부에 있는 코드를 데드 코드(dead code) 또는 도달 불가능한 코드(unreachable code)라고 부른다. 이러한 코드는 여러 문제를 일으킨다. 코드의 가독성을 떨어뜨린다. 코드를 읽는 사람이 데드 코드 주변을 읽을 때마다, 해당 코드가 어떤 조건에서 실행되는지 생각하게 만든다.(실제로는 실행되는 경우가 없는데도 말이다. 이는 숨겨둔 의도가 있는 것은 아닌지 생각하느라 에너지를 소비하게 한다.) 언젠가 버그가 될 가능성이 있다. 지금까지는 실행되지 않았지만, 사양 변경에 의해 도달 가능한 코드로 바뀔 수 있다. 이렇게 되살아난 코드가 변경된 사양과 다르다면 버그가 된다. 데..
-
8. 강한 결합 : 복잡하게 얽혀서 풀 수 없는 구조Study/내 코드가 그렇게 이상한가요? 2024. 1. 17. 00:44
결합도란 '모듈 사이의 의존도를 나타내는 지표'라고 할 수 있다. 어떤 클래스가 다른 클래스에 많이 의존하고 있는 구조를 강한결합(tightlycoupling)이라고 부른다. 강한 결합 코드는 이해하기 힘들고, 변경하기도 굉장히 힘들다. 이 장에서는 강한 결합을 결합도가 낮은 구조인 느슨한 결합(loose coupling)으로 개선하여 코드 변경과 이해가 쉬운 구조를 만드는 방법을 알아본다. 1. 결합도와 책무 소프트웨어가 출력, 금액 계산, 데이터베이스 등의 다양한 관심사를 가질 때, 만약 출력에 버그가 있는데 데이터베이스 로직을 수정하는 것은 말이 안 된다. 출력을 제대로 하는 것은 출력하는 로직의 책임이라고 할 수 있다. 즉 소프트웨어의 책임이란 '자신의 관심사와 관련해서, 정상적으로 동작하도록 제..
-
7. 컬렉션 : 중첩을 제거하는 구조화 테크닉Study/내 코드가 그렇게 이상한가요? 2024. 1. 16. 21:48
이 장에서는 배열과 List와 같은 컬렉션에서 발생할 수 있는 다양한 문제 사례들을 알아본다. 1. 이미 존재하는 기능을 다시 구현하지 말기 바퀴의 재발명 이미 널리 사용되고 있는 기술과 해법이 존재하는데도, 이를 전혀 모르거나 의도적으로 무시하고 비슷한 것을 새로 만들어 내는 것 대부분의 언어에서는 표준 컬렉션 라이브러리에 많은 기능이 구현되어 있다. 반복문을 사용해서 컬렉션을 직접 조작하고 있다면, 잠시 멈추고 표준 라이브러리에 같은 기능을 하는 메서드가 있는지 확인해보자. // 반복문을 사용하여 List를 직접 조작하는 예시 boolean hasPrisonKey = false; for (Item each : items) { if (each.name.equals("prisonKey")) { hasPr..
-
6. 조건 분기 : interface 활용하여 복잡한 조건 분기 제거하기Study/내 코드가 그렇게 이상한가요? 2024. 1. 6. 20:59
조건 분기는 조건에 따라 처리 내용을 전환하는 꼭 필요한 구조이지만, 조건이 복잡해지면 코드의 동작을 이해하기 힘들고 유지보수 시 여러 버그를 만들 수 있다. 이 장에서는 조건 분기를 잘 다루어 버그가 없는 설계를 만드는 방법을 설명한다. 1. 중첩되는 조건 분기 제거하기 코드를 보다보면 if 조건문이 여러 개 중첩되어 사용된 경우가 있다. 조건 분기의 중첩은 코드의 가독성을 크게 떨어뜨린다. if (조건) { // ... if (조건) { // ... if (조건) { // ... if (조건) { // ... } else { // ... } } } } 중첩 구조 사이사이에 수많은 코드가 섞여 있으면, 각 조건문의 범위를 찾기도 매우 힘들고, 각 조건에 따라 어떤 로직이 처리되는 지 알기 힘들다. 이런..