予約語を避けるための意図的なスペルミス


45

良くも悪くも予約語になっている一般的な単語の意図的なスペルミスを含むコードをよく見ます:

  • klassまたはclazzのためのクラスClass clazz = ThisClass.class
  • kount以下のためのカウント SQLで:count(*) AS kount

個人的には、これにより可読性が低下することがわかります。私自身の練習では、私はより良い名前が使用されていることができなかった、あまりにも多くのケースを発見していません- itemClassrecordTotal

クラスのJavaDocsの例は、パラメーターにこれを示しています。

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

これは合理的なユースケースを示していますか?


9
記録の場合:Pythonでは、cls実際のクラス(classキーワードで宣言するもの、すべてがインスタンスであるもの)を継続する変数/引数の一般的な(実際には1つの慣用的な)名前です。

14
好きじゃないtypedef char ínt
ジェフ

14
@muntooそう​​ですね。のコンパイラエラーも表示されiñtます。世界の支配に対する私の計画があります。
ジェフ

1
私はこのルールを破りました...そして今、私は恥を感じます。
jmq

3
しないでください。正直に言うと、これを見たことがないので、もし見かけたらすぐに名前を変更したいと思います。わかりにくい変数名()を使用する必要がある場合、省略してくださいClass c
コーディグレー

回答:


63

私見、これは非常に悪い考えです。予約語は理由のために予約されており、これを行うと読みやすさが低下します。

私もあなたの2番目の点に完全に同意します。変数classに名前を付けることは、たとえそれができたとしても、tmpまたはに名前を付けるのと同じくらい悪いでしょうa。どんなクラス?何のクラス?名前は説明的なものでなければなりません。


15
「予約語は理由のために予約されています」<-これ。(皮肉なことに、予約されています。)
trycatch

16
あなたが正しいから+1。しかし、教室のスケジューリングソフトウェアなどを記述している場合、クラスは正当な変数またはクラス名である可能性があります
...-CaffGeek

8
えー 「予約語は理由のために予約されています」、つまり言語設計者は怠け者です。単語が使用されている特定の場所でのみ予約されている洗練された言語がかなりあります。しかし、リッチーは、C用の軽量コンパイラーが必要になったときにこの傾向を開始し、ほとんどの言語設計者はそこから学んだ。
ロスパターソン

14
それは、プログラマー(および一般的な読者)が物事を合理的に明確な意味を持つことを期待しているためです(これが、外国語の学習がしばしば難しい、二重の意味を持つすべてのもの、またはあなたが育てた言語とは異なる意味を持つ理由です)それらがあなたの文化遺産の一部であるため、それらの曖昧さに決して気付かない子供時代から)。
1

3
@AlexanderMorouいいえ、ほとんどの言語デザイナーはいません。彼らは他の人のデザインから始めます。しかし、Algol、Fortran、PL / I、Rexx、およびCに基づかない他の言語を見ると、予約語のない文法が確かに可能であることがわかります。Ritchieには正当な理由がありました。Unixの人々はすべてのキーストロークが重要だと感じ、PDP-11ではすべてのCPUサイクルが重要だと感じました。今日?そんなにない。
ロスパターソン

21

Pythonのスタイルガイドでは、この問題を具体的に指摘し、次のことを提案しています。

パブリック属性名が予約済みのキーワードと衝突する場合、単一の末尾アンダースコアを属性名に追加します。これは、略語や綴りの誤りよりも望ましい方法です。

これは、特定の言語のセマンティクスと矛盾しないと仮定すると、かなり良い一般的なルールのようです。


7
これはスタイルガイドからの非常に悪いアドバイスだと思います。属性名がキーワードに非常に近い場合は、より適切な名前を見つける必要があります。最後にアンダースコアを付けるだけでは意味が追加されず、コードを読む次の人を混乱させる可能性があります。
ウェインジョンストン

