web-dev-qa-db-ja.com

同様の変数の命名

関連する変数はほとんど必要ありません(たとえば、3行の長さが指定されています。三角形を形成するかどうかを言わなければなりません)。 Javaでは、どの変数命名規則が望ましいですか?

  1. len0len1len2または
  2. lenZerolenOnelenTwoまたは
  3. lensarrayとして宣言されます。次にlens[0]lens[1]lens[2]

たぶん多くの変数(0、1、2、3、4、......)がある場合、オプション3が推奨されます。しかし、変数が少ない場合は、どちらが望ましいですか?それとも他の慣習に従うべきですか?

これは、更新された質問に基づいています。これは読みやすさの科学的測定に基づいていないことにも注意してください。むしろ、平均ジョープログラマーの可読性に影響を与える可能性が高いと思われるさまざまな要因を示しています。

オプション1 - len1len2len3

これに関する唯一の潜在的な批判は、多分lengthlenと省略してはならないということです。しかし、それに対する反論は、lenが何を意味するのかはコンテキストからおそらく明白であることです。

オプション2-lenOnelenTwolenThree

以前のオプションに勝る利点はありません。欠点は次のとおりです。

  • これらは(ほとんどの人にとって)言葉として読むのが少し難しい
  • これらはタイプするためのわずかに多くの努力です
  • 長さが異なるということは、それらを使用するコードの配置が異なることを意味します。

オプション3-lens[0]lens[1]lens[2]

lensはそれ自体が英語の単語でもあるため、lensの選択は悪い選択です。

その他の問題:

  • 単純な変数よりも読みにくくなっています。
  • あなたは「ゼロから数えています」。ほとんどのプログラマーはこれを行う方法を知っていますが、ほとんどの人が「自然に」行うことと矛盾します1。それはlen[I]またはlens[I]lenIよりも読みにくい
  • これには(小さな)パフォーマンスとメモリ使用量のコストがあります。
  • これにより、潜在的な実行時の危険が発生します。

    • lensの初期化を忘れた場合、NullPointerExceptionが発生する可能性があります。
    • 間違ったインデックスを取得した場合は、ArrayIndexOutOfBoundException。

コンパイラーは、上記の危険をエラーまたは警告としてフラグを立てる場合がありますが、すべての場合ではありません。

しかし、反対に、これは潜在的にlens配列をindexすることを可能にし、これはアルゴリズムを簡略化できます


どれが一番いいですか?

  1. 意見の問題です!
  2. 私の意見では、オプション1または3が最適です...コンテキストによって異なります

1-私は証拠なしでこれを述べます、そして私は "自然数" が何であるかについて競合する定義があることに注意します。ただし、誰かに10まで数えるように依頼すると、mostの人々はゼロではなく1から始まります。 1から数えることは、ほとんどの人々の思考プロセスに根付いています。これが良いことかどうかは重要ではありません。読みやすさは、実際の人々の実際の思考パターンに関するものです...コードの作者がコードの読者がどう考えるべきかについてではありません。

4
Stephen C

変数には、その目的が正確にわかるように名前を付けます。 var0、var1、var2という名前は付けないでください。この変数は単なる例であると思いますが、原則はそのままです。変数に名前を付けるときは正確にしてください。 2つの画面を下にスクロールしてコードを見ると、変数の名前がその名前から何であるかがわかりますか?それはあなたの主要な基準でなければなりません。

変数をグループ化する必要がある場合は、カプセル化クラスまたは構造体を作成しますが、それでも、クラス/構造体およびクラス/構造体自体の属性に名前を付ける方法に注意してください(最初の段落を参照)。

編集した質問に基づいて編集

レン長さはOKです。三角形のアルゴリズムを作成する必要がある場合は、オプション1またはオプション3のどちらでも問題ありませんが、最初に変数に名前を付けます。1。triangleSideLengthX(Xは1、2、3、またはA、B、C)ケース2。2番目のケースのtriangleSideLengths(配列)。

または、次のようなクラスを作成します。

class TriangleSidesLengths {
    public float sideALength;
    public float sideBLength;
    public float sideCLength;
 }

三角形の辺は通常、ジオメトリでは文字で表されるので、誰もがクラスとそのメンバーの意味を正確に知っています。

N-tangleにも同じアプローチを使用できます。

編集する

