예약어를 피하기위한 의도적 인 맞춤법 오류


45

나는 종종 더 나쁘게 예약어가 된 일반적인 단어의 의도적 인 철자가 틀린 코드를 본다 :

  • klassclazz에 대한 클래스 :Class clazz = ThisClass.class
  • kountSQL 에서 카운트 :count(*) AS kount

개인적으로 나는 이것이 가독성을 줄입니다. 내 자신의 연습에서 나는 더 좋은 이름이 사용되지 않았을 수 있습니다 너무 많은 경우를 발견하지 않았습니다 - itemClassrecordTotal.

JavaDocs for Class 의 예제 는이를 매개 변수에 표시합니다.

 public <U> Class<? extends U> asSubclass(Class<U> clazz)

이것이 합리적인 사용 사례를 보여줍니까?


9
레코드의 경우 : Python에서 cls실제 클래스 ( class키워드로 선언하고 모든 것이 인스턴스 임)를 포함하는 변수 / 인수에 대한 공통된 (사실상 하나의 관용적 인) 이름입니다 .

14
당신은 싫어 typedef char ínt?
Jeff

14
@muntoo 당신이 맞아요. 에 대한 컴파일러 오류가 발생합니다 iñt. 세계 지배 계획이 있습니다.
Jeff

1
나는이 규칙을 어겼다. 그리고 지금 나는 수치심을 느낀다.
jmq

3
하지마 나는 이것을 전에 본 적이 없다고 솔직하게 말할 수 있으며, 그렇게한다면 즉시 이름을 바꿀 것입니다. 당신이 경우 그냥 생략 (비 설명 변수 이름을 사용 Class c).
코디 그레이

답변:


63

IMHO, 이것은 매우 나쁜 생각입니다. 예약어는 어떤 이유로 예약되어 있으며 이렇게하면 가독성이 떨어집니다.

나는 또한 두 번째 요점에 전적으로 동의합니다. 변수 이름을 class지정할 수는 있지만 변수 이름을 지정하는 것만 큼 tmp또는 이름을 지정하는 것만 큼 나쁩니다 a. 어떤 수업? 무엇의 수업? 이름은 설명 적이어야합니다.


15
"예약 된 단어는 이유로 예약되어 있습니다"<-이. (아이러니하게도 충분한 것은 예약되어 있습니다.)
trycatch March

16
당신이 옳기 때문에 +1. 그러나 강의실 스케줄링 소프트웨어 또는 무언가를 작성하는 경우 클래스는 합법적 인 변수 또는 클래스 이름 일 수 있습니다.
CaffGeek

8
Meh. " 예약 된 단어는 이유를 위해 예약되어 있습니다. "는 언어 디자이너가 게으른 것입니다. 단어가 사용되는 특정 장소에만 예약 된 정교한 언어가 꽤 있습니다. 그러나 Ritchie는 C 용 경량 컴파일러가 필요할 때이 트렌드를 시작했으며 대부분의 언어 디자이너가이를 배웠습니다.
로스 패터슨

14
Ross는 아닙니다. 프로그래머 (및 일반적으로 독자)는 합리적으로 명확한 의미를 가질 것으로 기대하기 때문입니다 (따라서 외국어를 배우는 것이 너무 어렵거나 이중 의미가있는 모든 것, 또는 제기 한 언어와 다른 의미가있는 이유) 어린 시절부터 문화 유산의 일부이기 때문에 이러한 모호성을 눈치 채지 못했습니다.)
jwenting

3
@AlexanderMorou Nope는 언어 디자이너가 거의 없으며 다른 사람의 디자인으로 시작합니다. 그러나 Algol, Fortran, PL / I, Rexx 및 C를 기반으로하지 않는 다른 언어를 살펴보면 예약어가없는 문법이 확실히 가능하다는 것을 알 수 있습니다. Ritchie는 그만한 이유가있었습니다. 유닉스 사람들은 모든 키 입력이 중요하다고 생각했고 PDP-11에서는 모든 CPU주기가 중요하다고 생각했습니다. 오늘? 별로.
로스 패터슨

