タイプとスコープの接頭辞は価値のある命名規則ですか?


14

最近、ソフトウェア開発者として最初の仕事を始めたとき、コードの命名規則に従う必要がないと言われたとき、私は少し投げられました。他のより大きなプロジェクトに取り組んでいるグループによって書かれたコードは命名規則に従っていましたが、私は新しいスタンドアロンのアプリケーションを書くために持ち込まれたので、それは特に重要ではないという感じでした。それが私の心配の最後だったので、私はちょうどその既存の慣習を取り、それで走りました。

int nTickCount  
bool bConnected  
object[] m_aItems  
fSum += fWeight * fValue  
class cManager  
enum etSystemStates  
etSystemStates eState  
cManager.cs

しかし、実際に価値があるのでしょうか?この種の命名規則に従うことがエラーの理解と検出に与える正味の効果を判断するのは難しいと思いますが、視覚的には、それはちょっといように見えます。さらに、cSomethingと呼ばれるプロジェクトにすべてのクラスとファイルがあることは、非常に簡単です。

私が採用しているアルゴリズムやアーキテクチャのような明らかな違いをもたらすものと比較した場合、それはリモートで大したことではないという幻想ではありません。しかし、私が書いたコードのすべての行に影響する規則は、正しく理解する価値があるようです。

使用する必要がある場合、最もエレガントで効果的な命名規則は何ですか?タイプやスコープを示していますか?

回答:


28

Joel Spolskyはハンガリー語表記法が存在する理由と、その表記法があなたの質問に答える助けになるかもしれないという記事を書きまし

データベーステーブルのtbl、整数のintなどのプレフィックスは一般的には役に立ちません。そのような場合、コンテキストまたは開発ツールから何がわかるのかは簡単です。帝国の測定ではimpであり、メートル法で満たされているようなものはもっと意味があります。そうでなければ、浮動小数点数であることがわかるだけです。

area = width * height

完璧に見える

impArea = metWidth * impHeight

何かが間違っていることをすぐに示します。

個人的には、説明的な変数名を使用しています。$ number_of_itemsは明らかに整数カウントです。$ input_file_handle、$ is_active、および$ encrypted_pa​​sswordには、言語データ型とセマンティック型の両方の観点から明らかな型があります。


13

あなたが説明しているものはハンガリー記法と呼ばれます。かつてはベストプラクティスと見なされていましたが、現在は一般的には眉をひそめています。

ウィキペディアの記事には、長所と短所に関するセクションが含まれています。


13

はい、プレフィックス便利ですが、いくつかの提案があります。

チーム全体が同じ規則を使用している場合、それらははるかに便利になります。それらを自分で使用することはあまり役に立ちません。

強く静的に型付けされた言語では、変数の型を単にコピーしないでください。たとえば、「bSubscribed」は、C#またはJavaのブール変数には不適切な名前です。これは、IDEがそれがどのタイプであるかをすでに知っているためです。一方、ブール型を持たないCでは、これは有用な情報になります。

C#およびJavaでは、プレフィックスがオブジェクトがnullである可能性があることを示すことを検討できます。または、文字列がHTMLエスケープされていること。または、正規表現、またはsqlステートメントを表します。または、配列がソートされていること。想像力を使って。

基本的には、変数名を教えてほしいと自問する質問であり、それはあなたが働いているドメインと言語に大きく依存します。


7

命名規則にはいくつかの異なる「スタイル」があり、それらのほとんどはコードを理解可能にするのにいくらかの価値があります。

FARのより重要なことは、変数と関数にわかりやすい名前を使用することです。「sum」、「weight」、および「value」を使用した例では、「totalCost」、「lumberWeight」、「lumberValuePerOunce」という意味のある名前を付けたい場合があります(ここではいくつかの仮定をしています)

ほとんどの現代言語では、変数名の前に型を表す文字を付けると、かなり注意散漫になるという慣習があります。


6

