의미있는 간결한 방법 명명 지침


25

최근에 나는 오픈 소스 프로젝트를 발표하기 시작했는데 라이브러리의 유일한 사용자는 이름에 관심이 없었지만 배우기 쉽도록 각 방법에 영리한 이름을 할당하고 싶습니다. 간결한 이름으로 작성하기도 쉽습니다.

나는 이름 지정에 대한 몇 가지 지침을 생각하고 있었고, 편지 케이스 또는 간단한 메모에만 관심이있는 많은 지침을 알고 있습니다. 여기서는 의미는 있지만 간결한 이름 지정에 대한 지침을 찾고 있습니다.

예를 들어, 이것은 내가 찾고있는 지침의 일부일 수 있습니다.

  • 기존 항목을 대상에 추가 할 때는 추가를 사용하고, 새 항목을 작성하고 대상에 추가 할 때는 생성을 사용하십시오.
  • 기존 항목이 대상에서 제거 될 때 제거를 사용하십시오. 항목이 영구적으로 제거 될 때 삭제를 사용하십시오.
  • AddXXX 메소드를 RemoveXXX 및 Pair CreateXXX 메소드를 DeleteXXX 메소드와 쌍으로 연결하지만 혼합하지 마십시오.

위의 샘플에서 볼 수 있듯이, 영어 문법 및 단어 의미를 준수하는 명명 방법 및 기타 항목을 도와주는 온라인 자료를 찾고 싶습니다.

위의 지침은 영어를 모국어로 사용하는 사람에게는 직관적 일 수 있지만 영어가 제 2 언어라는 사실에 대해서는 이와 같은 것들에 대해 이야기해야합니다.


사이트에 오신 것을 환영합니다! 이 관련 질문이 도움이 될 수 있습니다 : programmers.stackexchange.com/questions/14169/…
Adam Lear

1
나는 당신의 계획이 이미 의미가 있기 때문에 간결한 부분이 의미있는 부분보다 더 중요하다고 생각합니다. 여분의 마일을 갈 계획이라면 일관성을 유지하십시오.
yannis

7
설명은 간결함보다 중요합니다. 대부분의 IDE는 완성을 제공하므로 길이는 문제가되지 않으며 설명적인 이름을 이해하고 기억하기가 더 쉽습니다.
Caleb

@AnnaLear 나는 다른 것을 요구하고 있는데, 내 질문은 명명을위한 제안 된 용어 나 다른 사람들이 방법의 목적을 더 잘 이해하도록 도울 수있는 문법 노트와 관련이있다.
000

3
읽기 쉬운 것이 간결한 것보다 중요합니다. 모든 최신 IDE에는 코드 완성 기능이 있으므로 입력 방법을 쉽게 만드는 것보다 메서드의 기능을 쉽게 찾을 수 있습니다.

답변:


34

명명. 소프트웨어 개발에서 가장 어려운 것 중 하나 :)

이름을 지정할 때 다음과 같은 우선 순위가 있습니다.

  • 내 언어의 관용구를 따르십시오. 루비는 밑줄을 좋아합니다. Javascript는 낙타 케이스를 좋아합니다. 어떤 언어를 사용하든 따라야 할 규칙이 있습니다.
  • API의 의도를 보여줍니다. "send_http_data"가 아니라 "post_twitter_status"입니다.
  • 구현 세부 정보가 유출되지 않도록하십시오. 변수에 유형을 접두어로 붙이십시오.
  • 이전 지침을 위반하지 않고 필요한 것보다 많은 문자를 사용하지 않습니다.

분명히 이것은 다소 단순한 접근법입니다. 명명이 미묘합니다.

더 많은 연구를 위해, 메소드 이름 지정에 대한 간결한 조언을 제공하기 때문에 The Art of Readable Code를 읽는 것이 좋습니다 . 더 많은 연구를 위해 Bob Martin의 Clean Code를 더 강력하게 추천 할 수는 없습니다.


2
정답과 클린 코드 추천을 위해 +1 나는이 책을 강력히 추천한다. 내가 추가 할 한 가지 더, 이것은 Martin의 책에서 나온 것입니다. "코드를 쉽게 작성하고 싶습니다"는 코드를 읽을 수있는 것보다 우선 순위가 훨씬 낮습니다. 분명히 너무 긴 이름과 같은 것이 있지만, 나는 쓰기 쉬운 이름보다 더 읽기 쉬운 긴 이름에 항상 의지합니다. 또한 대부분의 최신 IDE에는 자동 완성 기능이 있습니다.
DXM

3
Robert Martin의 저서에서 한 가지 더 중요한 아이디어는 다음과 같습니다. 방법의 경우-장거리 짧은 이름, 짧은 범위 긴 이름. 변수의 경우 역-짧은 범위 짧은 이름, 긴 범위 긴 이름입니다.
Patkos Csaba

"클린 코드"나에게 도움이 가장 큰 책이었다 영향을 이해하는 코드의 가독성을 내가 정기적으로 따라 모범 사례를 나열

