클린코드 도입부를 읽으면서 깨끗한 코드의 중요성에 대한 인사이트를 느꼈다🤔
만약 관리자의 압박에 쫓겨서 요구사항을 코드로 구현한다고 하자.
당장의 프로그램은 완성할수 있을것이다. 하지만 1~2년 나아가서 몇년 동안 프로그램의 기능을 추가하고 개선해 나간다고 생각해보자.
당장의 요구사항을 구현해나간 더러운 코드는 새로운 기능을 한개 추가하는데도 수 많은 패키지, 클래스를 수정해야한다.
또, 수년간 쌓여온 더러운 코드들은 이후의 프로그램의 유지보수와 생산성을 0에 가깝게 저해 시킨다.
그래서 깨끗한 코드가 중요한 것이다.
왜냐하면, 기능을 추가해도 보수할 곳이 적고, 언제 봐도 쉽게 기능을 수정 할수 있는 생산성이 높은 프로그램을 만들수 있기 때문이다.
그렇다면, 깨끗한 코드를 만들기위한 첫걸음은 무엇일까❓❓
읽기쉽고 이해하기 쉬운 이름을 만드는 것이다.
언제 ∙ 누가봐도 이해하기 쉬운 이름을 만들기위한 클린코드 2장의 내용을 정리해보자!
소프트웨어에서 이름은 어디에나 쓰인다. 변수, 함수 에도 이름을 쓰고 인수와 클래스, 패키지에도 이름을 쓴다. 이외에도 소스 파일, 디렉터리, jar파일에도 이름을 붙인다.
이렇게 많이 사용하므로 이름을 잘 지으면 유지보수에 어느 부분이 필요한지 쉽게 이해할수 있다.
아래에 이름을 잘 짓는 간단한 규칙을 몇가지 정리해 보겠다❗
변수나 함수, 클래스의 이름에 의도를 밝히는 것이다.
여기서 말하는 의도는 변수나 함수, 클래스의 존재 이유, 수행 기능, 사용방법을 드러내는 것이다.
이름으로 변수나 함수, 클래스가 무슨 의도 ∙목적을 가지는지 알 수 있게끔 한다면 코드를 읽는 사람이 해당 코드의 목적을 쉽게 이해 할 수 있다.
이름으로 의도를 드러낼때, 그릇된 정보를 제공한다면 코드를 읽는 사람으로 하여금 혼동을 줄 수 있다.
예를들어, 여러 계정을 그룹으로 묶을 때 실제 List가 아닌데도 accountList라는 이름을 사용한다고 생각하자.
accountList를 읽는 사람은 계정을 담은 컨테이너가 List일거라고 추측할 것이다. 읽는 사람에게 하여금 그릇된 정보를 준 것이다.
이후에, 읽는 사람이 List가 아님을 알게 된다면 자신이 이해한 코드의 흐름에 큰 혼동을 줄 것이다.
그렇기 때문에, 그릇된 정보를 줄 수 있는 이름은 피해야 한다.
누구나 발음하기 쉽다는 것은 단어의 뜻을 금방 알고 이름이 가지는 의도를 이해하기 쉽다는 것이다.
깨끗한 코드는 다른사람이 보았을 때도 이해하기 쉬워야한다. 그러므로 발음하기 쉬운 이름을 사용하여 이해를 도와야 한다.
프로그램을 개발하던 중 특정 기능에 버그가 발생하여 보수를 한다고 생각해보자.
관련된 메소드를 검색하기 위해 메소드 이름을 입력했는데 검색한 이름에 포함되는 메소드가 100개가 나온다고 생각해 보면 멘붕이 올것이다.
그러므로 이름이 길어진다 해도 검색하기 쉬울 이름을 만들어 주어야 이후에 유지보수가 쉬워 진다.
굳이 인코딩을 하지 않아도 이름에 인코딩할 정보는 상당히 많다.
또한 새로운 개발자가 프로그램 유지보수에 참여한다면 익혀야 할 코드 양이 상당히 많을것 이다.
그런데 인코딩한 언어까지 익히게 하는 것은 비효율적이고 비합리적이다.
클래스 이름과 객체 이름은 명사나 명사구가 적합하다.
메서드 이름은 동사나 동사구가 적합하다.
접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set ,is를 붙인다.
또한, 생성자를 중복 정의 할때는 정적 팩토리 메서드를 사용한다.
(우테코 다음미션에 고려하여 진행해볼 예정이다!)
팩토리 메서드는 인수를 설명하는 이름을 사용한다.
의도를 드러내고자 쓴 이름이 특정 집단, 지역에서만 통용되는 기발한 이름이라면, 다른 지역의 코드를 읽는 사람은 "이게 뭐지??" 할것이다.
그러므로 누가봐도 이해할 수 있고 통용되는 이름을 사용 해야한다.
예를 들어, 객체의 필드에 접근하는 기능에 대해 클래스마다 get, fetch, retrieve와 같이 제각각으로 부른다면 코드를 읽는 사람 입장에서는 같은 기능인데도 객체마다 각기 다른 이름에 혼란이 올것이다.
그러므로 한 개념에 대해서는 전체 코드가 한 단어를 활용하여 이름을 지어야 한다.
스스로 의미가 분명한 이름이 없지 않다. 하지만 대다수의 이름은 그렇지 못하다. 그래서 클래스, 함수, 이름 공간에 맥락을 부여하여 의미를 분명하게 해주어야한다.
예를들어, firstName이라는 변수는 이름의 성을 말하는지 주소 시작을 말하는지 헷갈린다.
그러므로 addrFirstName과 같이 맥락을 추가하여 의미를 들어내야 한다.
이름의 의도를 들어내기 위해 맥락을 추가하는 것은 좋지만, 불필요한 맥락을 추가하는 것은 가독성을 떨어뜨리는 문제를 가져온다.
일반적으로 긴이름보다 짧은 이름이 좋기 때문에 꼭 필요한 맥락만을 사용해야 한다.
깨끗한 코드의 시작은 이름을 짓는것에 시작한다는 것을 느꼈다.
의도가 드러나고 누구나 이해하기 쉬운 이름은 분명 잘 만들어진 소설을 읽는 것과 같이 읽기 좋은 코드를 만들 것이다❗❗