명명 규칙이 언어와 충돌 할 때 무엇을합니까?


14

좋아, 이것은 항상 나를 괴롭힌 작은 것들 중 하나입니다. 나는 일반적으로 식별자를 약어로 사용하지 않으며 짧은 식별자 (예 :)를 사용하는 유일한 시간 i은 타이트한 루프입니다. 따라서 C ++에서 작업 할 때 자극을 주며 이름을 지정 해야하는 변수가 operator있거나 class문제를 해결하거나 약어를 사용해야합니다. 경고 : 도메인 객체가 호스트 언어로 개념을 반영하고 실수로 충돌을 일으킬 수있는 프로그래밍 언어 디자인에서 많은 일을하기 때문에 종종 불균형하게 발생할 수 있습니다.

이 문제를 어떻게 처리 하시겠습니까? 약하다? ( op) 철자가? ( klass) 다른 것? ( operator_)


7
이름 공간을 제외하고 우리는 명명 규칙을 변경해야할까요? 분명히 유감입니다.
Chris

1
@Chris : 당신은 명백한 것을 깨닫기 위해 프로그래머를 믿을 수 없습니다! (이 경우에도 있습니다.)
Jon Purdy

7
PHP의 $var문법 을 좋아할만한 이유가 있다면 이것이 바로 그 때문입니다.
Joey Adams

3
@Joey Adams :이 질문을보고 잠깐 웃어 SE 주변에 떠 다니는 모든 PHP bashing 질문을 기억했습니다.
Chris

3
분명히, 명명 규칙을 허용하도록 언어 소스 코드를 변경하십시오. 또한 인터프리터 / 컴파일러에서만 실행 / 컴파일하기 때문에 코드를 "보호"하는 이점도 있습니다.
dietbuddha

답변:


21
  1. 대문자 추가와 같은 이름 지정 규칙을 약간 변경해야 할 수도 있습니다. 모든 후속 코드가 일관되도록 가능한 한 빨리 이것을 받아들이는 것이 좋습니다.

  2. 더 구체적으로 고려하십시오. 키워드는 상당히 넓은 경향이 있으므로 문제를 해결하고 가독성을 높이기 class위해 범위를 좁히 십시오 demonstrationClass.


10

그것은 내가 만난 것이 아니지만 그러한 상황에 처하면 다음 옵션으로 순서대로 해결하려고 시도합니다.

  1. 동의어를 찾으십시오.
  2. (특히 변수의 경우) 접두사 또는 접미사를 찾으십시오.
  3. (특히 수업의 경우) 첫 글자를 대문자로 바꾸고 이름이 경우에만 다르지 않아야하는 코딩 규칙을 잊어 버리십시오. 이 옵션은 키워드와의 충돌이있는 경우에만 사용합니다.
  4. 약어를 사용하십시오.

1
경우에 따라, 특히 형식의 매개 변수에 const Foo&합리적인 이름이 아닌 인수 목록에서 이름이 다른 경우에 무엇이 잘못되었는지 알 수 없습니다 foo. 물론, 당신 Foofoo그것이 기능 몸에 살고 덜 전문적인 목적에 봉사하는 것보다 더 설명적인 이름 을 부여 하는 것이 좋습니다 .
Jon Purdy

@Jon-개인적으로 나는 대소 문자를 바꾸지 않고 "p_", "l_"및 "m_"접두사를 선호합니다. 나는 모든 명백한 이름 문제 때문에 그 협약을 채택했다. 특정 상황에서 일관되게 사용하는 한이 규칙을 다루는 데 사용하는 규칙은 대부분 관련이 없습니다. 물론 대 / 소문자를 구분하는 접근 방식은 대부분의 개발자가 인식해야 할 정도로 광범위하게 사용됩니다.
Steve314

@ Jon-그 의견은 같은 이름의 문제가있을 때만 선택적으로 규칙을 적용하는 것처럼 읽습니다. 문맥 문제는 언어, 프로젝트 등과 관련이 있습니다.이 규칙은 문제가 발생할 때마다 (또는 그렇지 않은 경우) 문제가 아니므로 필요에 따라 선택적으로 적용되지 않도록하기 위해 고안되었습니다.
Steve314

@ Steve314 : 첫 번째 의견에서 당신의 의미를 얻었습니다. 나는 dunno, 그와 같은 부착물은 항상 내 안락함을 위해 시스템 헝가리어에 너무 가깝다고 느꼈습니다.
Jon Purdy

@ 존 : 종교적으로 적용되는 규칙은 아니지만 두 식별자가 대소 문자 만 다르면 실수를하는 것이 더 쉽다는 것을 알았습니다. 이러한 오류 중 일부는 컴파일러에서 발견되며 일부는 찾기가 훨씬 어렵습니다 (특히 두 식별자의 이름이 같은 경우). 가능한 모든 경우에 적용되는 규칙의 전체 장부보다 사례 별 예외를 제외하고 하나의 일반적인 규칙을 선호합니다.
Bart van Ingen Schenau

6

언어가 이깁니다. 컴파일러보다 현명하지 못합니다 (PL / 1과 같은 혐오를 무시 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END하지만 PL / 1은 처음에 질문하지 않습니다). 기본적으로 언어의 규칙을 따라야하며 사용하는 언어의 핵심 단어에 대한 대안을 찾거나 대체 언어를 찾아야합니다.

