논리적 옵션이 예약 키워드 인 경우 이름을 지정하는 방법은 무엇입니까? [닫은]


64

경우에 따라 가장 논리적 인 이름 (예 : 변수)은 선택한 언어 또는 환경에서 예약 된 키워드입니다. 똑같은 동의어가 없으면 어떻게 명명합니까?

이 문제에 대한 모범 사례 휴리스틱이 있다고 생각합니다. 이들은 프로그래밍 언어와 환경의 제작자 또는 주지사가 제공 할 수 있습니다. 예를 들어, python.org (또는 Guido van Rossum)가 파이썬에서이를 처리하는 방법을 말하면, 그것은 저의 책에서 좋은 지침이 될 것입니다. C #에서 처리하는 방법에 대한 MSDN 링크도 좋습니다.
또는 소프트웨어 엔지니어링 분야의 주요 영향 요인이 제공하는 지침도 중요합니다. 아마도 Google / Alphabet은이를 다루는 방법을 알려주는 멋진 스타일 가이드를 가지고 있습니까?

C # 언어에서 "default"는 예약 키워드입니다. 열거 형을 사용할 때 기본값의 이름을 "default"( "switch"문과 유사)로 지정할 수는 있지만 그렇게 할 수는 없습니다.
C #은 대소 문자를 구분하며 열거 형 상수는 대문자로 입력해야하므로 여기서는 "Default"를 선택해야합니다. 현재 스타일 가이드에 따르면 모든 열거 형 상수는 소문자 여야한다고 가정합니다.
"defaultus라는 단어를 고려할 수 있습니다. ", 그러나 이것은 최소한의 놀랍게도원칙에 충실하지 않습니다 . 우리는 또한 "표준"과 "초기"를 고려해야하지만 불행히도 "기본"은이 상황에서 그 목적을 정확하게 전달하는 단어입니다.


15
"default_value"와 같은 것을 사용하고 싶습니다. 의미는 동일하지만 문자를 몇 개 더 입력해야합니다.
Mael

26
@Darkhogg 내 코드에서 그중 하나를 발견하면 즉시 변경합니다. 철자 오류 또는 명명 규칙 위반은 허용되지 않습니다.
MetaFight

26
@MetaFight-Java를 제외하고 클래스를 보유하는 변수를 호출하는 것은 clazz사실상 사실상의 표준입니다. 그것은 본질적 이다 플랫폼 명명 규칙의 일부. 다른 작업을 수행하면 다른 사람들이 코드를 읽었을 것이라는 기대에 위배되므로 절대적으로 필요한 경우에만 수행해야합니다.
Periata Breatta

6
열거 형 값의 기본값 은 반대로 생산적인 것 같습니다. 기본값을 설명하는 도메인 별 이름이어야합니다. 그러나 기본값을 반환하는 방법이 있어야합니다.
qwerty_so

18
@AndresF. 동의하지 않습니다. 나는 종종 자바 디자이너들과 논쟁 하기매우 쉽다는 것을 알게된다 . 그래도 나는 그것을 반대하지 않습니다. 그들은 서부에서 일하고있었습니다.
MetaFight

답변:


63

열거 형 옵션의 경우 제목과 같은 제목을 사용해야합니다 Default. C #은 대소 문자를 구분하므로 reserved 키워드와 충돌하지 않습니다. .net 이름 지정 지침을 참조하십시오 .

모든 공개 멤버는 .net에서 제목이되어야하고 예약 된 이름은 모두 소문자이므로 로컬 변수 (매개 변수 포함)를 제외하고는이 문제가 발생하지 않아야합니다. 그리고 현지인은 일반적으로 이름으로 명사 나 문구를 사용하므로 가장 자연스러운 이름이 키워드와 충돌하는 경우는 거의 없습니다. 예 : defaultValue일반적으로보다 더 자연스러운 이름 default입니다. 실제로 이것은 큰 문제가 아닙니다.

C #에서는 " @"접두사를 사용하여 예약 키워드를 이스케이프하여 식별자 (예 :)로 사용할 수 있습니다 @default. 그러나 이것은 실제로 다른 옵션이없는 경우, 즉 예약 된 키워드를 식별자로 사용하는 타사 라이브러리와 인터페이스하는 경우에만 사용해야합니다.


