命名規則が言語と競合する場合はどうしますか?


14

さて、これはいつも私を悩ませた小さなものの一つです。通常、識別子は省略しません。短い識別子(例:)を使用するのiは、タイトなループのためだけです。したがって、C ++で作業しているときに、名前を付ける必要のある変数がある場合、operatorまたはclass回避するか、略語を使用する必要があるため、それが突き出てしまうため、イライラします。警告:これは、ドメインオブジェクトがホスト言語の概念を反映し、不注意に衝突を引き起こす可能性があるプログラミング言語の設計に多く携わっているため、不均衡に頻繁に発生する可能性があります。

これにどう対処しますか?短縮しますか?(op)スペルミス?(klass)他に何か?(operator_


7
名前空間とは別に、おそらく命名規則の変更を検討する必要がありますか?ごめんなさい。
クリス

1
@クリス:あなたはプログラマーが明白なことに気付くことを決して信用できない!(この場合、私は持っています。)
ジョンパーディ

7
PHPの$var構文が好きな理由がある場合、これがそれです。
ジョーイアダムス

3
@Joey Adams:この質問を見て、SEの周りに浮かぶすべてのPHPバッシング質問を思い出したとき、私は少し微笑んだ。
クリス

3
明らかに、言語のソースコードを変更して、命名規則を許可します。これには、インタープリター/コンパイラーでのみ実行/コンパイルされるため、コードを「保護」するという利点もあります。
-Dietbuddha

回答:


21
  1. 大文字の追加など、命名規則を少し変更する必要がある場合があることを受け入れます。これをできるだけ早く受け入れて、後続のすべてのコードの一貫性を保つことをお勧めします。

  2. より具体的にすることを検討してください。キーワードはとても狭く、かなり広範になりがちclassにダウンdemonstrationClassの問題を回避していないだけでなく、読みやすさを向上させます。


10

これは私が遭遇したものではありませんが、そのような状況に陥った場合、次のオプションで順番に解決しようとします。

  1. 同義語を見つけてください。
  2. (特に変数の場合)接頭辞または接尾辞を見つけようとします
  3. (特にクラスの場合)最初の文字を大文字に変更し、大文字と小文字の違いだけで名前を変えてはならないコーディング規則を忘れます。このオプションは、競合がキーワードにある場合にのみ使用するでしょう。
  4. 略語を使用します。

1
特にタイプのパラメータがconst Foo&以外の適切なフルネームを持たない引数リストでは、大文字と小文字の違いだけで名前の違いはわかりませんfoo。確かに、関数の本体に存在し、あまり専門的ではない目的に役立つ場合Fooよりも、よりわかりやすい名前を付ける方が良いかもしれませんfoo
ジョンパーディ

@Jon-私は同意しますが、個人的には大文字と小文字を変えるのではなく、「p _」、「l _」、「m_」の接頭辞を使用する傾向があります。名前がすべて同じであることが明らかなため、この規則を採用しました。もちろん、特定のコンテキストで一貫して使用する限り、これに対処するためにどの規則を使用するかはほとんど無関係です。
Steve314

@Jon-同名の問題がある場合にのみ規則を選択的に適用するようにコメントが読みますが、これは私が意図したものではありません。コンテキストの問題は、言語、プロジェクトなどに関連します。慣例は、問題が発生するたびに非問題であるように設計されており、必要に応じて選択的に適用されることはありません。
Steve314

@ Steve314:最初のコメントからあなたの意味を得た。私はわからない、そのような接辞はいつも私の快適さのためにSystems Hungarianに少し近すぎると感じた。
ジョンパーディ

@Jon:それは私が宗教的に適用する規則ではありませんが、2つの識別子が大文字と小文字の違いしかない場合、間違いを犯しやすいと思います。これらのエラーの一部はコンパイラによって検出され、一部は非常に見つけるのが困難です(特に、2つの識別子が同じ種類の名前を付けている場合)。私は、可能性のあるすべてのケースを網羅した一冊のルールよりも、ケースバイケースの例外を含む、1つの一般的なルールを持つことを好みます。
バートヴァンインゲンシェナウ

6

言語が勝ちます。コンパイラの裏をかくことはできません(PL / 1などの嫌悪感を無視しますIF IF = THEN THEN THEN = ELSE ELSE ELSE = IF ENDが、PL / 1はそもそも質問をすることはありません)。基本的に、あなたは言語の規則に従わなければなりません、そしてあなたはあなた自身の使用のために言語のキーワードに代わるものを見つけなければなりません-または、代替言語を見つけなければなりません。

したがって、非常にまれな状況を除いて、言語に適応しますが、その逆ではありません。


5

延長する方法を短縮する代わりに?Foo言語でクラスコンストラクトを実装している場合、FooClassとfoo_classを使用してはどうですか?(ケーシングの設定が何であれモジュロ)。


Javaコードで使用するすべての識別子に「java」のプレフィックスを付けますか?そして、すべての識別子に「C ++」をプレフィックスする問題について言及することさえできません
...-Steve314

@ Steve314、Javaコードではプレフィックスjavaを使用しません。javaコンパイラを実装するc ++コードではプレフィックスjavaを使用します。また、識別子の残りがキーワードである場合にのみ使用します。
ウィンストンイーバート

OK-識別子が参照するものをより具体的にするなど、一般的な用語で長くすることを意味します。さまざまなアプリケーションでは、「クラス」の名前を「class_taught」、「class_of_animal」、「classiness_value」などに変更できます。私は同意します-コンパイラー指向の例は紛らわしいだけです。
Steve314

5

に使用した略語のいくつかを、class頻度の順に示します。

  • cls
  • clss
  • clazz
  • theClass
  • aClass

Classインスタンスが表すクラスがわかっている場合、変数名に含めることができます。

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

以前は「cls」を見たことがない。私は主にaClassを使用します。
コンスタンチンペトルフノフ11年

4

CおよびC ++では、キーワードはすべて小文字であり、言語では大文字と小文字が区別されるため、シフトキーを時々押すと、多くの問題がなくなります。

Modula 2では、キーワードはすべて大文字である-しかし、あまりにも長い間、あなたの識別子を持っているように、いくつかの小文字を違いは明白であるとは不可能衝突します。

また、絶対的な命名規則は、使用している言語の通常の規則を反映する必要があるため、Javaで「myClass」を記述し、C ++で「My_Class」を記述する可能性が高くなります。

基本的に、あなたはコンパイラーのためだけに書いているのではなく、人々が読めると思うものは、文脈と関連する期待にある程度依存します。


3
大文字と小文字を区別する言語の場合でも、混在するclassClassコードの可読性が損なわれると感じています。
カルマスタン

@Karmastan-おそらく、大文字と小文字を区別する言語と規則をどのくらいの時間費やしたかによって異なります。個人的には、大文字と小文字の「C」は視覚的に非常に明白です-長い識別子の場合の使用パターンは、読むことができるよりも速く見えます。
Steve314

3

私はこれに頻繁に出会うことはありませんが、Delphiを使用し、識別子の前に&を付けることでこの問題を回避できるので、そうすることは問題ではない傾向があります。したがって、「クラス」は有効な識別子ではありませんが、「&クラス」は有効です。


面白い。識別子を使用できる場所であればどこでも文字列リテラルを許可するコード生成ユーティリティがあります。元々、生成されたコードのほとんどの識別子は、文字列リテラルとして記述されており、成長する(キーワードが豊富な)DSLとのキーワード衝突のリスクを回避していました。現在、ほとんどの名前に識別子が使用されていますが(ソースの読みやすさは驚くほどです)、文字列リテラルは常にフォールバックとして使用できます。コード生成には適していると思いましたが、汎用言語ではキーワード衝突回避策は悪い考えでしょう-しかし、私は間違っているかもしれません。
Steve314

2

変数名になんらかの名前空間を追加します。たとえば、userという名前のモジュールがある場合、変数名演算子をuser_operatorまたはuserOperatorのようなものに変更します。


2
プレフィックスとして「スムーズ」、「ノー」、「マイ」を使用しないでください
スティーブンA.ロウ

2
絶対に。「Jon_Purdys_Carefully_Chosen_Identifier_Prefix_」に投票します。
Steve314

1
@Steven:さらに悪いことに、私が見るaanthe初心者CSの学生によって周波数を乱すと一緒に使用します。
ジョンパーディ

1
@Jon Purdy、それは私たちのせいではありません!クラスPeople()のインスタンスに名前を付けることにした教授を非難しますaPerson
ベンL

@ジョン:私はローカル変数で始まる必要があることを指定で働く命名規則a離れタイトなループ変数から:/
マシューM.

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