😀 책에서 기억하고 싶은 내용을 써보세요.

 

3.1 기이한 이름

  • 코드를 명료하게 표현하는 데 가장 중요한 요소 하나는 바로 ‘이름'이다.
    • 그래서 함수, 모듈, 변수, 클래스 등은 그 이름만 보고도 각각이 무슨 일을 하고 어떻게 사용해야 하는지 명확히 알 수 있도록 엄청나게 신경 써서 이름을 지어야 한다.
    • 마땅한 이름이 떠오르지 않는다면 설계에 더 근본적인 문제가 숨어 있을 가능성이 높다.

3.2 중복 코드

  • 똑같은 코드 구조가 여러 곳에서 반복된다면 하나로 통합하여 더 나은 프로그램을 만들 수 있다.
    • 코드가 중복되면 각각을 볼 때마다 서로 차이점은 없는지 주의 깊게 살펴봐야 하는 부담이 생긴다.

3.3 긴 함수

  • 간접 호출의 효과, 즉 코드를 이해하고, 공유하고, 선택하기 쉬워진다는 장점은 함수를 짧게 구성할 때 나오는 것이다.
  • 짧은 함수로 구성된 코드를 이해하기 쉽게 만드는 가장 확실한 방법은 좋은 이름이다. 함수 이름을 잘 지어두면 본문 코드를 볼 이유가 사라진다.
    • 함수 이름은 동작 방식이 아닌 ‘의도(intention)’가 드러나게 짓는다.

3.5 전역 데이터

  • 전역 데이터가 조금뿐이라면 감당할 수 있겠지만, 많아지면 걷잡을 수 없게 된다.
  • 우리는 전역 데이터가 아주 조금만 있더라도 캡슐화하는 편이다. 그래야 소프트웨어가 진화하는 데 따른 변화에 대처할 수 있다.

3.7 뒤엉킨 변경

  • 코드를 수정할 때는 시스템에서 고쳐야 할 딱 한 군데를 찾아서 그 부분만 수정할 수 있기를 바란다.
    • 이렇게 할 수 없다면 뒤엉킨 변경과 산탄총 수술 중 하나가 풍긴다.
  • 뒤엉킨 변경은 단일 책임 원칙(Single Responsibility Principle, SRP)이 제대로 지켜지지 않을 때 나타난다.
    • 즉, 하나의 모듈이 서로 다른 이유들로 인해 여러 가지 방식으로 변경되는 일이 많을 때 발생한다.
    • 예컨대 지원해야 할 데이터베이스가 추가될 때마다 함수 세 개를 바꿔야 하고, 금융 상품이 추가도릴 때마다 또 다른 함수 네 개를 바꿔야 하는 모듈이 있다면 뒤엉킨 변경이 발생했다는 뜻이다.

3.10 데이터 뭉치

  • 데이터 항목들은 어린아이 같은 면이 있다. 서로 어울려 노는 걸 좋아한다. 그래서 데이터 항목 서너 개가 여러 곳에서 항상 함께 뭉쳐 다니는 모습을 흔히 목격할 수 있다.
    • 이렇게 몰려 다니는 데이터 뭉치는 보금자리를 따로 마련해줘야 마땅하다.

3.12 반복되는 switch문

  • 중복된 switch문이 문제가 되는 이유는 조건절을 하나 추가할 때마다 다른 switch문들도 모두 찾아서 함께 수정해야 하기 때문이다. 이럴 때 다형성은 반복된 switch문이 내뿜는 사악한 기운을 제압하여 코드베이스를 최신 스타일로 바꿔주는 세련된 무기인 셈이다.

3.15 추측성 일반화

  • 이 냄새는 ‘나중에 필요할 거야'라는 생각으로 당장은 필요 없는 모든 종류의 후킹 포인트와 특이 케이스 처리 로직을 작성해둔 코드에서 풍긴다.
    • 그 결과는 물론 이해하거나 관리하기 어려워진 코드다.
    • 당장 걸리적거리는 코드는 눈앞에서 치워버리자.

3.17 메시지 체인

  • 클라이언트가 한 객체를 통해 다른 객체를 얻은 뒤 방금 얻은 객체에 또 다른 객체를 요청하는 식으로, 다른 객체를 요청하는 작업이 연쇄적으로 이어지는 코드를 말한다. ex) managerName = aPerson.department.manager.man;

