論理オプションが予約キーワードである場合、どのように名前を付けるのですか?[閉まっている]


64

時折、何かの最も論理的な名前(変数など)は、選択した言語または環境で予約されているキーワードです。同様に適切な同義語がない場合、どのように名前を付けますか?

この問題にはベストプラクティスのヒューリスティックがあると思います。これらは、プログラミング言語とプログラミング環境の作成者または管理者によって提供されます。たとえば、python.org(またはGuido van Rossum)がPythonでそれを処理する方法を示している場合、それは私の本の良いガイドラインになります。C#での対処方法に関するMSDNリンクも参考になります。
または、ソフトウェアエンジニアリングの主要な影響力のある人が提供するガイドラインも有益です。おそらくGoogle / Alphabetには、対処方法を教えてくれる素敵なスタイルガイドがありますか?

次に例を示します。C#言語では、「デフォルト」は予約キーワードです。enumを使用する場合、デフォルト値に「default」(「switch」ステートメントに類似)の名前を付けることができますが、できません。
(C#が大文字と小文字が区別され、enum定数は大文字でなければならないので、「デフォルト」ここで当然の選択ですが、私たちの現在のスタイルガイドは、すべてのenum定数は小文字であることをされている指示と仮定しましょう。)
私たちは、単語「defaultusを検討することもでき「しかし、これは最小驚きの原則に準拠していません。「標準」と「初期」も考慮する必要がありますが、残念ながら「デフォルト」はこの状況でその目的を正確に伝える言葉です。


15
「default_value」のようなものを使用します。意味は変わりませんが、さらにいくつかの文字を入力する必要があります。
マエル

26
@Darkhogg私のコードでそれらのいずれかを見つけた場合、私はすぐにそれらを変更します。スペルミスや命名規則違反は受け入れられません。
メタファイト

26
@MetaFight-Javaの場合、クラスを保持する変数を呼び出すことはclazz事実上事実上の標準です。それは本質的である、プラットフォームの命名規則の一部。他の何かをすることは、他の人があなたのコードを読んでいるかもしれないという期待に反するので、絶対に必要な場合にのみ行うべきです。
ペリアタブレアッタ

6
列挙値としてのデフォルトは反生産的と思われます。デフォルトを説明するドメイン固有の名前にする必要があります。ただし、デフォルトを返すメソッドが必要です。
qwerty_so

18
@AndresF。同意しません。私はJavaの設計者に反論するのは非常に簡単だと感じることがよくあります。しかし、私は彼らに対してそれを保持しません。彼らは野生の西で働いていました。
メタファイト

回答:


63

列挙型オプションの場合、のようなタイトルケースを使用する必要がありますDefault。C#では大文字と小文字が区別されるため、予約キーワードと競合しません。.net命名ガイドラインを参照してください。

すべてのパブリックメンバーは.netのタイトルケースであり、すべての予約名は小文字である必要があるため、ローカル変数(パラメーターを含む)を除き、実際にこれに遭遇することはありません。また、地元の人は通常、名前として名詞やフレーズを持っているため、最も自然な名前がキーワードと衝突することはほとんどありません。例えば。defaultValue通常は、より自然な名前になりdefaultます。したがって、実際にはこれは大きな問題ではありません。

C#では、「@」などの識別子として使用できるように、「」プレフィックスを使用して予約済みキーワードをエスケープできます@default。しかし、これは本当に他のオプションがない場合、つまり、識別子として予約されたキーワードを使用するサードパーティのライブラリとインターフェイスする場合にのみ使用してください。


もちろん、他の言語では構文とキーワードが異なるため、この問題の解決策も異なります。

SQLには非常に多くのキーワードがありますが、のような識別子を単純にエスケープすることは非常に一般的[Table]です。キーワードと衝突するかどうかに関係なく、すべての識別子に対してそうする人もいます。(結局、衝突するキーワードが将来導入される可能性があります!)

Powershell(および他の多くのスクリプト言語)は、すべての変数の先頭に$などのシギルを付けます。これは、キーワードと決して衝突しないことを意味します。

Lispには、少なくとも従来の意味では、キーワードがまったくありません。

PythonPEP-8で公式に認められた規則を持っています:

クラスメソッドの最初の引数には常にclsを使用します。

関数の引数の名前が予約済みのキーワードと衝突する場合、一般的に、略語やスペルの破損を使用するよりも、末尾にアンダースコアを1つ追加する方が適切です。したがって、class_はclssよりも優れています。(おそらく、同義語を使用してこのような衝突を回避する方が良いでしょう。)

BrainfuckWhitespaceのようないくつかの言語は、単語の定義をまったく避け、問題をエレガントに回避します。

つまり、特定の言語の構文と規則に大きく依存しているため、質問に言語に依存しない答えはありません。


2
ただし、大文字と小文字の区別だけに頼るべきではありません。実際には問題になることはほとんどありませんが、すべての.NET言語で大文字と小文字が区別されるわけではないため、ある時点で予期しない問題が発生する可能性があります。
ビベリン

6
@Vivelin:他の言語の問題につながる可能性があるため、大文字と小文字のみが異なるパブリックメンバーまたは型名を使用しないでください。ただし、キーワードは識別子ではないため、これは私が提案するものとは無関係です(他の言語には他のキーワードがあります)。
ジャックB

@構文が使用できる場合でも、異なるキーワードを使用して記述された言語のライブラリと対話する必要があるシナリオに最適です。たとえそうであっても、言語機能をのようなものにする方が良かったと思います#defineが、右側のオペランドは常に大文字と小文字を区別する識別子として解釈されます。これにより、多くの種類の名前の競合を解決できます(大文字と小文字を区別しない言語の場合、大文字と小文字を除いて同一のシンボルのインポートを含む)。
-supercat

@Vivelin はすべての.NET言語で大文字と小文字が区別されるわけではありません -私はVB.NETとPowershell を知っています。他に何かありますか?
ゼフスピッツ

@ZevSpitz OPは特にC#を呼び出したので、Vivelinがそれを例として使用したと思うのですが、VB.NETは大文字と小文字を区別しないので、いつものように、言語ごとに下がると思います。すべての言語に同じ予約語があるわけではない
-Shaggy13spe

22

アンダースコア(default_)を追加します

長所:

  • シンプルな
  • 明らか(他にアンダースコアを追加する理由は?)
  • 一貫した
  • 使いやすい
  • 私が知っているすべての現代言語で動作します
  • 論理オプションに最も近い

他のソリューションが好きではない理由:

シノニム:

  • 見つけにくい
  • 多くの場合、まったく同じ意味ではありません(ニュアンス)

単語の追加/追加:

  • inconsistent(defaultValue、defaultItem)
  • 読みやすさを増やさずに冗長性を高める

文字の変更(クラスの代わりにクラス):

  • 一貫性のない(clazz、klass、klazz)

数字を追加する(デフォルト1):

  • default2の質問を発生させます

手紙の追加/追加:

  • 明らかではない(プログラマは、それが名前衝突に使用されたものであり、他の何かのショートカットではないことを推測する必要がある)

キーワードのエスケープ(@default(c#)、 `default`(scala))

  • 一部の言語でのみ可能
  • 主に他の言語との互換性のために、めったに使用されない機能
  • apiのユーザーが使用するのが難しくなります(実行方法を知っており、実行方法を覚えておく必要があります)

使用しない場合:

  • 既存の、広く使用されている他の規則
  • 私はすでに適切な同義語を知っています
  • あなたの特定の列挙型の場合、私は@JacquesBの回答に従います

7
これは、Pythonでよく使用されるソリューションです。私はそれを最もエレガントだと主張していませんが、うまくいきます。
フララウ

1
@fralau Pythonは特に悪い-私は本当に「入力」のような識別子が嫌い
クリスチャン・ザウアー

多くの言語klassclassは、予約語が変数であることがわかります。私は見defawltたことがありませんが、それは同じ考えです。私は好むdefault_でしょう(そしてそうclass_することによって確立された慣習を踏みにじらないなら)。
nigel222

キーワードをエスケープするオプションは含まれていません。
CodesInChaos

1
「アンダースコアが使用された理由は明らか」であるかどうかはわかりませんが、あなたは妥当で理にかなった議論をします。私は、彼らが働いている言語のすべてのキーワードを知っているfroodsをめったに使用していません!
プロテクター1

18

「デフォルト」はおそらく有用な列挙値ではありません。使用されるコンテキストに応じて変化する可能性のある動作を表します。

つまり、言語で大文字と小文字が区別される場合は、単語に別の大文字と小文字を使用します。(デフォルトとデフォルト)

または、さらに良いことに、さらにいくつかの文字を入力してDefaultValueと呼びます。


3
同意する。「デフォルト」は、値が何であるかを示しません。enum ErrorHandlingLevel { Default = 0, ... }対を検討してくださいenum ErrorHandlingLevel { None = 0, ... }。2番目の例ではNone、enum値を0に設定するか、xmldocを使用するか、コードで明示的に指定することにより、デフォルトであるという事実を知ることができます。オブジェクトにがErrorHandlingLevel設定されている場合、それが何を意味するのかを知るという追加の利点が得られますNone。これErrorHandlingLevelをデフォルトに設定してオブジェクトを検査することと比較してください。
ハリソンペイン

9

明確にするために、命名規則をローカルで変更しない(または意味のない文字を追加する)ことを強くお勧めします(他の投稿で提案されているように)。意図が明確でない場合は混乱を招き、なぜこのように命名されたのかについて疑問を投げかけることがあります。それなしで解決できます。

すべての場合において、同義の意味を持つ単語を使用するか、名前をより具体的にする(または冗長にする)ことができます。コンテキストの繰り返しを導入する場合でも、より良い解決策になる可能性があります。

たとえばMode、あなたの場合のようにデフォルト値を公開する列挙型があるとしましょう。default_mode繰り返しのために命名するのが最良ではないかもしれませんが、必要な意味を伝えながらあいまいさを避けます。


あなたは正当な点を述べていますが、私はまだ何がより混乱を引き起こすのか分かりません:一貫して付加された断片を持つこと、またはあらゆる状況で異なる言葉を使うこと。もちろん、前者のオプションに反して、そもそもそれが使用される状況は(できれば)非常にまれなので、既存のコードから一貫性を推測することはできません。
プロテクター

3

別の単語または変更された単語を使用する必要がありますが、それは明らかです。
したがって、これは通常次のいずれかを意味します

  • まったく違う言葉
  • プレフィックス
  • サフィックス

決定するもう1つの要素は、複数の単語を結合する方法です。オプションは通常

  • allonewordnoseparators
  • words_with_underscores-or- dashessnake_case
  • CapitalizationForClarityAndReadability(CamelCase

私の提案は、接頭辞または接尾辞とアンダースコア/ダッシュを使用することです、例えば

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

local_defaultすべてのローカルが整列しているため、すぐに目立つという利点がありますが、一意の名前を取得するには常に2番目の部分を読む必要があるという欠点があります。 default_localは、一意の変数名がすぐに表示されるという逆の利点がありますが、ローカルは必ずしも視覚的に簡単にグループ化されるとは限りません。

私が見たdomain_specificアプローチのいくつかの例は次のとおりです。vehicle_model代わりにmodel予約語でした。room_tableSQLテーブルtableは予約語です。

言語またはスクリプトの使用を見た他の2つのオプションは次のとおりです。

  • 変数名を囲む引用符またはバックチップ。したがって、予約語を使用できます。これと同様に、一部の言語ではバックスペースなどの特殊文字を使用して名前をエスケープできる場合があります。
  • 変数名のスペース。

少し面白いかもしれませんが、アンダースコアを使用する場合とダッシュを使用する場合のwords_with_underscores-or-dashes2つの名前で言及されているのを見てきました。後者は面白いと思いました。snake_casekebab-case
VLAZ

2

明らかに、そのような状況を避けるためにできることをしてください。私は1970年代後半からソフトウェアを書いてきましたが、予約語を実際にファッジしなければならなかった時代は、10歳未満で、おそらく5に近いでしょう。

最初または最後の文字を2重にする(reservedd)、先頭または末尾のアンダースコアを追加する()など、できることはたくさんありますreserved_。適切なものは、特に先頭または末尾のアンダースコアに関して、あなたが書いている使用言語の規則に大きく依存します。また、人間が誤読する可能性のあるケースでは処理を行わないようにしてください(例:Reservedと異なる場合に使用reserved)。

何かを選んだら、それをコーディングガイドラインに入れ、人々がそれを知っていることと、それが一貫して使用されていることを確認してください。リマインダーコメントを追加して、読者が誤植だとは思わず、再び表示されることを知らないようにします。

int ccase;  // Name dodges a reserved word

10
ないdownvoterが、背筋が提案送ら悪寒「最初または最後の文字を倍増」....
ウィレムバンRumpt

@WillemvanRumpt私もそれをするのは好きではありませんが、多くの場合、体操をするか、頭をひっかくように促す予約語を避けるか、ほんの少しだけを促す奇妙な識別子を選択することになります。
Blrfl

6
判断は意図されていません、ただ....寒気....寒いもの...;)
ウィレムヴァンランプ

1
アンダースコアを後置する方が、最後の文字を2倍にするよりも優れています。(任意の投票classs?)
nigel222

1
コーディングのガイドライン!それがあるといいですね!いい視点ね。
プロテクター1

2

C#では、識別子の名前の前に@を付けることができます。これは、可能なキーワードとしてではなく、識別子の名前として名前を扱うようコンパイラーに指示します。

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

3
過ぎない点、既に作られた(とより良い提示)を繰り返す、この「答え」を投票する誰かしら答え投票トップ前日
ブヨ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.