물론 다른 언어는 구문과 키워드가 다르기 때문에이 문제에 대한 해결책이 다릅니다.

SQL 에는 키워드가 많이 있지만와 같이 식별자를 이스케이프 처리하는 것이 일반적 [Table]입니다. 일부는 키워드와 충돌하는지 여부에 관계없이 모든 식별자에 대해 그렇게합니다. 결국에는 충돌하는 키워드가 도입 될 수 있습니다.

Powershell (및 여러 다른 스크립팅 언어)은 모든 변수 앞에 $와 같은시길을 붙여서 키워드와 충돌하지 않습니다.

Lisp 에는 적어도 기존의 의미로는 키워드가 없습니다.

파이썬PEP-8 에서 공식적으로 인정 된 규칙을 가지고 있습니다 :

클래스 메소드의 첫 번째 인수에는 항상 cls를 사용하십시오.

함수 인수의 이름이 예약 된 키워드와 충돌하는 경우 일반적으로 약어 나 철자 손상을 사용하는 대신 단일 후행 밑줄을 추가하는 것이 좋습니다. 따라서 class_가 clss보다 낫습니다. (아마 동의어를 사용하여 이러한 충돌을 피하는 것이 좋습니다.)

Brainfuck 또는 Whitespace 와 같은 일부 언어는 단어를 정의하지 않고 문제를 우아하게 회피합니다.

간단히 말해 특정 언어의 구문과 규칙에 따라 크게 다르므로 질문에 대한 언어 독립적 답변은 없습니다.


2
그래도 대소 문자 구분에만 의존해서는 안됩니다. 실제로 문제가되지는 않지만 모든 .NET 언어가 대 / 소문자를 구분하는 것은 아니므로 예기치 않은 문제가 발생할 수 있습니다.
Vivelin

6
@Vivelin : 다른 언어에 문제가 발생할 수 있으므로 경우에만 다른 공개 멤버 또는 유형 이름을 사용해서는 안됩니다. 그러나 키워드는 식별자가 아니며 다른 언어에는 다른 키워드가 있기 때문에 이것은 내가 제안하는 것과 관련이 없습니다.
JacquesB

@ 구문을 사용할 수 있더라도 다른 키워드로 라이브러리 작성 언어와 상호 작용해야하는 시나리오에 가장 적합합니다. 심지어 거기에서도 다소 언어 기능을 갖는 것이 낫다고 생각 #define하지만 오른쪽 피연산자는 항상 대소 문자를 구분하는 식별자로 해석됩니다. 이를 통해 많은 종류의 이름 충돌이 해결 될 수 있습니다 (대소 문자를 구분하지 않는 언어의 경우를 제외하고 동일한 기호 가져 오기 포함).
supercat

@Vivelin 모든 .NET 언어가 대소 문자를 구분하는 것은 아닙니다 . VB.NET과 Powershell을 알고 있습니다. 다른 사람이 있습니까?
Zev Spitz

@ ZevSpitz는 OP를 구체적으로 C #이라고 부릅니다 .Vivelin이 그의 예제로 사용했다고 생각합니다. 그러나 VB.NET은 대소 문자를 구분하지 않으므로 평소와 같이 언어별로 다를 것이라고 생각합니다. . 모든 언어에 동일한 예약어가있는 것은 아닙니다
Shaggy13spe

22

밑줄을 추가합니다 (default_)

장점 :

  • 단순한
  • 명백하다 (왜 밑줄을 추가 하시겠습니까?)
  • 일관된
  • 사용하기 쉬운
  • 내가 아는 모든 현대 언어로 작동
  • 논리 옵션에 가장 가까운

다른 솔루션을 좋아하지 않는 이유 :

동의어:

  • 찾기 힘들다
  • 종종 정확히 같은 의미가 아닙니다 (뉘앙스)

단어 추가 / 앞에 추가 :

  • 불일치 (defaultValue, defaultItem)
  • 가독성을 높이 지 않고 자세한 정보 표시

글자 변경 (클래스 대신 clazz) :

  • 불일치 (clazz, klass, klazz)