3.22 데이터 클래스

  • 데이터 클래스란 데이터 필드와 게터/세터 메서드로만 구성된 클래스를 말한다.
  • 그저 데이터 저장 용도로만 쓰이다 보니 다른 클래스가 너무 깊이까지 함부로 다룰 때가 많다.
  • 이런 클래스에 public 필드가 있다면 누가 보기 전에 얼른 레코드 캡슐화하기 로 숨기자. 변경하면 안되는 필드는 세터 제거하기 로 접근을 원천 봉쇄한다.

3.24 주석

  • 주석은 악취가 아닌 향기를 입힌다. 문제는 주석을 탈취제처럼 사용하는데 있다.
  • 주석이 장황하게 달린 원인이 코드를 잘못 작성했기 때문인 경우가 의외로 많다.
  • 주석을 남겨야겠다는 생각이 들면, 가장 먼저 주석이 필요 없는 코드로 리팩토링해본다.

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  • 3.4 긴 매개변수 목록에서 매개변수 객체 만들기는 DTO 객체를 만들어서 서비스단으로 전달하는 것과 같다고 생각했습니다.
  • 세터를 줄이는 이유가 가변 데이터의 유효범위를 줄이기 위한다는 걸 알게 되었습니다.
  • 3.17 메시지 체인은 클린코드에서도 봤던 기차충돌 코드와 똑같았습니다.
    • 확실히 메시지 체인 방식의 코드는 가독성을 확 낮춰줍니다.

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • 주석을 어떻게 하면 잘 달 수 있을까?
    • 각자의 스타일이 달라서 제 기준에 주석을 많이 다는 사람도 봤습니다. 어떤게 정답인지 모르겠지만, 저는 이 책에 나오는 얘기처럼 코드에 최대한의 정보를 담고 거기에 담지 못한 정보를 주석으로 남겨야 한다고 생각합니다.

 

 

 