18
@Wayne:unionキーワードが(Cのように)である場合、union-find構造体のunion操作にどのように名前を付けますか?foo見た目が違うからといって、それを呼ぶつもりunionですか?
フレッドフー

OTOHは、clsクラスメソッドの標準引数名です。また、たとえばDjangoのオブジェクトには.id属性があり、もちろんid組み込み関数と競合します。
バルテック

1
@GoloRodenユニオンを計算するときに2セットを「結合」していると言う人はいません。これは専門用語の一部ではありません。「マージ」の方が優れていますが、mergeメソッドには、ユニオンを実装し、純粋に技術的な理由で名前が変更されたことを明示的に示すドキュメントが必要です。
フレッドフー

2
@GoloRoden Merriam-Websterによると、動詞ではありませんが、この回答をご覧ください。
maaartinus

18

コードの匂い。

string stringVariable = "";

上記のコードでは、使用目的の変数については何もわかりません。

class Klass

同じ問題

string UserNameString = "bmackey"

上記のコードでは、変数名にキーワード文字列を追加する必要はありません。変数名で型を識別する必要がある場合は、コードが長すぎます。凝縮リファクタリング。


「コード」ではなく、孤立した変数宣言であるため、何も伝えません。「クラス」または「クラス」は、あなたが知る必要があるすべてをあなたに非常によく伝えるかもしれません。たとえば、一般的なメソッドはClass<T>パラメータを受け取ることがあり、これは理にかなっています。だから、コードの匂いだとは思わない。
アンドレスF.

5

個人的には、あなたのコードスタイルにとって完全に有効なオプションだと思います。

これらは予約語であるため、コンパイラーは、言語メカニックなのか変数なのかを判断する必要がありません。それを念頭に置いて、それ人々が予約語のような変数を必要とすることを期待していることを意味します。

JDK 1.6 R21にバンドルされているソースを調べてみると、917個の「clazz」が見つかっています。どうやら、彼らはそれが許容できるスタイルだと思っていた。

あなたのチームはそれについてどう思いますか?あなたはそれが悪いと思うが、あなたのチームの他の9人の男がそれが良いと思うなら、あなたは弾丸を噛んでそれを受け入れなければなりません。何が問題なのか、何が問題でないのかについてのコミュニケーションがあり、あなたが見ているように見える問題を持ち出している限り、それは問題ないはずです。

あなたのチームがコードスタイルについてどのように感じているかは、私の意見やこの投稿の他の誰かよりも重要です。それは、これと、あなたが持つかもしれない他のコードスタイルの決定に当てはまります。


1
しかし、最終的にはチームが変わります。長い年月を経て、クラスとクラッツに満ちたコードを見て、「WTF!」と言う貧しい男がいるでしょう。
MrFox

4
両方klassを使用している場合、それはclazz悪いことです。一貫性を保つ必要があるので、彼らは一度だけそれを学ぶ必要があります。そして理想的には、これもチームスタイルガイドラインで詳しく説明されているので、それほど驚くことではありません。
corsiKa

コードは、チームの人々だけでなく、世界中の人々のために書かれています。チームが全員が崖を越えるバスに乗っていると、他の誰かがコードを読み始めます。変数の表現方法ではなく、変数が何であるかを完全かつ簡潔に説明する名前を使用してください。
ロブK

1
いいえ、単にいいえ。あなたのチームは、時間をかけてゆっくりとメンバーをローテーションする可能性がはるかに高いです。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など。

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よりもずっとよく説明できます。


私見では、それは良くありません、あなたはそれを「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

スペルミスを使用する場所は、予約語が明らかに仕事に最適な場所です。あなたが誘惑されるかもしれないミススペルを使用しない 2つの場所があります。

  1. いい名前を考えたくない
  2. ダミー変数が必要なだけで、わかりやすい名前は必要ありません

