13

編集: Smalltalker がこれを行うには少なくとも 2 つの正当な理由があるようです (メッセージ チェーンとスコープの問題の際の読みやすさ) が、一般的な使用法に対処するために、おそらく質問はより長く未解決のままになる可能性があります。

オリジナル:長い間忘れていた理由から、変数名に冠詞を使用したことはありません。例えば:

人、車、オブジェクト

記事が無意味な情報で名前を汚しているような気がします。この規則を使用している同僚のコードを見ると、私の血圧はわずかに上昇します。

最近、私は Smalltalk の学習を始めました。主な理由は、Martin Fowler、Kent Beck、および他の多くの偉人が育って愛した言語を学びたいからです。

しかし、Smalltalkerは変数名に定冠詞 ( a、an ) を広く使用しているように見えることに気付きました。良い例は、次の Setter メソッドにあります。

name: aName address: anAddress.
     self name: aName.
     self address: anAddress

これにより、私は自分の立場を再考するようになりました。Smalltalkers のように非常に尊敬され、影響力のあるコミュニティが、変数の命名に関する記事を広く採用している場合、おそらくそれには正当な理由があります。

使いますか?なぜですか、そうでないのですか?

4

9 に答える 9

10

これは、メソッド呼び出しの引数のを示唆するため、型なし言語としてSmalltalkで一般的に使用されています。記事自体は、指定されたクラスのオブジェクトのインスタンスを処理していることを示しています。

ただし、Smalltalkではメソッドの外観が異なり、いわゆるキーワードメッセージを使用していることを覚えておいてください。この場合、記事は実際に読みやすさを向上させます。

anAddressBook add: aPerson fromTownNamed: aString
于 2009-04-09T12:32:44.053 に答える
7

私はちょうど答えを見つけと思います。Konrad Rudolph が言ったように、技術的な理由からこの規則を使用しています。

...これは、[メソッド変数] がインスタンス変数、インターフェースで定義された一時変数、または別の一時変数の名前を複製できないことを意味します。- IBM Smalltalk チュートリアル

基本的に、ローカル メソッド変数にオブジェクト/クラス変数と同じ名前を付けることはできません。Java から来て、メソッドの変数はローカルにスコープされ、次のようなものを使用してインスタンス変数にアクセスすると仮定しました。

self address

Smalltalk でのメソッド/ローカル スコープについてさらに学ぶ必要がありますが、彼らには他に選択肢がないようです。インスタンス名とは異なる変数名を使用する必要があるため、おそらくanAddress最も簡単な方法です。アドレスのみを使用すると、次のようになります。

Name is already defined ->address

インスタンス変数アドレスがすでに定義されている場合...

于 2009-04-09T12:49:03.890 に答える
2

私はいつも記事が無意味な情報で名前を汚しているのを感じました。

その通り。そして、これが記事を削除するために必要なすべての理由です。記事は不必要にコードを乱雑にし、追加情報を提供しません。

私はSmalltalkを知らず、「彼らの」慣習の理由について話すことはできませんが、他のどこでも、上記が当てはまります。Smalltalk規則の背後には、単純な技術的理由がある可能性があります( ALL_CAPSRubyの場合など、規則だけでなく言語のセマンティクスのために定数です)。

于 2009-04-09T12:28:29.633 に答える
1

私はこれを使って前後にぐらつきます。私のプロジェクトでは、C++とObjectiveCの比率に依存していると思います。根拠と理由については、Smalltalkはオブジェクトが「モノ」であるという概念を広めました。一人称で授業を説明することを強く推し進めたのは、ヨードンコードだったと思います。Pythonでは、次のスニペットのようになります。「適切な」例をまとめるのに十分なSmallTalkを思い出せたらと思います。

class Rectangle:
    """I am a rectangle. In other words, I am a polygon
    of four sides and 90 degree vertices."""
    def __init__(self, aPoint, anotherPoint):
        """Call me to create a new rectangle with the opposite
        vertices defined by aPoint and anotherPoint."""
        self.myFirstCorner = aPoint
        self.myOtherCorner = anotherPoint

全体として、これはプログラムの読みやすさに対する会話型のアプローチです。変数名で冠詞を使用することは、イディオム全体のほんの一部でした。パラメータとメッセージセレクタIIRCの命名を取り巻くイディオムもありました。何かのようなもの:

aRect <- [Rectangle createFromPoint: startPoint 
                    toPoint: otherPoint]

それは、今でも頻繁に現れるもう1つの一時的な流行でした。myHostName最近、の代わりにC++コードにのようなメンバー名が表示されていることに気づきましたm_hostName。SmallTalkのイディオムに少し耳を傾けていると思うこの使用法に、私はますます夢中になっています。

于 2009-04-09T13:05:13.150 に答える
0

私の主な言語には冠詞がないためか、使用したことはありません:P

とにかく、変数の名前が意味のあるものである限り、記事があるかどうかは重要ではないと思います。それはコーダー自身の好み次第です。

于 2009-04-09T12:30:07.010 に答える
0

いいえ。文字スペースの無駄であり、コードの可読性を損なうと思います。文脈に応じて、名詞のバリエーションを使用する場合があります。たとえば、PersonとPeopleです。例えば

ArrayList People = new ArrayList();
Person newPerson = new Person();
People.add(newPerson);
于 2009-04-09T12:34:45.670 に答える
0

私が働いている場合、標準では、すべてのインスタンスフィールドの前に「the-」、ローカル変数の前に「my-」、メソッドパラメーターの前に「a-」を付けます。これは、多くの開発者が、スコープごとに異なる色を表示できるIDEの代わりにviのようなテキストエディタを使用していたためだと思います。

Javaでは、これを間接参照するセッターを作成するよりも、Javaの方が好きだと言わざるを得ません。

比較

public void setName(String name) {
    this.name = name;
}

public void setName(String aName) {
    theName = aName;
}

最も重要なことは、基準を持ち、誰もがそれを遵守することです。

于 2009-04-09T13:04:15.833 に答える
0

いいえ、私はしません。コードベースの可読性や保守性に何かが追加されるとは思わず、変数をまったく区別しません。

もう 1 つの欠点は、変数名の記事を奨励する場合、誰かがあなたのコード ベースでこれを行うのは時間の問題です。

var person = new Person();
var aPerson = GetSomeOtherPerson();
于 2009-04-09T12:39:05.817 に答える