반응형

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 리팩터링 [명사] (79p)
    => 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법

  • 리팩터링(하다) [동사] (79p)
    => 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 래팩터링 기법을 적용해서 소프트웨어를 재구성하다.

  • 리팩터링은 결국 동작을 보존하는 작은 단계들을 거쳐 코드를 수정하고,
    이러한 단계들을 순차적으로 연결하여 큰 변화를 만들어내는 일이다. (80p)
    • 따라서 래픽터링하는 동안에는 코드가 항상 정상 작동하기 때문에 전체 작업이 끝나지 않았더라도 언제든 멈출 수 있다.

  • 리팩터링은 성능 최적화와 비슷하다. (80p)
    • 둘 다 코드를 변경하지만 프로그램의 전반적인 기능은 그대로 유지한다.
      단지 목적이 다를 뿐이다. 리팩터링은 성능이 좋아질 수도, 나빠질 수도 있다.
  • 나는 소프트웨어를 개발할 때 목적이 ‘기능 추가’냐, 아니면 ‘리팩터링’이냐를 명확히 구분해 작업한다. (81p)
    • 기능을 추가할 때는 ‘기능 추가’ 모자를 쓴 다음 기존 코드는 절대 건드리지 않고 새 기능을 추가하기만 한다.
      진척도는 테스트를 추가해서 통과하는지 확인하는 방식으로 측정한다.

  • 반면 리팩터링 할 때는 ‘리팩터링’ 모자를 쓴 다음 기능 추가는 절대 하지 않기로 다짐한 뒤 오로지 코드 재구성에만 전념한다. (81p)
    • 테스트도 새로 만들지 않는다.
    • 부득이 인터페이스를 변경해야 할 때만 기존 테스트를 수정한다.

  • 같은일을 하더라도 설계가 나쁘면 코드가 길어지기 십상이다. (82p)
    • 사실상 같은 일을 하는 코드가 여러 곳에 나타날 수 있기 때문이다. 그래서 중복 코드 제거는 설계 개선 작업의 중요한 한 축을 차지한다.
    • 코드가 길수록 실수 없이 수정하기 어려워진다.
    • 이해해야 할 코드량도 늘어난다.
  • 프로그래밍은 여러 면에서 마치 컴퓨터와 대화하는 것과 같다. (82p)
  • 프로그래밍은 결국 내가 원하는 바를 정확히 표현하는 일이다. (82p)
  • 문제는 프로그램을 동작시키는 데만 신경 쓰다 보면 나중에 그 코드를 다룰 개발자를 배려하지 못한다는 데 있다. (82p)
  • 코드가 명확하면 버그를 만들 가능성도 줄고, 버그를 만들더라도 디버깅하기 훨씬 쉽다. (84p)
  • 나는 코드를 파악할 때마다 그 코드의 의도가 더 명확하게 드러나도록 리팩터링할 여지는 없는지 찾아본다. (86p)
    • 조건부 로직의 구조가 이상하지 않은지 살펴보기도 하고, 함수 이름을 잘못 정해서 실제로 하는 일을 파악하는 데
      시간이 오래 걸리지는 않는지도 살펴본다.
  • 보기 싫은 코드를 발견하면 리팩터링하자. 그런데 잘 작성된 코드 역시 수많은 리팩터링을 거쳐야 한다. (88p)

  • 오랫동안 사람들은 소프트웨어 개발이란 뭔가 ‘추가’하는 과정으로 여겼다.
    기능을 추가하다 보면 대게 새로운 코드를 작성해 넣게 된다. 하지만 뛰어난 개발자는 새 기능을 추가하기 쉽도록 코드를 ‘수정’하는 것이 그 기능을 가장 빠르게 추가하는 길일 수 있음을 안다. (88p)

  • 리팩터링의 궁극적인 목적은 개발 속도를 높여서, 더 적은 노력으로 더 많은 가치를 창출하는 것이다. ( 92p)
  • 리팩터링의 본질은 코드베이스를 예쁘게 꾸미는데 있지 않다. 오로지 경제적인 이유로 하는 것이다. (93p)
    • 리팩터링은 개발 기간을 단축하고자 하는 것이다.
    • 기능 추가 시간을 줄이고, 버그 수정 시간을 줄여준다.
  • 테스트 주기가 짧다면 단 몇 줄만 비교하면 되며,
    문제를 일으킨 부분이 그 몇 줄 안에 있기 때문에 버그를 훨씬 쉽게 찾을 수 있다. (97p)

  • 자가 테스트코드와 리팩터링을 묶어서 테스트 주도 개발(Test-Driven Development, TDD)이라 한다. (102p)

  • 하드 리얼타임 시스템을 제외한 소프트웨어를 빠르게 만드는 비결은,
    먼저 튜닝하기 쉽게 만들고 나서 원하는 속도가 나게끔 튜닝하는 것이다. (103p)

  • 리팩터링을 자동화하는 가장 어설픈 방법은 소스 코드의 텍스트를 직접 조작하는 것이다. (109p)
    • 리팩터링 도구를 사용해서 리팩터링 진행 (ex. 인텔리제이 IDEA)

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  • 현재 리팩터링을 하고 있는 자그마한 프로젝트가 있는데 거기서 제가 진행하는 리팩터링의 경계가 모호했다는 것을 알게되었습니다.
    • 기능을 추가할 때도 있고, 테스트 코드를 대거 수정할 때도 있었습니다.
      이 책을 읽고 명확하게 어떻게 하는 것이 리팩터링이고 기능 추가인지 알게 되었습니다.
  • 리팩터링은 다른 개발자가 내가 작성한 코드를 보다 쉽게 이해하게 도와준다.
    • 내가 작성한 코드를 다른 개발자가 쉽게 이해하게 한다는 것은 결국 시간을 단축시켜준다.
    • 시간을 단축시키면서 회사는 그만큼의 이득을 취하게 된다.
  • 내가 작성한 글도 이 책을 다시 읽으면서 리팩터링 해보는 것은 어떨까 생각했습니다.
  • 리팩터링은 기능을 구현 할 때도 꾸준히 계속 진행해야 한다는 것을 알게되었습니다.
    • ‘구현을 완료하고 리팩터링을 하자’ 라는 생각이 이 책을 읽기 전까지는 가지고 있었습니다.
  • 테스트 코드 하나도 없고 레거시가 줄비한 코드가 적힌 회사에 파견을 나와있습니다.
    • 여기서 문제점은 이런 레거시 코드를 개선하거나 테스트 코드를 추가할 생각을,
      해당 회사 혹은 해당 회사의 개발자가 절대로 하지 않는다는 것 입니다.
  • 인텔리제이 도구를 제대로 사용하지 못하고 있다는 것을 알게되었습니다.
    • 리팩터링을 할 때 인텔리제이를 적극적으로 사용해서 진행

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • 리팩터링의 소중함을 무시하고 이해하기 어려운 코드를 짜는 개발자와는 어떻게 일 할까?
  • 무조건 커밋을 세세하게 분리하는게 정답은 아닌지?
    • 명확한 이유에서 커밋을 세세하게 분리해야 한다는 걸 이책으로 알게 되었습니다.
    • 단순히 커밋을 세세하게 분리해야 한다는 생각으로 분리하면 안된다.
  • 데이터베이스 관련 리팩터링은 전반적으로 이해도가 부족해서 읽기 힘들었습니다. (99P)
    • 아직 공부가 덜 된 것이라고 생각합니다. 차 후에 무조건 다시 읽어야 할 부분입니다.

 

 