메소드 이름의 의도를 드러내는 한 가지 질문은 메소드 재사용성에 영향을 미치지 않습니까? post_twitter_status는 너무 구체적입니다.
EresDev

예, 아니오 이 특정 메소드 는 재사용이 쉽지 않을 수 있지만, 항상 핵심 동작이있는 메소드를 추출하여보다 일반적인 클래스로 이동하고 이전 메소드를 "이음새"로 남겨 둘 수 있습니다. 이렇게하면 중복을 피해야 하는 경우 인터페이스를 변경하지 않고도 할 수 있습니다 .
Zee

7

이름 지정을위한 스타일이나 규칙을 체계화하려는 유혹은 일부 경우에 헝가리 표기법을 사용하는 것과 같이 오늘날 습관이 좋지 않은 습관으로 이어질 수 있습니다. 간단한 대답은 별도의 결정이 필요한 것처럼 명명 규칙과 스타일을 잊어 버리는 대신 실제로 나타내는 것을 기반으로 시스템의 모든 명명에 집중하는 것입니다. 메소드 이름은 개념적으로 한 가지만 수행하도록 각 메소드의 기능을 제한하고 메소드 이름이 실제로 메소드가 수행해야하는 한 가지를 설명하는 경우 자연스럽게 간결한 경향이 있습니다.

변수, 필드, 클래스 및 파일 이름은 다른 것입니다. 변수 이름이 너무 길어지면이 항목을 너무 자세하게 설명하거나 더 작은 부분으로 나뉘거나 더 추상적으로 설명 해야하는 복잡한 것을 나타내는 것이 좋습니다 방법.

하루가 끝나면 전체 행을 차지하거나 그 가치를 빼앗길 정도로 이름이 나쁜 못생긴 코드를 피하려고합니다.


6

나를 위해, 뭔가 좋은 이름을 찾는 것은 항상 그 존재를 정당화 해야하는 대상 으로 생각합니다 . 자신에게 물어:

  • 클래스 / 메소드 / 변수는 무엇을 하는가? 즉 더 넓은 목적과 목적은 무엇인가?
  • 의사 소통의 목적에 대해 구체적으로 무엇을해야합니까? 즉, 이름에 필요한 필수 부분은 무엇입니까?

대부분의 개발자는 이름을 지정할 때 가독성 이 항상 가장 중요하다는 데 동의합니다 . 코드를 작성하는 동안 의미를 알 수 있도록 코드를 작성하지 말고, 미래에 어느 시점에서 처음으로 코드를보고있는 사람이 너무 많이 생각하지 않아도 자신이 의미하는 바를 알 수 있도록 코드를 작성하십시오. 코드는 한 번만 작성하지만 수명 기간 동안 여러 번 편집하고 더 많은 시간을 읽어야 할 것입니다.

코드는 자체 문서화 되어야합니다즉, 이름을 지정하면 무엇을하는지 분명하게 알 수 있습니다. 주석에서 코드 행이 수행하는 작업을 설명해야하고 이름을 바꾸어도 충분하게 개선되지 않는 경우 해당 행을 적절한 설명 이름을 가진 새 메소드로 리팩토링하여 원래 메소드를 읽으십시오. 새로운 메소드 호출은 무슨 일이 일어나고 있는지 설명합니다. 긴 이름을 갖는 것을 두려워하지 마십시오. 물론 클래스 / 메소드 / 가변 이름으로 소설을 쓰면 안되지만, 이름이 너무 짧고 너무 짧기 때문에 그 이름을 너무 짧게해서 후드 아래를 살펴보면서 그 내용을 알아 내야합니다. x / y 좌표 및 일반적으로 사용되는 약어와 같은 명백한 예외를 제외하고 단일 문자 이름과 약어는 사용하지 마십시오. "backButton"대신 "bkBtn"호출

귀하의 언어가 허용하는 한, 영어 문장처럼 코드를 읽도록하십시오. 객체는 명사를 사용하고 메소드는 동사를 사용합니다. 부울 메서드는 일반적으로 "is"로 시작하지만 "can", "should"또는 "does"와 같이 사용 사례에 따라 의미를 더 잘 전달하는 다른 옵션이 많이 있습니다. 물론 모든 언어가 스몰 토크만큼 좋은 것은 아니지만 일부 기호는 일반적으로 문장의 일부로 이해됩니다. 개인적으로 가능한 한 다른 언어로 받아들이는 두 가지 스몰 토크 규칙은 루프 매개 변수 이름 앞에 "each"를 붙이고 메서드 매개 변수 앞에 "a"(또는 "an"또는 "일부"모음)를 붙입니다. . 이것은 Java의 일반적인 표준이 아닐 수 있으며 누구나이 비트를 무시할 수 있습니다. 그러나 이것이 코드의 가독성을 크게 향상시킵니다. 예를 들어 (Java의 예) :

public boolean shouldConsiderAbbreviating(List<String> someNames) {
  for (String eachName : someNames) {
    if (isTooLong(eachName)) {
      return true;
    }
  }
  return false;
}

이것은 다음과 같이 Java에 대한 약간의 지식을 가진 사람들이 읽을 수 있어야합니다.