ほとんどの.NET開発者は、Microsoftの設計ガイドライン(http://msdn.microsoft.com/en-us/library/ms229042.aspx)に従います これはJavaによく似ています(主な違いは、Microsoftはメンバー名にPascal Caseを好む一方、Javaキャメルケースを好む)。

それとは別に、あなたが追加した余分なノイズのために、あなたのコードサンプルははるかに読みにくいと思います。



5

データ型(特にプリミティブデータ型)を変数名の前に付けると、視覚的なノイズが増加し、さもなければ小さな変更がビッグバンの名前変更になるリスクが高まります。

最初の点について、「intStudentCount」は、例えば「numberOfStudents」よりも本当に明確ですか?「invoiceLineItems」は、少なくとも「aobjItems」ほど有益ではありません。(データ型は、低レベルの表現ではなく、問題ドメインのデータの意味についてである必要があります。)

2番目のポイントについては、たとえば、intの時期尚早の選択がlongまたはdoubleに置き換えられるとどうなりますか?さらに悪いことに、具象クラスが複数の実装クラスを持つインターフェースにリファクタリングされるとどうなりますか?現実的なメンテナンスシナリオの負担を増加させるプラクティスは、私には疑問の余地があります。


4

また、名前にプレフィックスを付けるだけでなく、名前にプレフィックスを付ける理由にも依存する場合があります。

例として、フォーム上のコントロールの名前に1〜2文字のプレフィックスを使用する傾向があります。コンパイラがボタンに適したクラスを簡単に見つけられることを知らないからではありませんが(例として)、最初に大きなフォームを設計し、その後ほとんどのコードを記述します。

ボタンにbtのプレフィックスを付けると、多数の名前が混同されるのではなく、後で正しいボタンを簡単に見つけることができます。

ただし、変数の名前付けには接頭辞を使用しません。タイプ(一般的にはそれほど有用ではありません)、意味、コンテキスト、または単位(ハンガリー語表記の背後にある元のアイデア)にも使用しません。


3

私の見解では、それはプロジェクトの言語とサイズに依存します。私はすべての変数で型プレフィックスを使用するまで実際に行ったことはありませんが、明確な方法で名前を付けたいと思っています。

使用しているような静的に型付けされた言語では、型システムに慣れているほど、ハンガリー語表記の重要性は低くなります。JavaやC#、特にHaskellでは、これらのプレフィックスを追加することすら考えていません。なぜなら、ツールは与えられた式の型を教えてくれ、型を誤解することで生じるほとんどの間違いをキャッチするからです。


1

多くの場合、プレフィックスはオブジェクトに対して意味があります。たとえば、20個のテキストボックスを使用してそれらをすべて呼び出すようなフォームでtbSomethingは、意味があります。

ただし、ほとんどの場合、特に値の型については価値があるとは思いません。

たとえば、次のものがあるとします。

short shortValue = 0;
//stuff happens

数ヶ月後、あなたはそれを変更する必要があると気づきます-短いだけでは十分ではありません。今、あなたは持っています:

int shortValue = 0;
//stuff happens

変数の名前も変更しない限り(この場合、型を変更するよりもコードを壊すリスクが高くなります)、混乱するコードがあります。

あなたはそれが保持するものを説明する名前を持っている方が良いです:

int loopCounter = 0;
//stuff happens

後でそれをlongに変更する必要がある場合:問題ありません。

動的に型付けされた言語やIDEを持たない言語では、これらの規則についてもっと議論があるかもしれません。


0

私は常に、変数自体の前の型に2〜4文字の略語を使用する傾向がありました。時には退屈に思えますが、複雑なデータ型や状況で作業しているときは有益になります。キャメルケースの下位カテゴリーに分類されると思います。

上記の例を見ると、次のようにわずかに変更されます。

int intTickCount;
bool boolConnected;
object[] aobjItems;

配列は常に、配列を指定するために型の前にaを持ちます。これにより、同様の変数インスタンスをグループ化することもできます。たとえば、私は使用することができます...

taStore.Fill(dtStore);

...これは、Store TableAdapterがStore DataTableに入力していることを示しています。


0

接頭辞や接尾辞は、コードを読みやすくするときにのみ挿入するという基本原則を常に守ろうとしました(英語のように)。

不可解なほど、より良い...

このような方法があるのはなぜですか:

public boolean connect( String h, int p );

次のようなことができる場合:

public boolean connect( String hostName, int port );

さらに、今日のIDEには、(特にJava)変数、メソッド名、クラスなどをリファクタリングするための強力なツールがあります。最小限の文字で最大の情報を言うという考えは、昔ながらの方法です。

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