반응형

 

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 리팩터링이란?(7p)
    겉으로 드러나는 코드의 기능(겉보기 동작)은 바꾸지 않으면서 내부 구조를 개선하는 방식으로
    소프트웨어 시스템을 수정하는 과정이다.

  • 프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형태로 리팩터링하고 나서 원하는 기능을 추가한다.(27p)

  • 리팩터링하기 전에 제대로 된 테스트부터 마련한다. 테스트는 반드시 자가진단하도록 만든다.(28p)

  • 조금씩 수정하여 피드백 주기를 짧게 가져가는 습관이 이러한 재앙을 피하는 길이다.(32p)

  • 리팩터링은 프로그램 수정을 작은 단계로 나눠 진행한다.
    그래서 중간에 실수하더라도 버그를 쉽게 찾을 수 있다.(32p)

  • 하나의 리팩터링을 문제없이 끝낼 때마다 커밋한다.
    그래야 중간에 문제가 생기더라도 이전의 정상 상태로 쉽게 돌아갈 수 있다.(33p)

  • 컴퓨터가 이해하는 코드는 바보도 작성할 수 있다.
    사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다.(35p)

  • 임시 변수는 나중에 문제를 일으킬 수 있다. 임시 변수는 자신이 속한 루틴에서만 의미가 있어서 루틴이 길고 복잡해지기 쉽다.(42p)
    • 함수를 직접 선언해 사용하도록 바꾼다.

  • 긴 함수를 작게 쪼개는 리팩터링은 이름을 잘 지어야만 효과가 있다.(44p)
    • 처음에는 당장 떠오르는 최선의 이름을 사용하다가 나중에 더 좋은 이름이 떠오를 때 바꾸는 식이 좋다.
      흔히 코드를 두 번 이상 읽고 나서야 가장 적합한 이름이 떠오르곤 한다.

  • 리팩터링은 대부분 코드가 하는 일을 파악하는 데서 시작한다.(76p)
  • 좋은 코드를 가늠하는 확실한 방법은 ‘얼마나 수정하기 쉬운가’다(76p)

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  • 리팩터링을 하기 위해서는 테스트 코드들 부터 마련해야 한다는 말이 정말 공감됩니다.
    저자의 말대로 사람은 실수를 할 수 있기 때문에 테스트 코드를 통해 수정된 코드를 검증 할 수 있습니다.(28p)

  • 변수명을 축약해서 작성한 것을 많이 봤습니다.
    해당 프로젝트를 진행 할 때 변수명의 의미를 파악하는데 시간을 상당히 많이 소비했습니다.

  • perf라는 변수는 해당 코드를 처음보면 무슨 의미인지 알기 힘들 것 같다고 느꼈습니다.

  • 깃에 커밋 푸쉬를 하는데 코드를 뭉텅이로 하는 사람을 봤습니다.
    결국에 그 사람은 버그가 생겼을 때 해당 버그를 찾는데 엄청난 시간을 쏟았습니다.
    커밋을 잘게 나누는게 정말 중요하다고 느낀 계기였습니다.

  • 책이 되게 친절하게 잘 적혀있었습니다.
    하나의 함수로 작성된 코드를 리팩터링 한 부분을 화살표로 표시해준게 정말 좋았습니다.

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • 대규모 프로젝트에서는 어떻게 리팩터링을 진행하는지 궁금했습니다.
  • 변수명을 축약해서 나타내는 회사들이 많습니다.
    전문용어들의 의미를 변수명에 담을려고 하니까 그렇지 않을까 생각했습니다.
    이런 문제를 어떻게하면 더 좋게 해결할지 궁금했습니다.

  • 얕은 복사와 깊은 복사를 한번 배웠었는데 리팩터링에도 같은 내용이 나왔습니다.
    하지만 해당 내용에 대해 아직 이해가 덜 되어서 이해하는데 조금 힘이 들었습니다.
  • 다형성 부분은 한번 더 봐야 할 것 같습니다.

 

 

