2011-09-01 12 views
8

メソッド/変数/その他の名前にアンダースコアを使用することは悪い考えであることを示す、複数のスタイルガイドラインやその他のリソースを読みました。Scalaが名前に下線を付けた

この背景にはどのような技術的な理由がありますか?

私は非常に慣れています。ヘルパー関数の前に_を付けてください。プライベートでなければならない機能もあり、私はREPLを介してアクセスできるように公開する必要があります。 "ヘルパー"接尾辞の使用のような他の命名規則はちょっと面倒です。

ご迷惑をおかけして申し訳ございません。

答えて

11

ワイルドカード演算子_は、Scalaで頻繁に使用されます。したがって:

xs map (_.x) // Call the x method of every element 
xs map (_x) // Pass every element through the _x method 

は混乱します。アンダースコアが前に付いているかどうか見るためには、非常に慎重に見なければなりません。

はしかし、内部のアンダースコアは混乱が困難です:

xs map (my_method) // No similar form where _ stands for the list element 

したがって、これらはあまり問題であるが、1クロージャを探しているとき、アンダースコアはまだ目を少しをキャッチ。これはおそらく彼らが落胆している理由ですが、正直言って、私はそれらを常に使用しています。特に暗黙のdefや内部変数のようなものでは、インターフェイスに多少の暴露がないでしょう。ワイルドカードとしてもタプルのようにパブリックAPIの一部としてだけでなく、すべての言語にわたって使用されて_に加え

+3

これは非常に構成されたケースです:あなたは 'xs:Seq [T:{def x:U}]'を持っています。エラーが発生するには、正確に '_x:{def apply(y:T):U}'が必要です。これらの3つの制約のいずれかが存在しない場合、コンパイルされません。それは正確に '_x'という名前でなければならず、' U'を返さなければならない単一の 'T'引数で呼び出し可能でなければなりません。私は少しでも確信していない。 –

+3

@ sheep - あなたはその種の名前の衝突があるとは思わないでしょう。重要なのは、コードを素早く読んでいるときに、ローカルコードのプライベートメソッドか、コレクション要素のパブリックメソッドが有効かどうかをすぐに知ることができないということです。もちろん、非常に迅速に把握することができますが、離れた場所から形を見れば、より速く把握できます。 –

1

私は、これらの仕様はちょうど名にアンダースコアについて話だと思います。

あなたは次のように書くべきですか?

object getterSetter { 
    var _variable: Option[Double] = None 
    def variable = _variable 
    def variable_=(newVal: Double) { _variable = Some(newVal) } 
} 

私はcamelCase代わりにembedded_underscores理由は、Javaがそれを使用し、Javaライブラリで作業する場合、一貫性にのみそのように保つことができるだけであると思います。

+2

アンダースコアの前に_convention_;あなたはまだそれを私的に宣言しなければなりません。また、 '_variable'の代わりに' variableHidden'や他の何かを使うこともできます。 –

+0

ああ、あなたは正しい。それを混乱させているに違いない。しかし 'variableHidden'?真剣に? –

+0

私も '_variable'を使いますが、Rex Kerrの答えの引数は面白いです。 –

5

名前の下線を避ける理由はわかっています。スカラの構文の重要な部分です。確かに、あなたはに入れることができますが、私の経験では人間パーサを遅くする傾向があります。

しかし、私は、パブリックメソッドの非下線の名前をしたい場合、私は時折、変更可能なオブジェクトでプライベート変数のためにアンダースコアの接頭辞を使用しない告白しなければなりません。 Haskellのような素数(foo ')を使うことができればいいですが、それは字句的に難しいと思います。

2

someTuple._1など)それはまた、いくつかのケースでは、コンパイラによって特別に解釈されます。たとえば、セッターには、_=またはという単項演算子が付いていなければなりません。これらは接頭辞unary_でなければなりません。

すべてこれは偶然「特別な名前を」使用するか、誰かが「特別な名前」とまったく同じ似たような使用ではなく、「普通の名前を」誤って解釈することが本当に簡単になります。それが事故や知識の不足のために起こったかどうかは問題ではありませんが、それが起きたときにおそらく数時間をかけてバグを探しています。あなたが本当にしなければならない限り、それらを使用しないでください。DSLは常に例外です。

関連する問題