일부 이름 (문자열) 목록의 약어를 고려해야하는지 여부를 결정하려면 일부 이름을 반복하고 각 이름에 대해 이름이 너무 긴지 판별하십시오. 그렇다면 반환 true; 너무 길지 않으면를 반환하십시오 false.

위의 코드를 인수 strings와 루프 변수의 이름을 지정하는 것 string, 특히 더 복잡한 방법으로 대조하십시오 . 이름을 한눈에 알 수있는 사용법 대신 차이점을 자세히 살펴보아야합니다.


3

좋은 이름을 찾는 것은 항상 더 많은 요소 사이의 타협입니다. 당신은 완전히 만족하지 않을 것입니다.

즉, 모국어가 그런 방식이 아니더라도 영어는 프로그래밍 언어 토큰이 형성된 언어라고 생각하십시오. 영어와 유사한 구문을 사용하면 키워드를 찾을 때마다 "깨진 읽기 규칙"이 없으므로 코드 읽기가 더 "유창합니다".

일반적 object.method(parameters)으로과 같은 체계와 일치하는 것을 고려하십시오 subject.verb(complements).

일반 프로그래밍을 지원해야하는 경우 핵심은 적절하고 일관된 "동사"집합 (특히 일반 알고리즘에 사용해야하는 동사)을 선택하는 것입니다.

명사에 관해서는, are개념의 개념에 따라 클래스의 이름을 지정해야하고 , 개념에 대한 객체를 지정해야합니다 are for.

즉, 첫 번째 사이 list.add(component)component.add_to(list)선호합니다. 일반적으로 "활성 전이"동사는 수동적 또는 반사적 대응에 대한 행동을 더 잘 나타냅니다. 디자인이 당신을 방해하지 않는 한.


2

메소드 이름의 길이에 대해 걱정하지 마십시오. 메소드 이름이 수행중인 작업을 명확하게 반영하는지 확인하십시오. 이것은 다른 무엇보다 중요합니다. 분석법 이름이 너무 길다고 생각되면 동의어 사전을 사용하여 같은 것을 의미하는 더 짧은 단어를 찾으십시오. 예를 들어 Find대신에 사용하십시오 Retrieve.

또한 중요한 것은 수업에 선택한 이름입니다. 메소드 이름을 볼 때 많은 컨텍스트를 제공합니다. 다음과 같은 메소드 서명 :

public User Find(int userId);

다음보다 이해하기 쉽습니다.

public Person Find(int personId);

클래스 이름에서 얻은 컨텍스트 는 특정 유형의 사람, 시스템의 사용자를 찾는 User프로그래머에게 알려 주기 때문 Find()입니다. Person클래스 를 사용하는 버전 은 왜 메소드를 사용해야하는지에 대한 컨텍스트를 제공하지 않습니다.


1

플랫폼의 다른 사람들이 어떻게 작동하는지 살펴보십시오. 더 큰 규모의 플레이어 중 일부는 코드 스타일과 이름 지정 지침을 가지고있을 수도 있습니다.

일부 플랫폼은 짧은 이름을 선호합니다 (예 : Win32 C API _tcsstr에서 문자열 내에서 문자열을 찾는 기능입니다-분명하지 않습니까?) , 문자열의 하위 문자열을 다른 문자열로 바꾸고 복사본이 호출 될 때 결과를 반환하는 방법 stringByReplacingOccurrencesOfString: withString:). 나는 후자를 이해하기가 훨씬 쉽고, 작성하기가 약간 더 어렵다 (특히 코드 완성).

코드를 작성하는 것보다 자주 (오픈 소스 라이브러리의 경우) 읽고, 읽기는 쓰기보다 어렵 기 때문에 읽기에 최적화하십시오. 간결성을 위해 최적화하고 명확성을 희석하지 않고 가능한 한 멀리 가져 가십시오.


1
  1. 이 코드를 사용하는 모든 개발자가 동일한 영어 이외의 언어를 사용하지 않는 한 영어를 가정하십시오.

  2. 일반적으로 허용되는 명명 규칙과 스타일을 연구하십시오 . 안내 원칙은 명확해야합니다. 프로그래밍 언어에 따라 스타일이 다릅니다.

  3. 코드에서 다양한 객체 간의 관계를보다 쉽게 ​​이해할 수 있도록 이름 지정으로 할 수있는 일은 없습니다. 이를 위해서는 여전히 잘 작성된 주석과 문서가 필요합니다.


코드를 다루는 모든 개발자가 영어 이외의 언어를 사용하더라도 여전히 영어를 사용하십시오 ...!
Mvision

0
  1. 접두사를 사용하십시오. 여러 가지 방법을 사용하여 비슷한 작업을 수행하거나 어떤 방식으로 그룹화 할 수있는 경우 이름 앞에 공통 접두어를 붙여 해당 메소드의 공통점을 표시하십시오.
  2. 다른 사람들이 이름을 즉시 이해하도록하려면 불명확 한 약어를 사용하지 마십시오 (API 명명에서 중요 함)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.