반응형

 

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 추이적 탐색을 피하라(395p)
    • 일반적으로 한 모듈은 주변 모듈을 모를수록 좋다.
      => A가 B를 사용하고 B가 C를 사용한다 하더라도 A가 C를 알아야 할 필요는 없다는 뜻이다.
    • 디미터의 법칙이라 부른다.
    • 내가 아는 모듈이 연이어 자신이 아는 모듈을 따라가며 시스템 전체를 휘저을 필요가 없다는 의미다.

  • 서술적인 이름을 사용하라(399p)
    • 이름은 성급하게 정하지 않는다.
    • 소프트웨어 가독성의 90%는 이름이 결정한다.
      => 시간을 들여 현명한 이름을 선택하고 유효한 상태로 유지한다.
    • 신중하게 선택한 이름을 보고 독자는 모듈 내 다른 함수가 하는 일을 짐작한다.

  • 적절한 추상화 수준에서 이름을 선택하라(401p)
    • 구현을 드러내는 이름은 피하라.
    • 작업 대상 클래스나 함수가 위치하는 추상화 수준을 반영하는 이름을 선택하라.

  • 커버리지 도구를 사용하라!(404p)
    • 커버리지 도구는 테스트가 빠뜨리는 공백을 알려준다.
    • 커버리지 도구를 사용하면 테스트가 불충분한 모듈, 클래스, 함수를 찾기가 쉬워진다.

 

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  1. 이전 프로젝트에서 커버리지 도구에서 테스트가 불충분한 모듈도 포함을 시켰었던 게 생각났습니다.
    • 카카오 로그인 API 였었는데 예전에는 그것을 포함시켜야 하나 고민이 되었었습니다.
      이 책을 읽고 불필요한 테스트는 제외해도 된다는 걸 알게 되었습니다.

 

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요. 

  • 코드 커버리지란?
    • 코드 커버리지는 소스 코드를 기반으로 수행하는 화이트 박스 테스트를 통해 측정한다.
      • 블랙박스 테스트
        => 소프트웨어의 내부 구조나 작동 원리를 모르는 상태에서 동작을 검사하는 방식
        => 올바른 입력과 올바르지 않은 입력을 입력하여 올바른 출력이 나오는지 테스트하는 기법
        => 사용자 관점의 테스트 방법이라 볼 수 있다.

      • 화이트 박스 테스트
        => 응용 프로그램의 내부 구조와 동작을 검사하는 테스트 방식이다.
        => 소프트웨어 내부 소스 코드를 테스트하는 기법이다.
        => 개발자 관점의 단위 테스트 방법이라 볼 수 있다.

 

 

 

👀 소감 3줄 요약

  • 일군의 규칙만 따른다고 깨끗한 코드가 얻어지지 않는다.
  • 휴리스틱 목록을 익힌다고 소프트웨어 장인이 되지는 못한다.
  • 전문가 정신을 가진 개발자가 되자!!

 

 

 

 

 
반응형

 

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 알고리즘을 이해하라(383p)
    • 알고리즘을 안다고 생각하지만 실제는 코드가 '돌아갈' 때까지 이리저리 찔러보고 굴려본다.
    • '돌아간다'는 사실은 어떻게 아느냐고? 생각할 수 있는 테스트 케이스를 모두 통과하니까.
      * 이 방식이 틀렸다는 말이 아니다.
    • 구현이 끝났다고 선언하기 전에 함수가 돌아가는 방식을 확실히 이해하는지 확인하라.
      =>  테스트 케이스를 모두 통과한다는 사실만으로 부족하다.
    • 알고리즘이 올바르다는 사실을 확인하고 이해하려면 기능이 뻔히 보일 정도로 함수를
      깔끔하고 명확하게 재구성하는 방법이 최고다.

  • if/Else 혹은 Switch/Case 문보다 다형성을 사용하라(385p)
    1. 대다수 개발자가 switch 문을 사용하는 이유는 그 상황에서 가장 올바른 선택이기보다는
      당장 손쉬운 선택이기 때문이다.
      => switch를 선택하기 전에 다형성을 먼저 고려하라는 의미다.
    2. 유형보다 함수가 더 쉽게 변하는 경우는 극히 드물다. 그러므로 모든 swtich 문을 의심해야 한다.

// 변경 전
if (shouldBeDeleted(timer))

