개발 서적

[클린 코드] 형식 맞추기(1)
프로그래머는 형식을 깔끔하게 맞춰 코드를 작성해야 한다. 코드 형식을 맞추기 위한 간단한 규칙을 정하고, 그 규칙을 따라야 한다. 팀으로 일한다면 팀이 합의하여 규칙을 정하고 모두가 그 규칙을 따라야 한다. 가능하다면 규칙을 자동으로 적용하는 도구를 사용하면 더욱 편해진다. 형식을 맞추는 목적 코드 형식은 의사소통의 일환이다. 또한 의사소통은 전문 개발자의 1차적인 의무이다. 오늘 구현한 기능이 다음 버전에서 바뀔 확률은 매우 높다. 하지만 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 줄 수 있다. 오랜 시간이 지나 원래 코드의 흔적을 더 이상 찾아보기 어려울 정도로 코드가 바뀌어도 맨 처음 잡아놓은 구현 스타일과 가독성 수준은 유지보수 용이성과 확장성에 계속 영향을 미친다. 그..

[클린 코드] 주석(2)
나쁜 주석 주석(1)에서 말한 케이스를 제외하고 나머지는 모두 나쁜 주석의 범주에 속한다. 일반적으로 대다수의 주석은 허술한 코드, 변명, 미숙한 결정을 합리화하는 독백이다. - 주절거리는 주석 주석을 달기로 했다면 충분한 시간을 들여 최고의 주석을 달도록 노력하라. 특별한 이유 없이 의무가 또는 프로세스에서 하라고 하니까 주석을 단다면 시간낭비다. 다음 코드를 보자 public void loadProperties(){ try{ String propertiesPath = propertiesLocation + "/" + PROPERTIES_FILE; FileInputStream propertiesStream = new FileInputStream(propertiesPath); loadProperties.l..

[클린 코드] 주석(1)
주석은 코드를 부연 설명해주는 역할을 한다. 하지만 주석으로 좋지 않은 방법으로 짜인 코드를 보완하진 못한다. 표현력이 풍부하고 깔끔하게 짜여진 코드는 주석이 사실상 거의 필요가 없다. 간단한 예를 들어보자 //직원에게 복지 혜택을 받을 자격이 있는지 확인한다. if((employ.flags & HOURLY_FLAG) && (employee.age > 65)); if(employ.isEligibleForFullBenefits()); 위 두 if문은 같은 비교를 하지만 누가 봐도 주석을 달지 않고도 코드만으로 의도를 분명히 할 수 있다. 이와 같이 대다수의 경우 주석으로 만들려는 설명을 함수로 풀어 표현하기에 충분하다. 하지만 특정한 경우에는 주석이 필요할 순 있다. 좋은 주석 법적인 주석 - 특정 회사가..

[클린 코드] 함수(3)
반복하지 않기 중복은 코드의 길이를 늘리고 알고리즘이 변할 경우 중복되는 부분 전부를 수정해야 하고, 하나라도 빠뜨리면 오류가 발생할 확률을 중복의 갯수만큼 높인다. 어쩌면 중복은 소프트웨어에서 모든 악의 근원으로 많은 원칙과 기법이 중복을 없애거나 제어할 목적으로 고안되었다. 예를 들면, E.F.커드는 자료에서 중복을 제거할 목적으로 관계형 데이터베이스에 정규 형식을 만들었고, 객체 지향 프로그래밍은 코드를 부모 클래스로 몰아 중복을 없앤다. 구조적 프로그래밍, AOP(Aspect Orient Programming: 관점지향 프로그래밍), COP(Component Oriented Programming: 컴포넌트지향 프로그램) 모두 어떤 면에서는 중복 제거 전략에 해당된다. 구조적 프로그래밍 에츠허르 데..

[클린 코드] 함수(2)
오류 코드 대신 예외 사용하기 명령 함수에서 오류 코드를 반환하는 형태의 처리는 명령/조회 분리 규칙을 모호하게 위반할 수 있다. 왜냐하면 if문에서 명령을 표현식으로 사용하기 쉬운 구조가 되기 때문이다. if(deletePage(page) == OK){ ... } 위 코드는 여러 단계로 중첩되는 코드를 발생시킨다. 오류 코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 하기 때문이다. if (deletePage(page) == OK) { if(registry.deleteReference(page.name) == OK) { if(configKeys.deleteKey(page.name.makeKey()) == OK){ logger.log("Page deleted"); }else{ logger.log("..

[클린 코드] 함수(1)
명령과 조회 명확히 분리하기 함수는 무엇인가를 수행하거나, 답하거나 둘 중 한가지만을 해야한다. 객체의 상태를 변경하거나, 객체의 정보를 반환하거나 둘 중 하나만 해야한다는 말이다. 예를 들어 다음 함수를 예를 들어 보자. fun set(attr: String. value: String): Boolean { ... } 위 set 함수는 이름이 attr인 속성을 찾아 값을 value로 바꾼 후 성공한다면 true를 실패한다면 false를 리턴한다. 문제는 이런 메소드를 사용하면 아래와같은 어색한 형태의 코드가 나온다. if(set("name", "MJ")){ ... } 이런 형태의 메소드가 가지는 단점은 누군가가 이 코드를 볼때 "name"이 "Tom"으로 설정 되어있는지 체크하는 코드인지, 아니면 "na..