숫자 추가 (기본값 1) :

  • default2에 대한 질문을 제기

편지 추가 / 앞에 추가 :

  • 명확하지 않음 (프로그래머는 이름 충돌에 사용되었고 다른 것에 대한 지름길이 아니라고 추측해야 함)

키워드 이스케이프 (@default (c #),`default` (scala))

  • 일부 언어로만 가능
  • 주로 다른 언어와의 호환성을 위해 거의 사용되지 않는 기능
  • api 사용자가 사용하기 어렵게 만듭니다 (어떻게하는지 알고 어떻게 해야하는지 기억해야 함)

언제 사용하지 않습니까?

  • 기존의 널리 사용되는 다른 컨벤션
  • 나는 이미 동의어를 알고있다
  • 귀하의 특정 열거 형 경우에는 @JacquesB 답변을 따르십시오.

7
이것은 파이썬에서 자주 사용되는 솔루션입니다. 나는 그것을 가장 우아하다고 주장하지는 않지만 작동합니다.
fralau

1
@fralau Python은 특히 나쁘지 않습니다-나는 정말로 "입력"과 같은 식별자를 싫어합니다
Christian Sauer

많은 언어 에서 예약어 인 klass변수를 class찾습니다. 본 적이 defawlt없지만 같은 생각입니다. 나는 default_(그리고 아마도 class_그렇게함으로써 확립 된 협약을 짓밟 지 않을 것입니다) 선호합니다 .
nigel222

키워드를 이스케이프 처리하는 옵션이 포함되어 있지 않습니다.
코드 InChaos

1
"밑줄이 사용 된 이유가 확실하지는 않지만"타당하고 합리적인 주장을합니다. 나는 그들이 일하고있는 언어의 모든 키워드를 알고있는 froods와 거의 일하지 않았습니다!
수호자 1

18

"Default"는 아마도 유용한 열거 형 값이 아닙니다. 사용되는 컨텍스트에 따라 변경 될 수있는 동작을 나타냅니다.

즉, 귀하의 언어가 대소 문자를 구분하면 다른 대소 문자를 사용하십시오. (기본 대 기본)

또는 더 나은 방법으로 몇 글자를 더 입력하고이를 DefaultValue라고하는 추가 노력을 기울이십시오.


3
동의한다. "기본값"은 값이 무엇인지 표시하지 않습니다. enum ErrorHandlingLevel { Default = 0, ... }vs를 고려하십시오 enum ErrorHandlingLevel { None = 0, ... }. 두 번째 예에서 Nonexmldoc을 사용하거나 코드에서 명시 적으로 열거 형 값을 0으로 설정하여 기본값 이라는 사실을 알 수 있습니다. 객체가로 ErrorHandlingLevel설정 되었을 때의 의미를 아는 추가 이점이 None있습니다. ErrorHandlingLevel기본값 으로 설정된 개체를 검사하는 것과 비교하십시오 .
해리슨 페인

9

명확성을 기하기 위해 로컬에서 명명 규칙을 변경하거나 의미없는 문자를 추가하지 않는 것이 좋습니다 (다른 게시물에서 제안한 것처럼). 의도가 명확하지 않으면 혼동을 일으키고 왜 이런 식으로 명명되었는지에 대한 의문이 생길 수 있습니다. 그것없이 해결할 수 있습니다.

모든 경우에 동의어가있는 단어를 사용하거나 이름을보다 구체적으로 (또는 상세하게) 만들 수 있어야합니다. 문맥의 반복을 도입 할 수있는 경우에도 더 나은 솔루션 일 수 있습니다.

예를 들어, Mode경우와 같이 기본값을 표시 해야하는 열거 형 이 있다고 가정 해 봅시다 . default_mode반복으로 인해 이름을 지정하는 것이 가장 좋지는 않지만 원하는 의미를 전달하면서 모호성을 피합니다.


당신은 타당한 점을 밝히지 만 여전히 혼란을 일으키는 것이 무엇인지 확실하지 않습니다. 물론 이전의 선택에 반대하는 경우, 처음에 사용될 상황이 (희망스럽게) 너무 드물기 때문에 기존 코드에서 일관성을 유추 할 수 없습니다.
수호자 1

3

다른 단어 나 수정 된 단어를 사용해야합니다.
그래서 이것은 일반적으로

  • 완전히 다른 단어
  • 접두사
  • 접미사

결정하는 또 다른 요소는 여러 단어를 결합하는 방법이며 옵션은 일반적으로

내 제안은 접두사 또는 접미사와 밑줄 / 대시를 사용하는 것입니다.

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_default모든 로컬이 정렬되어 신속하게 눈에 띄는 장점이 있지만 고유 이름을 얻으려면 항상 두 번째 부분을 읽어야한다는 단점이 있습니다. default_local고유 변수 이름을 빠르게 볼 수 있다는 단점이 있지만 지역 변수가 시각적으로 쉽게 그룹화되는 것은 아닙니다.

내가 본하여 domain_specific 방법에 대한 예를 몇은 다음과 같습니다 vehicle_model대신 model하는 것은 예약어이었다; 예약어 인 room_tableSQL 테이블의 경우table

언어 나 스크립트에서 사용하는 다른 두 가지 옵션은 다음과 같습니다.

  • 따옴표 나 백팁으로 변수 이름을 둘러 싸서 예약어를 사용할 수 있습니다. 이와 비슷하게 일부 언어는 백 스페이스와 같은 특수 문자로 이름을 벗어날 수 있다고 생각할 수 있습니다.
  • 변수 이름에 공백이 있습니다.

약간의 흥미로운 참고 사항 : 밑줄을 사용할 때 와 대시를 사용할 때 words_with_underscores-or-dashes두 가지 이름으로 언급 된 것을 보았습니다 . 나는 후자가 재미 있다는 것을 알았습니다. snake_casekebab-case
VLAZ

2

분명히 그러한 상황을 피하기 위해 할 수있는 일을하십시오. 나는 1970 년대 후반부터 소프트웨어를 작성해 왔으며 실제로 실제로 예약어를 퍼지해야하는 시간은 10 세 미만, 아마도 5에 가깝습니다.

첫 번째 또는 마지막 문자를 두 배로 늘리거나 ( reservedd) 선행 또는 후행 밑줄 ( reserved_)을 추가하는 등 할 수있는 일이 많이 있습니다 . 적절한 것은 특히 선행 또는 후행 밑줄과 관련하여 작성하는 언어에 따라 달라집니다. 또한 사람이 잘못 읽을 수있는 사례를 사용하지 마십시오 (예 : Reserved와 다를 때 사용 reserved).

무언가를 고르면 코딩 지침에 넣고 사람들이 그것에 대해 알고 일관성있게 사용하도록하십시오. 독자들에게 오타라고 생각하지 않고 다시 보게 될 것을 알 수 있도록 미리 알림 주석을 추가하기까지합니다.

int ccase;  // Name dodges a reserved word

10
downvoter는 아니지만 "첫 번째 또는 마지막 문자를 두 배로 늘리는"제안이 내 척추를 진정시킵니다 ....
Willem van Rumpt

@WillemvanRumpt 나도 그것을 좋아하지 않지만, 한 번 큰 체조를하는 동안 머리를 긁을 수있는 예약어를 피하거나 약간의 프롬프트를 나타내는 이상한 모양의 식별자를 피하는 것이 좋습니다. .
Blrfl

6
의도 한 판단은 없습니다. 단지 ... 칠기 .. 차가운 것 ...;)
Willem van Rumpt

1
밑줄 뒤에 붙는 것이 마지막 두 배 문자보다 낫습니다. ( classs?에 대한 모든 투표 )
nigel222

1
코딩 지침! 그게 좋을 것입니다! 좋은 지적.
수호자 1

2

C #에서는 식별자 이름 앞에 @를 붙일 수 있습니다 . 이것은 컴파일러에게 이름을 가능한 키워드가 아닌 식별자의 이름으로 취급하도록 지시합니다.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

3
이 "응답"에 투표 할 사람이 누구인지 궁금 합니다. 전날 가장 많이 투표 된 답변 에서 이미 작성된 (그리고 훨씬 더 나은 제시된) 요점을 반복합니다
gnat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.