21

파이썬 스타일 가이드 는이 문제를 구체적으로 설명하며 다음과 같이 제안합니다.

공개 속성 이름이 예약 키워드와 충돌하는 경우 속성 이름에 단일 밑줄을 추가하십시오. 약어 또는 손상된 철자보다 선호됩니다.

이것은 특정 언어의 의미와 충돌하지 않는다는 가정하에 꽤 좋은 규칙처럼 보입니다.


7
나는 이것이 스타일 가이드의 조언이 실제로 좋지 않다고 생각합니다. 속성 이름이 키워드와 너무 가까운 경우 더 나은 이름을 찾으십시오. 단순히 밑줄을 붙여도 아무런 의미가 없으며 코드를 읽는 다음 사람을 혼동시킬 가능성이 있습니다.
Wayne Johnston

18
@Wayne : union키워드가 C 일 때 유니온 찾기 구조에서 유니온 연산의 이름을 어떻게 지정 합니까? 당신은 그것을 호출하는 건가요 foo은 같이 안해서 union?
Fred Foo

OTOH cls는 클래스 메소드의 표준 인수 이름입니다. 또한 예를 들어 Django 객체에는 .id속성이 있으며 id내장 함수 와 충돌 합니다.
vartec

1
@GoloRoden 나는 노조를 계산할 때 그들이 두 세트를 "결합"한다고 말하는 것을 들어 본 적이 없다. 그것은 단지 용어의 일부가 아닙니다. "병합 (Merge)"이 더 나을 수 있지만, merge메소드는 여전히 통합을 구현하고 순수한 기술적 이유로 이름이 바뀌 었다는 명시적인 문서가 필요합니다.
Fred Foo

2
@GoloRoden Merriam-Webster에 따르면 동사가 아니지만 이 답변을 참조하십시오 .
maaartinus

18

코드 냄새.

string stringVariable = "";

위의 코드는 의도 된 변수에 대해 아무 것도 알려주지 않습니다.

class Klass

같은 문제

string UserNameString = "bmackey"

위의 코드는 변수 이름에 키워드 문자열을 추가하지 않아도됩니다. 변수 이름으로 유형을 식별해야하는 경우 코드가 너무 깁니다. 밀도 리 팩터.


"코드"가 아니기 때문에 아무 것도 말하지 않습니다. 격리 된 변수 선언입니다. "클래스"또는 "클래스"는 당신이 알아야 할 모든 것을 아주 잘 알려줄 수 있습니다. 예를 들어, 일반적인 메소드는 Class<T>매개 변수를 수신 할 수 있으며 이는 의미가 있습니다. 그래서 코드 냄새라는 데 동의하지 않습니다.
Andres F.

5

개인적으로, 이것이 귀하의 코드 스타일에 완벽하게 유효한 옵션이라고 생각합니다.

그것들은 예약어이므로 컴파일러는 언어 역학이나 변수를 의미하는지 여부를 결정할 필요가 없습니다. 이를 염두에두면 사람들이 예약어와 같은 변수가 필요할 것으로 기대 합니다.

JDK 1.6 R21에 번들로 제공되는 소스를 살펴보면 917 번의 "clazz"가 발견됩니다. 분명히, 그들은 그것이 수용 가능한 스타일이라고 생각했습니다.

당신의 팀은 그것에 대해 어떻게 생각합니까? 그것이 나쁘다고 생각하지만 팀의 다른 9 명이 좋다고 생각하면 총알을 물고 받아 들여야합니다. 옳고 그름에 대한 의사 소통이 있고보고있는 문제를보고있는 한 문제가되지 않습니다.

귀하의 팀이 코드 스타일에 대해 어떻게 생각하는지가 제 의견이나 다른 사람의 의견보다 중요 합니다. 이것과 다른 코드 스타일 결정에 적용됩니다.