// 변경 후
if (timer.hasExpired() && !timer.isRecurrent())
  • 조건을 캡슐화하라(388p)
    • 부울 논리는 이해하기 어렵다.
    • 조건의 의도를 분명히 밝히는 함수로 표현하라.
  • 부정 조건은 피하라(389p)
    • 부정 조건은 긍정 조건보다 이해하기 어렵다.
    • 가능하면 긍정 조건으로 표현한다.

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  1. Switch/Case 문은 잘 사용하지 않았지만 if/else로 도배된 코드는 많이 봤습니다.
    • 우선적으로 가독성이 상당히 안 좋았습니다.
    • if에 해당하는 조건을 전부 거치기 때문에 상당히 비효율적이라고 느껴졌습니다.
  2. 제가 추상화에 대한 개념이 아직 덜 정립되어 있는 것 같습니다.
    • 우선 책을 읽어야겠다는 생각 때문에 '대략적인 이런 거구나?'라는 생각으로 넘어가고 있습니다.
      추상화의 개념과 예시를 좀 더 찾아보고 고민해봐야 할 것 같습니다.

 

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요. 

  • 추상화란?
    • 컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터
      핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
    • 결국 핵심은 불필요한 코드를 제거하고 중요한 부분을 살리는 것입니다.
  • 다형성이란?
    • 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
    • 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를
      참조할 수 있도록 하여 구현하고 있습니다.

 

 

 

👀 소감 3줄 요약

  • 알고리즘을 이해하지 않고 우선 코드부터 했던 적이 많은데, 책을 읽고  반성하게 되었습니다.
  • 객체지향의 개념이 중요하다는 걸 이번 챕터를 읽고 더욱 강하게 느꼈습니다.
  • 클린코드를 읽었나 보다 그걸 바탕으로 코드에 적용해 봤나 가 중요하다고 생각했습니다.

 

 

 

 

 
반응형

 

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 주석(368p)
    • 부적절한 정보
      => 일반적으로 작성자, 최종 수정일, SPR(Software Problem Report)번호 등과 같은 메타 정보만 주석 사용
      => 주석은 코드와 설계에 기술적인 설명을 부연하는 수단이다.
    • 주석 처리된 코드
      => 누군가에게 필요하거나 다른 사람이 사용할 코드라 생각해 아무도 삭제하지 않는다.
      => 주석으로 남겨진 코드는 그 자리에 남아 매일매일 낡아간다.
      => 주석으로 처리된 코드를 발견하면 즉각 지워버려라!

  • 일반(371p)
    • 한 소스 파일에 여러 언어를 사용한다.
      => 이상적으로는 소스 파일 하나에 언어 하나만 사용하는 방식이 가장 좋다.
      * 혼란스럽고 조잡하다.

    • 경계를 올바로 처리하지 않는다.
      => 스스로의 직관에 의존하지 마라.
      => 모든 경계 조건을 찾아내고, 모든 경계 조건을 테스트하는 테스트 케이스를 작성하라.

    • 중복
      => 코드에서 중복을 발견할 때마다 추상화할 기회로 간주하라.
      => 중복된 코드를 하위 루틴이나 다른 클래스로 분리하라.
      => 이렇듯 추상화로 중복을 정리하면 설계 언어의 어휘가 늘어난다.
      => 추상화 수준을 높였으므로 구현이 빨라지고 오류가 적어진다.

    • 과도한 정보
      => 잘 정의된 모듈은 인테페이스가 아주 작다.
      => 하지만 작은 인터페이스로도 많은 동작이 가능하다.
      => 우수한 소프트웨어 개발자는 클래스나 모듈 인터페이스에 노출할 함수를 제한할 줄 알아야 한다.
      => 클래스가 제공하는 메서드 수는 적을수록 좋다.
      => 정보를 제한해 결합도를 낮춰라.

 

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  1. 지금까지 읽은 내용이 정말 많은 내용이 담겨 있다는 걸 느꼈습니다.
    => 단순히 읽고 끝내는 것이 아닌 그 이론에 해당하는 코드를 보고 직접 타이핑

  2. 클린 코드를 하나의 방향성 같다는 느낌을 받았습니다.
    => 클린코드의 내용과 내가 작성한 코드를 보면서 한번 더 생각하게 만들어 줬습니다.
    => 하나의 방향성을 보여주는 것이지 꼭 지켜야 하는 룰은 아닌 것 같다고 생각했습니다.
    => 우선 클린코드 저자가 절대로 하지 말아야 한다는 규칙은 지키도록 노력해야겠습니다.

 

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요. 

  • 디자인 패턴은 어떻게 공부 할지?
    • 클린코드를 읽으면서, 해당 디자인 패턴을 사용해야 하는 상황을 직접 보고 공부해야 한다는걸 알게되었습니다.
    • 당연하겠지만 단순히 암기를 하는 식의 공부는 휘발성이 심하다는걸 다른 책을 읽고 느꼈습니다.
      => 다른 책은 개념을 알려주고 코드를 보여주고 요약본을 보여주는 형태였습니다.

 

 

 

