通常、言語には、プログラム内の名前 (変数、関数、クラスなど) とまったく同じスペルとケースで直接使用できないキーワードがあります。しかし、何かに名前を付けるための唯一の自然な選択がキーワードである場合もあります。選択したテクノロジーでこの衝突を回避/回避するためのシステムは何ですか?
16 に答える
私は通常、名前を避けます。別の名前を見つけるか、少し変更してください (たとえば、C# や Javaclazz
の代わりに) 。class
C#では @ プレフィックスを使用できますが、これはひどいものです。
int @int = 5; // Ick!
変数に名前を付けることができなくなるという点で、キーワードについて本質的に包括的なものは何もありません。すべての名前は、あるタイプのある程度一般化されたインスタンスにすぎないため、抽象化を常に上または下に移動して、別の有用な名前を見つけることができます。
たとえば、学生を追跡するシステムを作成していて、特定の分野での学生の学習を表すオブジェクトが必要な場合、つまり、学生が何かで「クラス」を受講した場合、用語を直接使用できない場合、または複数形"classes"、または "studies" のような代替物である場合、より "インスタンス化された" バリエーション (studentClass、currentClass など) またはより高度な視点: "courses"、"courseClass"、または特定のタイプ属性 (dailyClass、nightClass、等
多くのオプションがありますが、最も単純で最も明白なものを優先する必要があります。それだけです。
私はいつもユーザーの話を聞くのが好きです。なぜなら、彼らの言語の範囲が問題の範囲を定義するのに役立つからです。多くの場合、十分に長く聞くと、同じ根底にあるものに対して多くの複数の用語があることがわかります (わずかな違いのみ)。 . 彼らは通常答えを持っています...
ポール。
私のシステムはキーワード期間を使用していません!
関数/変数/クラスがあり、キーワードで名前を付けるのが論理的だと思われる場合は、キーワードの前に説明的な単語を使用します。
(形容詞名詞) 形式。つまり、「Name」がキーワードである Name の代わりに personName を使用します。
よりわかりやすい名前を使用するだけです。たとえば、「id」は識別子になり、「string」は「descriptionString」になります。
Python では通常、名前の衝突を避けるためにモジュールに適切な名前空間を使用します。
import re
re.compile()
それ以外の:
from re import *
compile()
ときどき、キーワード名の衝突を避けられないときは、変数の名前から最後の文字を削除するだけです。
for fil in files:
pass
前に述べたように、Java/C# で class を clazz に変更するか、アンダースコアを接頭辞として使用します。
int _int = 0;
キーワードを変数名として使用する理由はありません。より詳細な単語を使用するか、類義語辞典を使用してください。単語の特定の文字を大文字にして、キーワードとまったく同じにならないようにすることは、後でコードを継承する誰かにとってあまり役に立ちません。
Python では、一般的に受け入れられている方法は、「_」を追加することです
class -> class_
or -> or_
and -> and_
これはoperatorモジュールで例示されています。
Ruby on Rails での開発 私は時々、この予約語のリストを調べます。
キーワードのない言語を持っている人は幸せです...
しかし、冗談はさておき、「何かに名前を付けるための唯一の自然な選択がキーワードである場合もある」という状況はめったにないと思います。「my」、「do」、「_」などの接頭辞を付けることでうまくいくことができます。
正直なところ、キーワードだけで良い名前が付けられるような例はあまり思いつきません (「int」、「for」、「if」はいずれにせよ間違いなく悪いことです)。C 言語ファミリで意味をなすのは、"continue" ("doContinue" にする)、"break" ("breakWhenEOFIsreached" などはどうですか?)、および既に述べた "class" ("classOfThingy はどうですか?") だけです。 " ?)。
言い換えれば、名前をより合理的にします。そして、常に覚えておいてください: コードは WRITTEN は 1 回だけですが、通常は非常に頻繁に READ されます。
まず第一に、ほとんどのコード規則では、そのようなことが起こらないようにしています。
そうでない場合は、通常、説明的な散文の接頭辞または接尾辞を追加します。
the_class or theClass infix_or (prefix_or(class_param, in_class) , a_class) or_postfix
これは、通常、見つけることができるすべてのコード スタイルのアドバイス (「長い名前は殺されません」、「長い変数名はメモリ内のスペースを占有しないことを約束します。」) と一致しています。キーワードは最良の説明であり、少し悪い方が良いでしょう。
あなたの質問の前提によって、あいまいさが導入されていることに注意してください。これは、コンパイラであろうと人間であろうと、読者にとって悪いことです。class、clazz、klass を使用するのが習慣である場合でも、その習慣が習慣であるほど習慣的ではない場合でも、正確に記述できる単語 word を使用し、それを歪め、事実上 w0rd の精度を撃ちます。 「ワード」。別の w_Rd 慣習や言語に慣れている人は、あなたの世界に対していくつかの厳しい言葉を持っているかもしれません.
私たちのほとんどは、「花」、「家」、または「車」以外にも言いたいことがあるので、通常は typeNames、decoratees、class_params、BaseClasses、および typeReferences についてもっと言いたいことがあります。
これが、私の個人的なコードの難読化許容範囲が終了する場所です。
「キーワード」との名前の衝突を防ぐために、スコープや難解な構文規則に頼ることは決してありません(!!!) 。(それを許可するコンパイラは知りませんが、最近ではわかりません...)。
それを試してみると、誰かが世界であなたを w**d するので、__rd、Word はあなたにとって TeX のように見えます!
通常、私はハンガリー記法に従います。したがって、何らかの理由で「End」を整数型の変数として使用したい場合は、「iEnd」として宣言します。文字列は「strEnd」などになります。これにより、通常、変数に関する限り、ある程度の余裕ができます。
たとえば、UnrealEngine を使用してゲームにアドオンを作成するときなど、他の人が私が何をしたかを確認するためだけに見る特定の個人的なプロジェクトに取り組んでいる場合、名前のどこかに私のイニシャルを使用することがあります。おそらく「DS_iEnd」。
Java での私のシステムは、単語の 2 番目の文字を大文字にすることです。たとえば、次のようになります。
int dEfault;
boolean tRansient;
Class cLass;