1
그렇습니다.하지만 결국에는 팀이 바뀔 것입니다. 몇 년 동안 길을 잃은 사람이 당신의 코드에 클라스와 clazzes로 가득 찬 것을보고 "WTF!"라고 말할 것입니다.
MrFox

4
둘 다 사용 klass하고 clazz있는데 나쁜 일입니다. 한 번만 배우면 되려면 일관성이 있어야합니다. 이상적으로 이것은 팀 스타일 지침서에도 나와 있으므로 놀랄 일이 아닙니다.
corsiKa

코드는 팀원뿐만 아니라 전 세계 사람들이 읽을 수 있도록 작성되었습니다. 팀이 모두 절벽 위를 지나는 버스에 있으면 다른 누군가가 코드를 읽기 시작합니다. 변수가 표현되는 방식이 아니라 변수가 무엇인지를 완벽하고 간결하게 설명하는 이름을 사용하십시오.
Rob K

1
아뇨. 팀은 시간이 지남에 따라 멤버를 천천히 회전시킬 가능성이 훨씬 높습니다. 한 사람이 버스를 치도록 계획 할 수는 있지만 전체 팀이 버스를 치도록 계획 할 수는 없습니다. 대부분의 코드는 코드 검토 중 코드를 읽을 필요가있는 십여 명의 사람들을 위해 작성되었습니다.
corsiKa

4

예약어를 피하기위한 의도적 인 맞춤법 오류는 나쁜 생각입니다.

  • 맞춤법이 틀린 철자와 올바른 철자를 구별하기 어렵 기 때문에 코드를 읽기가 어렵습니다.

  • 맞춤법이 틀린 단어는 기억하기 어렵 기 때문에 일부 일관성없는 맞춤법 오류가 코드 내에서 경쟁하기 때문에 코드를 작성하기 어렵고 읽기가 더 어려워집니다.

  • 예약어는 문제 자체가 아니라 문제를 해결하는 데 사용되는 언어를 나타냅니다. 변수 이름은 문제와 관련된 개념을 가리켜 야합니다.

그것은 대안을 설명하는 이름을 선택하는 것이 더 나은 또는 더 만족 대안이 존재하지 않는 경우에 자격 에서와 예약어 :

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> benchmarkedClass = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(benchmarkedClass, benchmark.generatedMethod());
}

3

Class clazz"나는 좋은 이름을 내놓으려고하지 않았다"는 냄새가 난다. 변수는 항상 무언가를 나타내며 좋은 이름은 그것을 나타냅니다. clazz예를 들어 어떤 상황에서도 가능한 최고의 이름 이라고 생각하지 않습니다 . 클래스-> class_reference에 대한 참조입니까, 클래스 객체의 복사본입니다-> class_copy 등. 아마도 "class"를 삭제하고 설명적인 단어를 사용하십시오.

java.lang.SecurityManager.checkMemberAccess(Class<?> clazz, int which)
Parameters
    clazz -- the class that reflection is to be performed on.

여기서 clazz는 검사를 수행 할 대상 클래스이므로

checkMemberAccess(Class<?> target, int which)

clazz보다 매개 변수가 사용되는 것을 훨씬 더 잘 설명합니다.


IMHO 그것은 낫지 않습니다 .'classToBeAccessed '또는 무엇이든 호출 할 수 있지만 더 설명적인 이름은 분명합니다. 유용한 정보를 제공 할 때만 긴 이름을 좋아합니다.
maaartinus

1
classToBeAccessed실제로 좋은 이름입니다 ( classToBeChecked아마도 더 좋을 것입니다).
hlovdal

1

변수에 예약 된 이름을 사용하면 이름이 잘못 지정된 변수입니다. 강의실 소프트웨어 용 클래스와 같이 합법적 인 이름 인 경우에도 마찬가지입니다.

잘못 명명 된 변수는 잘못 생각했거나 우연한 코드의 표시입니다. 유지 관리하는 소프트웨어에 다른 문제가있을 경우주의하십시오.


0

신중하고 일관되게 사용한다면 의도적 인 철자 나 약어가 좋은 생각이라고 생각 합니다 .

