42서울의 과제를 점점 진행하면서, 만들어야 되는 함수의 수도 늘어나고 그에 따라 파일의 양도 늘어 났다. 42서울 노메넷의 기준에 따르면 한 파일에 함수 5개, 함수는 25줄 이상 넘으면 안 될 것, 인자는 5개 아래, 변수 선언도 5개 아래로만 가능하다.
이렇다보니 나는 코드를 짜면서 한 파일, 한 함수에 여러 기능을 꾸겨 넣으려는 시도를 이어갔다 ... 옆에서 그 모습을 지켜보던 daekim님이 "자배님, 응집도 결합도를 한 번 찾아보세요."라고 말했다.
😮 ...? 띠용 짧게, 적은 함수로 구현하는 게 가장 베스트가 아닌가? 라는 생각이 있었는데, 의문을 갖고 응집도, 결합도 그리고 클린코드에 대해서 찾아보았다.
결합도는 낮추고, 응집도는 높여야 유지보수하기 좋은 프로그램이 된다.
프로그램의 한 요소가 해당 기능을 수행하기 위해서 얼마 만큼 뭉쳐져 있는 지 나타내는 정도이다. 응집도는 높을 수록 좋고, 코드 블록의 명확성이 높아지고 구조를 파악하기가 쉽다. 응집도가 높다는 것은 서로 관련된 코드 블록이나 함수가 가까이 있다는 것이다.
응집도가 낮은 코드라면 비슷한 코드가 여러번 반복된다. 또 비슷한 변수들이 여러 곳에 퍼져 있다. 이런 코드는 비슷한 기능을 하는 코드들을 묶어 재사용할 수 있게 만들어야 한다.
코드의 한 요소가 다른 요소와 얼마나 강력하게 연결되어 있는 지 나타내는 정도이다. 즉, 의존적인 정도이다. 결합도는 너무 높은 것보다 낮고(느슨한 결합loose coupling) 명확한 것이 좋다.
결합도가 높은 코드를 수정해야 한다면, 그 코드와 연결된 다른 여러 코드들도 수정해야 하는 지 검토해야하고, 이해해야하고, 수정해야 한다. 또 어쩌면 코드를 다시 써야할 지도 모른다. 반면에 결합도가 낮다면 연결된 코드가 많지 않아 수정사항 또한 많지 않고 유지보수가 쉬워질 것이다.
하나의 코드 블록은 한 가지 작업만 제대로 수행해야 한다. 오히려 기능이 적을 수록 코드의 재활용성은 높아진다. 한 함수의 책임이 많아질수록 코드 블록의 유연성이 떨어지고, 에러 발생의 위험도 높아진다.
함수의 기능을 표현할 때, and
가 있다면 그 함수는 여러 책임을 지고 있다는 것이다. 함수의 이름과 인자만으로 명확하게 표현하기 위해서는 단일책임원칙이 필요하다.
지금 내가 하고 있는 과제를 예를 들자면, 한 함수에서는 하나의 기능만을 하게 만든다. add_and_delete()
이렇게 하기보다, add()
와 delete()
이렇게 분리시키면 각 함수의 기능이 명확하게 될 것이다. 그리고 각 함수들의 기능에 따라 폴더로 묶어줄 수 있다. 파싱에 관련된 함수들은 paring
폴더에, 정렬과 관련된 함수들은 sorting
폴더에, 입력값에 따라 분기해주는 파일은 operating
폴더에 모아준다. 이렇게 응집도를 높이고 결합도를 낮출 수 있다.
과제를 구현을 하고, 평가받기 위해서 내 코드를 잘 설명할 줄 알아야 한다. 그렇지 않으면 평가 시간이 1시간도 훌쩍 넘어갈 때도 있다. 평가자가 과제에서 요구하는 배경적인 이론에 대해서(예를 들면, 알고리즘이라던가 자료구조, 운영체제 등) 모르기 때문에 오랜 시간이 걸리는 것은 상관없지만, 만약 다 아는데 내 코드 설명을 잘 못하고 설명을 해도 두번 세번 물어본다? 그러면 내 코드에 문제가 있는 것이라고 생각한다.
😢 생각해보면 get_next_line
때 그랬던 것 같기도... 그땐 함수 3개로 끝내려고 메인 get_next_line()
함수에 코드를 덕지덕지 붙여놨던 것 같다. 이때까진 뭐 함수나 폴더가 그렇게 많이 필요하던 과제는 아니었어서... 그렇지만 반성합니다🥹
프로젝트 코드도 똑같다. 컴포넌트를 나누어 재사용할 수 있게 하고, 그 안에서 각 기능별로 또 함수를 쪼갠다. 결국 좋은 코드란 무엇인가를 고민한다면... javascript도, c언어도, 결국 모든 코드는 똑같이 보기 쉬워야 하는 것 같다. 보기 쉬워야 나중에 유지 보수도 쉽고, 다른 사람이 피드백을 주기도 쉬워진다.
따라서 함수가 조금 많아지더라고, 파일이 많아지더라도, 단일책임원칙과 높은 응집도와 낮은 결합도를 고려해서 코드를 짜는 게 좋다.
정리 잘하셨어요!! 덕분에 저도 복습하게 되네요.
이번에 랭크 페이지 코드 정리한 거 보니 정말 감탄...!! 대단대단!!!👍👍👍
항상 보고 배우고 따라가고 있습니다 ㅎㅎㅎ