名前がより明確になるように、クラス名とその属性の名前に「長さ」という単語を追加しました。ただし、属性の名前自体は少しあいまいな場合がありますが、タイプと組み合わせると、1つのこと-側面の長さ-を明確に示すため、これはやりすぎかもしれません。

7
Vladimir Stokic

すべてのオプションが悪いです。変数名は変数のcontentを反映する必要があります-変​​数であることはすでにわかっているので、var0は、私がすでに知っていることにはまったく何も追加しません。それらが論理的にシーケンスであるものである場合、それらを配列に入れますが、配列に適切な名前を付けます-eventsなど。それらが論理的に順番に並んでいない場合は、startEventendEventなど、必要なものを呼び出してください。

2
Philip Kendall

コードでは、変数の名前は、何をしようとしているのかを表現する必要があります。 3つの線を使用して三角形が作成されるかどうかをテストするコンテキストでは、変数の名前にそれを伝えたいと思います。

オプション1と2はまったく同じで、同じことを伝えます。私はそれらをlineLengthAlineLengthBlineLengthCと呼びます、なぜなら:

  • lenがあいまいです
  • 私たちは単に任意の長さについて話しているのではありません
  • 私たちは幾何学的構成、この場合は線分について話していることを伝えています
  • 1,2,3をA、B、Cに置き換えると、パラメーターの順序は関係ありません。
  • 名前を自己文書化すると、人々はこれらのパラメーターが何を表しているかすぐにわかります。

あるいは、同様の理由で、これらをlineSegmentLengthXsegmentLengthX、またはedgeLengthXと呼ぶこともできます。

これは次のようになります。

_...
public boolean canCreateValidTriangle(float lineLengthA, float lineLengthB, float lineLengthC){
     ...
}
...
_

3番目の配列オプションについては、固定サイズの配列型(_std::array<type, size>_を使用したC++など)を定義できる言語がある場合、このオプションが推奨されますが、Javaでこのような機能がプリミティブ型として可能であることは知りませんジェネリックは言語AFAIKには存在しません。この機能がないと、プログラムのユーザーは、知識に基づいた推測や実装の確認をせずに配列を関数に適切に渡す方法を知らないか、実際にこれが関数の使用方法であるとコメントしています(変更される可能性があります)。 。

そのため、Javaの場合、別のクラス(たとえば、「_ThreeElementArray<T>_」)でラップしない限り、3要素の配列を渡さないため、他の問題が発生します。

他の人々は、3つのパラメーターを独自のクラスに入れることを提案しています。私の意見では、これはこの場合に対処するための良い方法ではありません。このインスタンスのためだけに [〜#〜] pod [〜#〜] クラスを作成した場合、その存在を正当化するために作成するための十分なメソッドを見つけることができない可能性があります。 データクラス 。データクラスを作成すると、手続き型のコードを作成することになり、抽象化のメリットがなくなります。

_ThreeElementArray<T>_を使用すると、インデックス付けと通常の長さおよび配列操作のメソッドを提供する可能性が高いため、Dataクラスがないと騙されてしまう可能性がありますが、実際に行っているのは、同じ機能を委任しているだけです。同じことを行うために含まれているカプセル化された配列オブジェクトにすでに存在しますが、関数呼び出しとしてクラスに直接存在します。 Myclass.mymember.mymemberfunction();を実行するのと同じです。これは、クラスを作成するときにすべきではないと言っているわけではありませんが、最初にクラスの存在を正当化する他の関数が必要です。

他の人は「三角形クラス」を使用することを提案しました、明らかに三角形クラスは3つの要素の配列のスコープの外に存在する関数を持っているので、それはそれを適切にしますか?このメソッドの問題は、行の長さを渡すことではないa三角形。これらの線の長さが三角形である可能性があるかどうかをテストしています。三角形を渡すことはすでに意味をなしません。これらの線の長さは有効な三角形を作成しない可能性があるため、三角形オブジェクトは存在すべきではありません。非常に誤解を招く線の長さを保持するために三角形クラスを使用しているだけの場合、プログラマーに「これは三角形です」と明確に区​​別できない場合に、有効なものを形成しない可能性があることを伝えます。三角形として渡すと、任意の行の長さで渡すことができなくなります。覚えておいてください。線の長さの順序や、それらがどこから来たかは関係ありません。

1
whn