따라서 매우 이례적인 상황을 제외하고는 그 반대가 아니라 언어에 적응합니다.


5

연장하는 방법을 약식으로 사용하는 대신? Foo 언어로 클래스 구성을 구현하는 경우 FooClass 및 foo_class를 사용하는 것은 어떻습니까? (케이싱 기본 설정이 무엇이든 Modulo).


Java 코드에서 사용하는 모든 식별자에 "java"접두사를 사용 하시겠습니까? 그리고 모든 식별자에 "C ++"를 접두어로 붙이는 문제를 언급 할 수는 없습니다.
Steve314

@ Steve314, Java 코드에서 접두사 java를 사용하지 않고 Java 컴파일러를 구현하는 C ++ 코드에서 java 접두사를 사용합니다. 또한 나머지 식별자가 키워드 인 경우에만 사용합니다.
Winston Ewert

OK-식별자가 참조하는 것이 더 구체적이기 때문에 일반적인 용어로 길게하는 것을 의미합니다. 다른 응용 프로그램의 경우 "class"는 "class_taught"또는 "class_of_animal"또는 "classiness_value"등으로 이름이 바뀔 수 있습니다. 동의합니다-컴파일러 지향 예제가 혼란 스럽다는 것을 알았습니다.
Steve314

5

class빈도에 따라 내가 사용한 약어 중 일부 :

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Class인스턴스가 나타내는 클래스를 알고 있다면 변수 이름에 포함시킬 수 있습니다.

  • stringClass = Class.forName("java.lang.String");

전에는 'cls'를 본 적이 없습니다. 나는 주로 aClass를 사용합니다.
Konstantin Petrukhnov

4

C 및 C ++에서 키워드는 모두 소문자이고 언어는 대소 문자를 구분하므로 Shift 키를 누를 때마다 많은 문제가 사라집니다.

모듈라 2에서, 키워드는 모두 대문자입니다 -하지만 너무 오래 당신의 식별자가 가지고있는 개의 소문자의 차이는 분명 불가능 충돌한다.

또한 절대적으로 명명 규칙은 어느 정도 사용중인 언어의 일반적인 규칙을 반영해야하므로 C ++로 "My_Class"를 쓸 가능성이 높은 Java로 "myClass"를 작성해야합니다.

기본적으로 컴파일러를 작성하는 것이 아니라 사람들이 읽을 수있는 것으로 판단하는 것은 상황 및 관련 기대치에 따라 다릅니다.


3
심지어 대소 문자를 구분 언어, 나는 혼합 한 느낌 classClass코드의 가독성을 해칠 것이다.
Karmastan

@Karmastan-아마도 대소 문자를 구분하는 언어와 규칙으로 작업하는 데 얼마나 많은 시간을 소비했는지에 따라 다릅니다. 개인적으로 대문자와 소문자 "C"는 시각적으로 매우 분명합니다. 긴 식별자의 사례 사용 패턴을 읽을 수있는 것보다 빠릅니다.
Steve314

3

나는 종종 이것에 부딪치지 않지만, 델파이를 사용하기 때문에 문제가 아닌 경향이 있으며 식별자 앞에 &를 붙여서이 문제를 해결할 수 있습니다. 따라서 "class"는 유효한 식별자가 아니지만 "& class"입니다.


흥미 롭군 식별자를 사용할 수있는 곳이면 문자열 리터럴을 허용하는 코드 생성 유틸리티가 있습니다. 원래, 생성 된 코드에 대한 대부분의 식별자는 증가하는 (및 키워드가 많은) DSL과 키워드 충돌의 위험을 피하기 위해 문자열 리터럴로 작성되었습니다. 이제 식별자는 대부분의 이름에 사용되지만 (소스가 얼마나 읽기 쉬운 지 놀랍습니다) 문자열 리터럴은 항상 대체로 사용할 수 있습니다. 코드 생성에는 좋다고 생각했지만 키워드 충돌 해결 방법은 범용 언어에서는 좋지 않은 아이디어 일 것입니다.하지만 어쩌면 틀릴 수도 있습니다.
Steve314

2

변수 이름에 일종의 네임 스페이스를 추가합니다. 예를 들어 user라는 모듈이 있다고 가정하고 변수 이름 operator를 user_operator 또는 userOperator와 같이 수정한다고 가정하겠습니다.


2
다만, "아니오", 또는 "내"접두어로 "부드럽게"사용하지 않는
스티븐 A. 로우

2
물론. "Jon_Purdys_Carefully_Chosen_Identifier_Prefix_"에 투표합니다.
Steve314

1
@Steven : 더 나쁜, 내가 볼 a, an그리고 the초보자 CS 학생들이 주파수를 방해와 함께 사용.
Jon Purdy

1
@ 존 퍼디, 우리 잘못이 아니야! People () 클래스의 인스턴스 이름을 결정한 교수를 비난하십시오 aPerson.
벤 L

@ 존 : 내가 일하는 명명 규칙은 로컬 변수가 a타이트 루프 변수 와 별도로 시작해야 함을 지정 합니다 : /
Matthieu M.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.