👀 소감 3줄 요약

  • 친절한 저자의 책에 대한 복습 챕터를 만들어 놔서 복습을 편하게 할 수 있었습니다.
  • 요약본을 통한 읽은 부분을 정확히 이해했는지 확인 할 수 있어서 좋았습니다.
  • 클린코드는 두고두고 읽을 명저라고 느꼈습니다.

 

 

 

 

 
반응형

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 불필요한 주석은 거짓말과 잘못된 정보가 쌓이기 좋은 곳이다.
  • 일반적으로 기반 클래스(base class, 부모 클래스)는 파생 클래스(derivative, 자식 클래스)를 몰라야 바람직하다.
    • ABSTRACT FACTORY 패턴을 적용
    • 추상 메서드로 위임하는 정적 메서드는 SINGLETON, DECORATOR, ABSTRACT FACTORY 패턴 조합을 사용한다.
  • 보이스카우트 규칙
  • 다음 사람은 우리보다 코드를 좀 더 쉽게 이해하리라.
    그래서 보다 코드를  좀 더 쉽게 개선하리라.

 

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  1. 너무 사소한 코드는 테스트할 필요가 없다.
    • 이전 프로젝트에서 코드 커버리지를 채우는 데에만 급급했었던 경험이 있습니다.
      => 중요한 메서드에 테스트를 집중 하고 사소한 건 테스트할 필요 없다는 걸 알게 되었습니다.

 

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요. 

  • 싱글톤이란?
    • 소프트웨어 디자인 패턴에서 싱글턴 패턴을 따르는 클래스는,
      생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에
      호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.

 

 

 

👀 소감 3줄 요약

  • 예전에도 나왔지만 불필요한 주석을 다는 위험을 강조하고 있습니다.
  • 테스트 커버리지 도구를 통해 지표를 확인하면서 테스트 코드를 작성해야 한다는 걸 알게 되었습니다.
  • 리팩터링을 통해 나중에 해당 코드를 개선할 사람까지 생각하는 것이 인상 깊었습니다.

 

 

 

 

반응형

노마드코더

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 코드를 리팩터링 하다 보면 원래 했던 변경을 되돌리는 경우가 흔하다.
    => 리팩터링은 코드가 어느 수준에 이를 때까지 수많은 시행착오를 반복하는 작업이기 때문이다.

  • 세상에 개선이 불필요한 모듈은 없다.

  • 코드를 처음보다 조금 더 깨끗하게 만드는 책임은 우리 모두에게 있다.

 

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  1. 처음 장에서 저자가 얘기했던 지켜야 할 규칙들을 바탕으로 리팩터링 하는 파트였습니다.
    => 이미 깨끗한 코드도 리팩터링할 것이 있다는 것을 알게 되었습니다.
    => 코드를 더욱 깨끗하게 만들어가는 과정은 진짜 장인들의 모습과도 같다고 느꼈습니다.

  2. 클린코드를 읽으면서 매번 느끼지만 내가 작성한 코드를 꼭 둘러보면서 리팩터링 해야겠다고 느꼈습니다.
    => 기능을 만들고 그냥 놔버리는 경우가 많았었습니다.
    => 리팩터링을 아주 조금하면서 많은 성장을 이뤄냈습니다.
    => 테스트코드가 없는 코드는 리팩터링 하는게 힘들다는 것을 느꼈습니다.

 

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요. 

  • 테스트코드 리팩터링은 어떻게 할까?
    • 중복되는 코드는 @Before 어노테이션으로 옮긴다.
    • 하나의 assert 문으로도 충분히 테스트할 수있는 케이스로 리팩터링
      => 너무 많은 assert(단언문)을 가진다면 테스트 케이스가 두 개 이상 포함되어 있는지 의심해본다.
    • 참고한 블로그 -> 링크

 

 

 

👀 소감 3줄 요약

  • 코드를 리팩터링 하다가 예전 코드로 돌리는 경우는 흔한 일이다.
  • 세상에 개선이 불필요한 모듈은 없다.
  • 코드를 처음보다 조금 더 깨끗하게 만드는 장인정신

 

 

 

 

