본문 바로가기

개발

보기 좋은 코드 작성

 코딩을 잘하기 위해 갖춰야 할 요소가 뭐가 있을까요?
알고리즘, 디자인 ( 설계 ) , 프로젝트 경험, 운영체제에 대한 이해, 컴파일러에 대한 이해, 네트워크 지식
뭐 셀 수 없이 많을겁니다.
컴퓨터는 평생 공부해야 하는 과목이라고 하니까요

이번 포스팅은 그 중에서도 보기좋은 코드를 작성하는 방법에 대한 내용이예요.
딱히 기술적인 것도 아니고, 대규모 프로젝트를 경험해보기 힘든 대학생으로서는
중요하단걸 알면서도 피부로 느끼기 참 힘든 부분이지만
예전에 작성했던 코드를 보면서 가끔 느끼는 부분입니다.
(진짜 내가 코드를 이따위로 쓴건가 싶어요...)

*이 글은 '전문가를 위한 C++, 마크 그레고리 저' 도서를 읽고 정리한 글입니다.

1. 코드의 문서화

코드를 보고서처럼 짜야되는건가 싶었던 말입니다.
주석을 적절히 잘 써야한다는 말이더라구요
신입생때부터 귀에 못박히게 들은 말이지만 정말 실천 안되는 부분입니다.

주석에 넣어야 하는 내용은 3가지가 있습니다.

  첫 번째는 해당 코드의 사용법인데요, 함수로 예를 들면 파라미터, 리턴 타입 등을 보면 사용법이야 알 수 있지만 예외처리나 재귀, thread 등 함수 선언만 봐서는 알기 힘든 내용을 주석에 표시합니다. 그럼 굳이 코드를 안봐도 코드의 활용법을 알 수 있습니다.
  같은 맥락에서 알고리즘과 같은 고급 코드에도 주석을 달아주는게 좋습니다. 코드에 사용한 알고리즘이 익숙한 사람이야 한눈에 알아보겠지만 그렇지 않은 경우에는 코드를 정독해도 알기 힘든 경우도 있죠. 그런 상황을 피하기 위해 주석을 꼭 달아주는 것이 좋습니다.
  마지막으로 헤더, namespace 등에 대한 메타데이터가 있습니다. 이런 경우 페이지의 맨 상단에 적는 경우가 많습니다.

전 ide를 많이 활용하지 않아서 몰랐는데 ide별로 핫키를 사용해 표준 주석 문구를 자동으로 넣을 수 있더라구요.
잘 활용하면 문서화 시간도 줄이고 보기도 좋은 주석을 넣을 수 있을 것 같습니다.

물론 가장 좋은 문서화는 주석 없이도 한눈에 볼 수 있는 코드를 쓰는거겠죠?

 

2. 코드 분할

함수 하나엔 작업 하나가 이상적이라는건 대부분 개발자들이 다 아는 말이죠
저도 알아요. 근데 실천하기가 쉽지 않더라구요

이미 분할 없이 작성한 코드를 여러 함수로 나누는 작업을 리팩토링이라고 합니다.
리팩토링엔 아래 3가지 방법이 있습니다.

추상화 강화

- 추상화는 인터페이스와 구현 부분을 분리하는 작업을 말해요. 추상화를 위한 가장 쉬운 방법은 private에 코드를 작성하는 것이죠. class내부의 코드는 대부분 private에 선언하고 변수도 getter setter를 사용하는 것이 기본적인 추상화 방법입니다.
- 또 인터페이스에서 문제없이 사용하기 위해 int, char와 같은 범용적인 데이터 타입을 사용하는 것이 좋습니다.

논리적 분할

- 함수 하나엔 작업 하나, 이 말을 지키기 위한 작업이예요. 한 함수를 여러 함수로 나누고, 한 클래스를 여러 클래스로 나누는 작업을 의미합니다.

코드 위치 개선

- 함수의 위치를 더 적절한 소스파일로 바꾸고, 이해하기 쉬운 이름을 쓰도록 바꾸는 작업입니다.
- 제일 이해가 안되는 부분이고 아직 왜 필요한지 모르겠는데 보통 이런게 제일 중요하더라구요. 알아둘 생각입니다.

리팩토링은 한번 작성한 코드를 다시 분할하는 작업입니다.
두번 일하는 거죠
이런 불상사를 막기 위해서는 개발 시작 전에 디자인 작업이 필수적입니다.
프로젝트 규모가 클수록 이런 작업을 머리로 생각하고 작업하는건 불가능에 가까워집니다.
그렇기 때문에 코드 분할을 위해 미리 정해진 디자인 패턴을 사용한다면 작업 시작 시간은 늦춰지더라도 두번 작업하느라 시간을 버릴 일은 없을거예요.

 

3. naming

개발자들이 젤 힘들어하는 부분이죠. 이름짓기
C++의 경우에는 문법적인 제한 이외에 네이밍 규약이 있습니다.

우선 '_'로 시작하거나 단어 사이에 '_'를 두번 쓰는건 라이브러리에서 미리 예약했기 때문에 쓰지 않는게 좋습니다.

아래는 naming convention이라 불리는, 표준적인 네이밍 방법입니다.

- 접두어 : memberData -> mData
             이와 같이 단어를 축약해 한글자만 앞에 붙이는걸 의미합니다.
             global을 g로 쓰는 등 대중적인 접두어는 이해를 돕지만
             나만 아는 접두어는 주석을 쓰던, 알아볼 수 있을 만큼만 줄이는게 좋겠죠?

- 대,소문자를 통한 구별
             대신 C++에서는 단어 구분을 위해 두 번째 단어부터 첫 알파벳을 대문자로 사용해요.
             memberData, controllAction()처럼요.
             변수, 함수와의 구분을 위해 class 이름은 첫 번째 단어도 대문자로 시작합니다.

- 헝가리언 표기법
             ms windows 프로그래머들이 많이 사용하는 방법으로 헝가리 출신의 찰스 시모니가 만들었다고 해요.
             변수, 함수 이름의 사전 쯤으로 이해할 수 있습니다.

 

4. 일관성 있는 코딩

이 부분은 그냥 제 생각입니다.

일관성이라는 말은 괄호의 위치, 줄 간격, 공백의 사용 여부에 대한 일관성을 의미합니다.

int foo(int i){

}

int foo( int i )

{

}

두 함수는 같은 코드지만 괄호 사용도, 공백의 위치도 다르죠.
코드에 전혀 영향도 없고 정말 아무 의미도 없지만 개발자들에겐 매우 신경쓰이는 부분이예요.
쓸데없이 신경쓰여서 읽기 불편해요 정말.
저만 그런건지 개발자들에게 생기는 강박증인지 모르겠지만 개인적으로 중요하다고 생각하는 부분입니다.

 

혼자 코딩을 많이 하다 보니까 잘 못지키는 부분이예요.

이렇게 포스팅해두고 매번 참고하면서 지켜보려 노력할 예정입니다.

'개발' 카테고리의 다른 글

중요 문법  (0) 2018.10.13
개발 일지 Prolog  (0) 2018.09.28