
목차 i - 들어가며 1 - 책을 읽고 배운 내용 1.1 - 공동의 목표를 위해 협력하는 자율적인 객체들의 공동체를 만들어라. 1.2 - 협력에 필요한 책임을 적절한 역할을 수행하는 객체에게 할당해라. 1.3 - 자율적인 객체를 만들기 위해서는 행동(프로세스)이 상태(데이터)를 결정하도록 해라. 2 - 기존의 irc 서버 코드의 문제점 2.1 - 하나의 객체가 하는 일이 너무 많았다. 2.2 - 객체의 캡슐화가 깨져있었다. 3 - irc 서버 리팩토링 하기 3.1 - 구조를 만들고 협력 구성하기 3.2 - 인터페이스 정의하고 할당하기 3.3 - 멤버 함수 구현하기 o - 마무리 i - 들어가며 irc 서버를 C++로 구현하면서 부족한 점을 많이 느꼈다. C++를 사용하는 이유 중 하나가 객체지향 설계를 ..

목차 i - 들어가며 1 - IRC 프로토콜 메시지를 확인하기 위한 환경 설정 1.1 - Docker로 Ubuntu container 만들고 실행하기 1.2 - inspircd, irssi, tcpflow 설치하기 2 - 주고받는 IRC 프로토콜 메시지 확인하기 2.1 - inspircd 서버 구동 2.2 - irssi 클라이언트로 서버에 접속하기 2.3 - IRC 메시지 내용 확인하기 2.3.1 - tcpflow로 메시지 확인하기 2.3.2 - inspircd의 debug 옵션으로 메시지 확인하기 o - 마무리 i - 들어가며 IRC(Internet Relay Chat)에 대한 RFC 문서를 읽고 상용 클라이언트를 사용하는 irc 서버를 구현하고 있다. 그런데 실제 클라이언트와 메시지를 주고 받아보니까..