반응형

노마드코더

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

 

public String compact(String message) {
	if (shouldNotCompact())
    	return Assert.format(message, expected, actual);
        
    findCommonPrefix();
    ...
}

private boolean shouldNotCompact() {
	return expected == null || actual == null || areStringsEqual();
}
  • 의도를 명확히 표현하려면 조건문을 캡슐화해야 한다.
    • 조건문을 메서드로 뽑아내 적잘한 이름을 붙인다.

 

public String compact(String message) {
	if (canBeCompacted()) {
    	findCommonPrefix();
        ...
    } else {
    	return Assert.format(message, expected, actual);
    }
}

private boolean canBeCompacted() {
	return expected != null &&  actual != null && !areStringsEqual();
}
  • 부정문은 긍정문보다 이해하기 약간 더 어렵다.
    그러므로 첫 문장 if를 긍정으로 만들어 조건문을 반전한다.

 

 

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  1. 책을 통해 캡슐화를 하는 과정을 직접적으로 보게 되면서 이해를 할 수 있었습니다.
    => 하나의 과정을 보여주면서 더 클린한 코드가 되가는 모습
    => 클린한 코드와 객체지향적 설계 코드가 비슷하다는 것을 느꼈습니다.

 

 

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요. 

  • 보이스카우트 규칙이란?
    • 클린코드 18쪽에 나오는 내용이다. 
    • 잘 짠 코드가 전부는 아니다.
      시간이 지나도 언제나 깨끗하게 유지해야 한다.
    • 지속적인 개선이야말로 전문가 정신의 본질
  • 캡슐화란?
    • 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고,
      실제 구현 내용 일부를 외부에 감추어 은닉한다.
    • 캡슐화를 private이라고 단순하게 이야기하면 안된다는 이유를 알게 되었습니다.

 

 

 

👀 소감 3줄 요약

  • 객체지향 설계의 캡슐화가 클린한 코드를 만드는 과정
  • 부정문은 긍정문보다 이해하기 약간 더 어렵다
  • 코드를 직접 보면서 이론을 설명해줘서 이해하기 수월했습니다.

 

 

 

 

반응형

 

노마드코더

 

 

😀 책에서 기억하고 싶은 내용을 써보세요.

  • 소프트웨어 설계는 분할만 잘해도 품질이 크게 높아진다.
    • 적절한 장소를 만들어 코드만 분리해도 설계가 좋아진다.
    • 관심사를 분리하면 코드를 이해하고 보수하기 훨씬 더 쉬워진다.
  • 그저 돌아가는 코드만으로는 부족하다.
    • 돌아가는 코드가 심하게 망가지는 사례는 흔하다.
    • 단순히 돌아가는 코드에 만족하는 프로그래머는 전문가 정신이 부족하다.
    • 나쁜 코드는 썩어 문드러진다.
  • 나쁜 코드도 깨끗한 코드로 개선할 수 있지만 비용이 엄청나게 많이 든다.
    • 모듈은 서로서로 얽히고설켜 뒤엉키고 숨겨진 의존성이 수도 없이 생긴다.

 

 

 

 

🤔 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.

  1. 프로젝트를 하면서 분할에 대한 것을 팀원분에게 배웠습니다.
    => 작동하는데 문제가 없었던 코드였지만 분할을 하면서 중복되는 코드가 확연하게 줄어들었습니다.
    => 다른 사람의 습관과 코드를 통해 배울게 많다는 것을 느꼈습니다.

 

 

 

 

🔎 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요. 

  • 관심사란?
    • 컴퓨터 프로그램의 코드에 영향을 미치는 특정한 정보 집합이다.
    • 프로그래밍 관점에서 보면 하나의 기능이나 모듈이라고 이해하면 쉽다.
  • 의존성이란?
    • 코드에서 두 모듈간의 연결.
    • 객체지향언어에서는 두 클래스 간의 관계라고도 말함.
    • 일반적으로 둘 중 하나가 다른 하나를 어떤 용도를 위해 사용함.

 

 

 

👀 소감 3줄 요약

  • 소프트웨어 설계는 분할만 잘해도 품질이 크게 높아진다.
  • 나쁜 코드는 썩어 문드러진다.
  • 코드는 언제나 최대한 깔끔하고 단순하게 정리하자.

 

 

 

 

반응형

+ Recent posts