Java에서 고려하십시오.

class X { public X() { } }
X x = new X();
x.getClass;  // Wha?  How does "get" help anything?
x.class;     // Best, but requires more lexer/parser work
x.klass;     // At least as good as getClass
x.clazz;     // Same

맞춤법이 틀린 곳은 예약어가 작업에 가장 적합한 단어입니다. 유혹을받을 수있는 맞춤법 오류를 사용 하지 않는 두 곳 이 있습니다.

  1. 좋은 이름을 생각하고 싶지 않다
  2. 당신은 더미 변수를 원하고 설명적인 이름이 필요하지 않습니다.

첫 번째 경우, 게으름이 품질 코드를 생성하기위한 좋은 정책이 아니라는 것은 명백합니다. 두 번째 경우에는 매우 짧은 변수를 선택하십시오. 그것이 바로 수학자들이 항상하는 일이며 프로그래머는 색인을 위해하는 일입니다. 실제로 더미 변수 일 경우 인덱스에 대해이 작업을 제한 할 이유가 없습니다.

boolean isMyName(String testName) { return myName.equals(testName); }
boolean isMyName(String s) { return myName.equals(s); }

Date nextMeeting(Klass klass) { return /* something */ }
Date nextMeeting(Klass k) { return /* something */ }

메소드 나 코드 구조에 무엇이 있어야하는지 알려 주면 변수 이름이 짧은 것을 잃지 않습니다.


2
죄송하지만 동의 할 수 없습니다. nextMeeting은 어떻게 작동합니까? 논리가 불분명합니다. 코드를 읽을 때마다 이름이 의미가 없기 때문에 Klass의 정의를 찾아야합니다. 대신 nextMeeting (MeetingRoom meetingRoom)을 사용하면 읽을 클래스가 더 적고 (klass? clazz?) 더 생산적입니다. 코드는 쓰여진 것보다 훨씬 더 많이 읽습니다.
MrFox

@suslik- nextMeeting(MeetingRoom r)충분합니다. meetingRoom당신이 거기에 도착 하는 것은 무엇입니까 ? ti가 nextMeeting(int meetingRoom)이해 했다면 정보가 다른 출처에서 이미 사용 가능할 때 짧은 변수 이름을 사용합니다 .
렉스 커

내 게시물은 코드베이스에 Klass의 존재에 관한 것입니다. 때로는 짧은 변수 이름에 동의하지만, 방법이 길어지고 "r"이 MeetingRoom인지 확인하기 위해 srcolling을 계속 해야하는 경우도 좋지 않습니다. 회의실의 단점이 무엇인지 궁금합니다. 수평 공간? 입력하기에 너무 깁니다?
MrFox

@suslik-예, 변수 이름이 긴 가로 컨텍스트가 손실됩니다. 긴 방법으로 수직 컨텍스트를 잃어 버리기 때문에 피하는 것이 가장 좋습니다 (그러나 어쨌든 변수 이름을 더 잘 상기시키기를 원할 것입니다). 예약어가 있었을 때Klass 대안 이었습니다 . 원래 맞춤법을 사용할 수있을 때는 맞춤법 오류를 사용하지 않는 것이 좋습니다!
렉스 커

0

클래스 Class klass의 인스턴스로 실제로 작업하는 리플렉션 을 할 때 합법적으로 사용하는 것을 보았습니다 Class.


2
문제는 인스턴스가있는 경우가 아니라 해당 철자를 사용해야하는지 userClass또는 다른 옵션 ( 예 : 다른 옵션)을 사용해야하는지 여부 입니다.
Nicole

2
그런 경우에는 classInstance이상을 선호 합니다 klass.
Konrad Morawski

2
@ KonradMorawski : 그러나 작업하는 모든 객체는 인스턴스이므로 classInstance상당히 중복됩니다. 또한, 나는 다음과 같은 것을 상상할 수 class klass; Object classInstance = klass.newInstance;있습니다.
maaartinus