정신없이 코딩을 하다가 어느순간 정신을 차려보니 헤더파일 목록 상태가 말이 아니다. 정리를 하려고 하는 순간 문득 헤더파일을 정리할 때도 순서가 있는지 궁금했다. A.h, B.h A.h와 B.h 라는 헤더파일이 있다. A.h에서는 B.h 내에 선언되어 있는 함수를 사용한다. 그런데 소스파일 안에서 B.h를 A.h 보다 먼저 포함하고 컴파일 해보자. 컴파일도 잘 되고 실행도 잘 된다! 그런데 여기서 순서를 바꿔 A.h 다음에 B.h를 포함 해보자. 컴파일하면 컴파일 에러가 발생한다. B.h가 먼저 있을때는 소스파일 내에서 A.h 내용 앞에 B.h 내용이 있기 때문에 컴파일 할 때 문제가 없다. 하지만 반대의 경우 A.h의 앞에는 필요한 B.h의 내용이 없어서 컴파일 에러가 발생한다. 헤더 파일 포함(#in..

목차 i - 소개 1 - listen socket 1.1 - 소켓이란? 1.2 - LISTEN 상태 1.3 - LISTEN 상태로 설정하는 방법 2 - listen socket 설정하기 2.1 - socket() 2.2 - bind() 2.3 - listen() o - 마무리 i - 소개 서버가 클라이언트로 부터 오는 요청을 받아 처리하기 위해서는 먼저 client socket을 생성할 수 있도록 서버의 listen socket을 설정해야 한다. socket을 LISTEN 상태로 만들어서 client로 부터 오는 요청을 받을 수 있도록하는 방법을 알아보자. 1 - listen socket 1.1 - 소켓이란? 서버와 클라이언트가 서로 접속하고 통신을 하기 위해서 소켓(socket)을 이용한다. 소켓은 네..
최근에 배열 주소와 크기를 인자로 받아서 퀵소트 알고리즘으로 정렬하는 코드를 작성했다. 책 '클린 코드'에서 배운 교훈을 적용해서 리팩토링 해보았다. 1. 클린 코드에서 얻은 가르침 3가지 이름_의도를 분명히 밝혀라(명확한 이름) 함수_서술적인 이름을 사용하라! 함수_작게 만들어라! 2. 코드 고치기 - 고치기 전의 코드 voidset_array_quick_sorted(int *array, int size) { intpivot = array[size / 2]; inttmp; inti = 0; intj = size - 1; while (i pivot) j--; if (i >= j) break ; tmp = a..
10장. 클래스 작게 쪼개고 정리해서 관리하기 쉽도록 만들자 1. 생각 작은 클래스 여럿으로 쪼개면 더 체계가 잡히고 구조가 투명해진다. 추상 클래스를 이용해 구현을 격리 시켜서 위험을 방지하자. 시스템 요소가 잘 격리되어 있으면 유연성, 재사용성이 높아지고 이해하기도 쉽다. 2. 기억하고 싶은 내용들 - 클래스는 작아야 한다! 응집도(Cohesion) 그렇지만 우리는 응집도가 높은 클래스를 선호한다. 응집도가 높다는 말은 클래스에 속한 메서드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 의미기 때문이다. 응집도가 높아지도록 변수와 메서드를 적절히 분리해 새로운 클래스 두세 개로 쪼개준다. 응집도를 유지하면 작은 클래스 여럿이 나온다 몇몇 함수가 몇몇 변수만 사용한다면 독자적인 클래스로 분리해도 되지..
10장. 클래스 관리하기 쉽도록 하나씩 집중하자. 1. 생각 클래스도 함수와 마찬가지로 작은 크기가 좋다. 하지만 크기의 척도가 함수와는 달리 맡은 '책임'을 기준으로 측정한다. 클래스가 맡은 책임과 변경의 이유가 하나씩이어야 한다. 프로그램을 돌아가게 만드는 것과 깨끗하게 정리하는 것을 별개의 활동이다. 그러므로 실행 가능하게 구현한 다음엔 정리해서 보기 좋게 만드는 작업을 거쳐야한다. 2. 기억하고 싶은 내용들 코드의 표현력과 그 코드로 이루어진 함수에 아무리 신경 쓸지라도 좀 더 차원 높은 단계까지 신경 쓰지 않으면 깨끗한 코드를 얻기는 어렵다. - 클래스 체계 즉, 추상화 단계가 순차적으로 내려간다. 그래서 프로그램은 신문 기사처럼 읽힌다. 캡슐화 때로는 변수나 유틸리티 함수를 protected로..
9장. 단위 테스트 깨끗한 테스트는 즉시 빠르게 행동하고 독립적이고 어디서나 일관성이 있고 확고한 생각을 가진 사람 같다. 1. 생각 깨끗한 테스트는 한 가지에 집중한다. 빠르게 행동하고 독립적이고 어디서나 일관성이 있고 '네, 아니오'로 대답하는 확고한 생각을 가지고 즉시 행동한다. 유연성, 유지보수성, 재사용성을 보존하고 강화시켜서 실제 코드를 좋게 만든다. 2. 기억하고 싶은 내용 - 테스트 당 assert 하나 assert 문이 단 하나인 함수는 결론이 하나라서 코드를 이해하기 쉽고 빠르다. 하지만 때로는 주저 없이 함수 하나에 여러 assert 문을 넣기도 한다. 단지 assert 문 개수는 최대한 줄여야 좋다는 생각이다. 테스트 당 개념 하나 어쩌면 "테스트 함수마다 한 개념만 테스트하라"는 ..
9장. 단위 테스트 좋은 테스트 케이스가 있다면 변화는 두렵지 않아. 1. 생각 테스트 케이스도 실제 코드처럼 깨끗하게 관리하는 것이 중요하다. 깨끗하게 관리된 좋은 테스트 케이스가 있다면 실제 코드를 변경해도 결과를 제대로 확인할 수 있어 새로운 기능 제작이나 개선이 쉬워진다. 좋은 테스트를 먼저 작성하면 곧 바로 좋은 코드가 나온다. 2. 기억하고 싶은 내용들 애자일과 TDD 덕택에 단위 테스트를 자동화하는 프로그래머들이 이미 많아졌으며 점점 더 늘어나는 추세다. 하지만 우리 분야에 테스트를 추가하려고 급하게 서두르는 와중에 많은 프로그래머들이 제대로 된 테스트 케이스를 작성해야 한다는 좀 더 미묘한 (그리고 더욱 중요한) 사실을 놓쳐버렸다. - TDD 법칙 세 가지 첫째 법칙: 실패하는 단위 테스트..
7장. 오류 처리 프로그램 논리와 오류 처리를 분리하자. 1. 생각 논리와 오류 처리를 분리하자. 그래야 다시봐도 코드 이해와 추론이 쉬워지고 유지 보수성이 높아진다. 예외를 사용하여 논리와 오류 처리를 분리하자. 인자로 null이 들어온다면 처리하기 힘들다. 그러므로 애초에 null을 인자로 넘기지 말자. 치르는 비용에 상응하는 이익을 제공하는지 따져봐야한다. 2. 기억하고 싶은 내용들 여기저기 흩어진 오류 처리 코드 때문에 실제 코드가 하는 일을 파악하기가 거의 불가능하다는 의미다. 오류 처리 코드로 인해 프로그램 논리를 이해하기 어려워진다면 깨끗한 코드라 부르기 어렵다. - 오류 코드보다 예외를 사용하라 오류가 발생하면 예외를 던지는 편이 낫다. 그러면 호출자 코드가 더 깔끔해진다. 논리가 오류 처..