SSISO Community

시소당

프로그래밍 과정에서 작명에 관하여

대형 SI 프로젝트의 경우 경험있는 개발자들에게 찾아볼 수 있는 공통점은 개발에 들어가기 전에 작명 지침을 받고자 한다는 점이다. 작명은 생각보다 간단한 문제는 아니다. 개인적으로는 가장 중요한 설계 결정 중에 하나라고 생각한다.

종 종 그다지 바람직하지 않은 방향으로 작명의 기준이 정해지는 것을 볼 때 화가 나기도 한다. 지금보다 널 노련했을때는 대놓고 화를 냈으니까. 얼마 전에도 가능하면 업무 용어를 번역한 단어를 가능하면 그대로 쓰자는 지침에 대해 약어를 기준으로 해야 한다는 개발자를 만났다. 경험이 많은 개발자였는데 권위에 의존해서 다음과 같이 발언해서 감정을 통제하지 못하고 직격탄을 날리기도 했다:

'S모 전자에서도 약자를 기준으로 한다'
'10년 동안 개발하면서 그런 경우는 본 적이 없다'

나 를 포함해 대부분은 변하기 싫어한다. 그리고, 미래를 위해 더 나은 준비를 하려다 보면 현재에 희생을 요구하는 법이다. 종종 약어를 쓰면 생산성이 떨어진다고 말하는 이들도 있는데 이클립스와 같은 IDE를 쓰지 않는 경우나 통용되는 말이다. (2006/12/20 - [자바 프로그래밍/이클립스 노하우] - 적절한 작명을 손쉽게 할 수 있는 바람직한 습관
참조)

사람의 습성에 관계된 문제 외에도 작명의 어려움은 근본적인 원인이 하나 더 있다. 월간마소에 기고할 DDD 관련 기사를 영문으로 작성해야 하는 프로그램과 우리말 사이의 변환 문제가 얼마나 부담스러운 일인지를 돌아보게 되었다. 실제로 프로젝트를 할 때 분석 모델을 구성하는 클래스의 이름을 설계 클래스로 바꾸는 일은 상당한 공수를 요한다. 게다가 상당한 공수를 요할만큼 중요한 일이기도 하다. 하지만, 노력에 비해 좋은 결과가 나오지는 못한다. 무엇보다 마치 DSL처럼 업무를 잘 드러내는 단어가 쓰여야 한다.

그러나, 대부분의 업체가 업무 용어에 대한 영어대역어를 구비하고 있지는 않다. 고객이 모든 용어를 정해주지도 않는다. 그러다 보니 개발자들이 네OO를 뒤져서 작명을 한다. 그러다 보면 자연스럽게 오역이 일어나기 마련이고, 가독성을 높이려는 시도는 퇴색된다.
자바가 요구하는 일종의 관습을 알아야 하기 때문이다.

개발자와 고객이 같은 언어(Ubiquitous Language)를 쓰도록 유도하거나 같은 공간에 머물게 하는 것(XP에서 개발자를 팀원으로 하라는 지침) 모두는 결국 고객과 개발자 사이의 의사소통이 제대로 되게 함이다. 작명의 어려움은 물론 영문화의 문제도 있지만, 궁극은 고객과 개발자의 소통이 어렵다는 것을 보여주는 반증이기도 하다.

관련 글:
월간마소에 기고할 DDD 관련 기사의 모티브가 담긴 글: 2007/06/27 - [소프트웨어 설계/소프트웨어 모델링] - 산만한 글로 주장하는 단일 모델이 요체다~
DSL과 작명이 무슨 관계냐?:  2006/10/01 - [소프트웨어 설계/인터페이스 설계] - 좋은 작명은 internal DSL의 시작

less..

 
역시 엠파스에 썼던 글

Javadoc 보기를 게을리 하지 않으면.. (마치 사전보듯이)
그리고 그들 API 를 닮기를 게을리하지 않으면
별도의 작명 지침이 필요없다.
그러나, 모든 개발자들이 자바를 좋아하는 것은 아니고
이름에 큰 의미를 부여하는 것도 아니고
더러는 자기만의 개성을 고수하려는 분들도 많다. ㅡㅡ;
"사원 ID가 맞는지 확인한다"는 CheckEmpID() 함수로 만들 수도 있다. 하지만, 이런 함수는 단순히 검사만 수행하는지 결과값을 반환하는지 알 수 없다. 디스크 검사를 수행하는 CheckDisk() 함수와 명확히 구별되지 않는다. 이것이 하드 디스크인지 알아내는데 IsHarddisk()와 CheckHarddisk() 함수 이름을 보면 어떤 것이 더 나은지 알 것이다.

IsValidEmpID() 함수와 같은 이름으로 별도의 함수를 만들면 좋다.

"사원 ID에 따른 직급을 구한다" 이 함수는 특정 기준(사원ID)에 따라 직급을 구하는 것이니 GetGrade(사원ID) 라는 이름을 사용할 수 있을 것이다. 그러나, 직급의 이름(대리, 과장, 부장)에 따른 직급을 구하는 함수가 필요할 때 GetGrade(직급명)으로 함수를 작성할 수 없을수도 있다. - 모든 언어가 객체지향의 특징을 제공하는 것이 아니다. PHP4도 그런 예이다 - 때문에 GetGradeByID, GetGradeByName과 같은 함수 명도 사용할 수 있다
위 글은 한빛(http://network.hanbitbook.co.kr/view.php?bi_id=1133)에서 발췌한 것인데 밑줄친 적절한 설명이 땡겨서.. 작명 지침 만들 때 써먹어야겠다.
써먹기 전에.. 글 남겨주신 한동훈님께 감사..^^;

이희승  2005/10/24 23:10 
IsValidEmpID() 는 IsEmpIDValid() 쓰거나, 만약 메소드가 존재하는 클래스가 EmpID 면 isValid() 여야 합니다. IsEmpIDValid() 가 어법상 더 매끄럽기 때문이죠. (주어는 메소드 호출 대상 개체가 된다고 생각해 보세요) 의미는 유사하더라도, 영어로 메소드 이름을 작성하는 것이니 어법을 지켜야 한다고 생각합니다.

내 답변)
저도 동의합니다. 세심하게 보지 못했네요.
윗글에서 배울 점은 checkXXX 와 같은 개발자 시각보다 isXXX 등으로 사용자의 시각으로 메소드이름을 만들어야 한다는 점이구요.
희승님이 지적해주신 것은 어차피 영어로 메소드 이름을 작성한다면 영문법을 지키자는 것이라고 정리할 수 있겠네요. :)



출처 : http://younghoe.info/628

886 view

4.0 stars