最初のケースでは、遅延が高品質のコードを作成するための良いポリシーであることはめったにありません。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はどのように機能しますか?論理はあいまいです。名前が無意味なので、コードを読むたびにクラスの定義を調べるように強制されます。代わりにnextMeeting(MeetingRoom meetingRoom)があれば、クラス(klass?clazz?)を1つ少なくして読み取り、生産性を高めます。コードは、書かれているよりもずっと多く読まれます。
MrFox

@suslik- nextMeeting(MeetingRoom r)たくさんです。meetingRoomそこに行くのは何ですか?tiがnextMeeting(int meetingRoom)理解できたとしても、私のポイントは、他のソースから情報がすでに利用可能な場合に短い変数名を使用することです
レックスカー

私の投稿は、コードベースでのクラスの存在に関するものでした。短い変数名に同意することもありますが、メソッドが長くなり、「r」がMeetingRoomであることを確認するためにsrcollを続けなければならない場合、それも素晴らしいことではありません。しかし、meetingRoomの欠点は何ですか?水平スペース?入力するには長すぎますか?
MrFox

@suslik-はい、長い変数名では水平コンテキストが失われます。長いメソッドでは垂直コンテキストが失われるため、それらを回避することをお勧めします(ただし、とにかくそれを行う場合は、変数名をより良いリマインダーにしたいでしょう)。 予約語があったときKlassの代替手段でした。元のスペルが使用可能なときにスペルミスを使用することはお勧めしません!
レックスカー

0

Class klass実際にClassクラスのインスタンスを操作するリフレクションを行うときの正当な使用を見てきました。


2
問題は、インスタンスがある場合があるかどうかではなく、そのスペルを使用するか、またはuserClassその他のオプションなどのよりわかりやすい名前を使用するかどうかです。
ニコール

2
このような場合、私が好むclassInstanceオーバーklass
コンラッドモラウスキー

2
@KonradMorawski:ただし、使用するオブジェクトはすべてインスタンスなのでclassInstance、かなり冗長です。さらに、私はのようなものを想像することができましたclass klass; Object classInstance = klass.newInstance;
maaartinus

0

良くも悪くも予約語になっている一般的な単語の意図的なスペルミスを含むコードをよく見ます:

クラスのクラスまたはクラス:クラスclazz = ThisClass.class

SQLのcountのカウント: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道に沿って
ブヨ

0

スペルミスは常に悪い考えだと思います。読者にとっては良くありません。私は、その言葉を見たときに何かを見逃したかどうか疑問に思っていますklass。(それらclassは海賊を意味しましたか、それとも海賊を意味しましたか?)少なくとも私にとって、私が認識するすべてのスペルミスは刺激的です。

予約語が実際に変数について知られている唯一の重要なものであるごく少数のケースでは、次の代替手段を使用します。

  • 関数の引数の場合、のaClass代わりに使用しますclass

  • ローカル変数またはメンバー変数の場合は、のmyClass代わりに使用しますclass

  • アクセサーの場合は、のgetClass()代わりに使用しますclass()

もちろん、追加されたプレフィックスは非常に無意味であり、そのため最後の手段としてのみ使用する必要があります。しかし、少なくとも読者のメンタルパーサーを妨害することはなく、予約語を避けるためのフェイルセーフな方法です。


0

創造的なスペルの利点の1つは、検索機能の向上です。間違ったものすべてを見つける頻度が高い一般的な単語と、1000個の単語を検索するよりも、ユニークなものを完全にコード検索する方がはるかに簡単だと思います。例として、私はkzpg.comを所有していました。Googleに今すぐアクセスすると、わずかなヒットしか表示されません。それはユニークであり、したがって非常に見つけやすいです。

しかし、ある意味では、この質問は実質的な意見以上のものだと思います。私は個人的にForthで育ちました。そこでは言葉とその多くがすべてでした。指を節約するために非常に創造的になることを学びました。結局、ソースベースには多かれ少なかれ、約640,000の文字がありました。そのため、仕事を終わらせるには言葉を短くすることが重要でした。


そのリンクは現在壊れています。
ピーターモーテンセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.