0

나는 종종 더 나쁘게 예약어가 된 일반적인 단어의 의도적 인 철자가 틀린 코드를 본다 :

클래스의 klass 또는 clazz : 클래스 clazz = ThisClass.class

SQL에서 카운트를위한 kount : count (*) AS kount

개인적으로 나는 이것이 가독성을 줄입니다. 내 자신의 연습에서 itemClass 또는 recordTotal과 같이 더 나은 이름을 사용할 수없는 경우가 너무 많지 않았습니다.

그러나 내가 도울 수는 없지만 내가 유일한 사람인지 궁금해하는 것은 흔한 일입니까? 이 연습에 대해 존경받는 프로그래머의 조언이나 더 나은 인용 된 제안이 있습니까?

지역 변수와 형식 인수에 대해서는 중요하지 않습니다.

의도적으로 오도하거나 성가신 산만하지 않는 한 어떤 이름도 좋습니다. 귀하의 예에서 :

public static Method findBenchmarkMethod(BenchmarkRecord benchmark) {
    Class<?> clazz = ClassUtils.loadClass(benchmark.generatedClass());
    return findBenchmarkMethod(clazz, benchmark.generatedMethod());
}

단일 로컬 변수가 "clazz"또는 "klass"또는 "cls"인지 또는 단순히 "c"인지는 중요하지 않습니다. 아마도 표현식을 인라인 할 것입니다.

return findBenchmarkMethod(ClassUtils.loadClass(benchmark.generatedClass()),
                           benchmark.generatedMethod());

변수 이름의 길이는 변수의 범위와 관련이 있어야합니다. 짧은 방법으로 지역 변수의 경우 (그리고 모두 짧아야 함) 매우 짧은 이름이 좋습니다.


인라인이 잘못 보인다 ClassUtils.loadClass(benchmark.generatedClass())=> benchmark.generatedClass()-길 ClassUtils.loadClass을 잃었다
gnat

0

맞춤법 오류가 항상 나쁜 생각이라고 생각합니다. 독자에게는 좋지 않습니다. 나는 하나의 단어를 볼 때 내가 뭔가를 놓쳤는 지 궁금 할 것이다 klass. (그들이 class해적을 의미 했습니까 , 아니면 해적을 의미 했습니까 ?) 적어도 나에게, 내가 인식하는 모든 철자가 틀린 것입니다.

예약어가 실제로 변수에 대해 알려진 유일한 중요한 경우는 다음과 같은 대안을 사용합니다.

  • 함수 인수 인 경우 aClass대신을 사용하십시오 class.

  • 로컬 또는 멤버 변수 인 경우 myClass대신를 사용하십시오 class.

  • 접근자인 경우 getClass()대신을 사용하십시오 class().

물론, 추가 된 접두사는 무의미하며, 따라서 최후의 수단으로 만 사용해야합니다. 그러나 적어도 그것은 독자의 정신적 파서를 방해하지 않으며 예약어를 피하는 안전한 방법입니다.


0

창의적인 맞춤법의 이점 중 하나는 더 나은 검색 기능입니다. 나는 너무 자주 당신이 잘못된 것들과 1000 개를 찾을 수있는 일반적인 단어보다 독특한 것들에 대한 완전한 코드 검색을 수행하는 것이 훨씬 쉽다고 생각합니다. 예를 들어, 나는 kzpg.com을 소유했습니다. 구글은 지금 당신은 몇 안타 만 볼 수 있습니다. 독특하고 따라서 찾을 수 있습니다.

그러나 어느 정도는이 질문이 물질 이상의 의견이라고 생각합니다. 나는 개인적으로 단어와 그 많은 단어에 관한 Forth에서 자랐습니다. 한 사람은 손가락을 구하기 위해 창의력을 발휘하는 법을 배웠습니다. 결국 나는 약 640,000 문자를 내 소스 기반으로 사용했습니다. 따라서 단어를 짧게 유지하는 것이 일을 끝내는 데 중요했습니다.


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