ゲッターとセッターの組み合わせ


16

jQueryなどのJavaScriptライブラリは、プログラミングインターフェイスで「ゲッター」と「セッター」を組み合わせます。例:

 $('element').css({'color','blue'});

色を設定するか、

 $('element').css();

要素のCSSを取得します。

そのようなパターンには名前がありますか?また、アプリケーションで使用することをお勧めしますか?

回答:


12

Martin Fowlerは最近、この記事でOverloaded getterおよびsetterと名付けました。

私は最近Javascriptをいじくり回していますが、私が驚いたことの1つは、ゲッターとセッターに同じ関数名を使用する習慣です。したがって、使用するjQueryでバナーの高さを確認する場合$("#banner").height()、および使用する高さを変更する場合$("#banner").height(100)

この規約は、Smalltalkで使用されていたため、私にはよく知られています。で値を取得しbanner height、で変更する場合がありbanner height: 100ます。それがsmalltalkの慣習であることを知ることは、私がそれを好きになることを期待するのに十分です。しかし、最高のものにも欠陥があり、このコーディングスタイルに対する嫌悪感を隠すことはできません...

この好みにもかかわらず、あなたが扱っている言語の規則に従う必要があります。私が再びSmalltalkを書いheight:100ていたとしても、その言語の慣習との一貫性を保つために私はまだ使用しています。ただし、Javascriptは強力な規則があることで注目されていないため、jQueryで使用されている場合でも、この規則は避けたいと思います...


1
私は通常、ファウラーが言うことの大部分に同意しますが、これに対する彼の嫌いに同意しません。彼の理由は、JavaScriptにはSmalltalkのような強力な規約がないため、そこで使用できるということです。ただし、jQueryには強力な規則があり、JavaScriptはjQueryではありません。jQueryはフレームワークです。
CaffGeek

@Chad、それを読んでいることに反対しなければなりません。彼の主張は、明示性と一貫性に欠けているということです。彼は、他の人との一貫性が彼の懸念に勝るので、彼がSmalltalkでそれを使うと言います。彼は、Smalltalkの規約が何らかの形で問題を緩和または排除していると主張しているわけではありません。
ウィンストンイーバート

2

オブジェクト指向言語では「メソッドのオーバーロード」、オブジェクト指向言語以外では「関数のオーバーロード」と呼ばれます。

それが良い習慣であるかどうかは、ゲッター/セッター対パブリックメンバーとほぼ同じくらい議論のトピックです。賛否両論の人々は、おそらくこの機能を持っているか、持っていない言語に歯を切っており、彼らの方法で設定されています。私はそれを使用し、いくつかの理由で練習が好きです:

  • 使用されるコンテキストは、一方を他方からかなりよく分離します。
  • メソッド名の前getまたは前setに追加すると、冗長性が増します。
  • 複数のゲッターがある場合(例えば、のための1つintおよびいずれかのdouble)割当(のLHSでタイプ変更、int x = foo.bar()対をdouble x = foo.bar()コード変更(必要としない)barAsInteger()barAsDouble()クラスの両方を提供する場合、右側に)を。これのマイナス面は、コードを見ただけでどのメソッドが呼び出されているかを正確に知ることが難しい場合があることです。

C ++では「関数のオーバーロード」とも呼ばれます。
DeadMG

C ++にはメソッドと裸の関数の両方があるため、両方の用語がC ++に適用されます。
Blrfl

1

JavaScriptには実際のプロパティがないため(値を設定すると実際にコードを実行できます)、パターンはプロパティイディオムを実装するものです。(別の名前を付けても)

したがって、実際のプロパティを実装する言語では、代わりにこれを実行します。

element.css = ...
x = element.css

プロパティを処理する言語でJavaScriptパターンを使用する場合、何か異常なことをしていることになります。 それはおそらく良い考えではないでしょう。 言語がプロパティを処理する方法でプロパティを処理するので、他の人があなたと一緒に作業することを混同しないでください。


「値を設定すると、実際にコードを実行できます」。これは実際にはもう真実ではありません。ECMA 5
デミアンブレヒト

@Demian:しかし、jQueryのはECMA 5.実装していないブラウザで動作
ジョン・フィッシャー

クロスブラウザーの互換性については何も言及しませんでしたが、記載されているとおり引用符が間違っているだけです。
デミアンブレヒト

@Demian:「JavaScriptには実際のプロパティはありません」というテキストは、最も一般的に利用可能なバージョンのJavaScriptを使用していると仮定した場合に正しいです。JQuery実装のコンテキスト内で議論しているので、ステートメントは正しいでしょう。ただし、JavaScriptの新しいバージョンには真のプロパティがあることを指摘してくれてありがとう。
ジョンフィッシャー

0

あなたが探していると思う properties


これは、C#(および他の.NET言語)で提供される機能の名前で、これに似ていますが、実際には同じものではありません。
トーマスオーエンズ

ウィキペディアは同意します:en.wikipedia.org/wiki/Property_
programming

ありがたいことに、アプリケーションperson.salary('10000')などで個人の給与を設定または取得する場合は、実際にはそうではありませんperson.salary()
ヤンニス

1
どうしてかわかりません。「プロパティはフィールドのように読み書きされます」。元の投稿の例ではそうではありません。そこでは、明示的なメソッド呼び出しが行われます。よく似ていますが、まったく同じではありません。
トーマスオーエンズ

1
@yannisこれは正しくありません。JavaScriptにはプロパティの構文があり、元の質問で説明したものとはまったく異なります。JavaScriptでプロパティを実装および使用する方法については、en.wikipedia.org / wiki / Property_(programming)#JavaScriptを参照してください。
トーマス・オーエンズ

0

私は単純な理由でそれに対してまったく反対です:クラス、メソッドまたは関数はただ一つのことをするべきです-私の意見ではgettersetterメソッドとメソッドの組み合わせはその規則に違反します。その結果:

  1. return関数の値は、getterまたはsetterブロックが実行されるかどうかによって異なります。これは単純に保守性の悪夢にあなたを導くことができます。メソッドは、どの場合でも1つのタイプのデータ/オブジェクトのみを返す必要があります-またはreturn nullfalseまたはexceptionエラーの場合にスローします。
  2. ライティングユニットテストは、関数は、2つの全く異なる機能のために責任があると難しくなります。
  3. このようなメソッドまたは関数のドキュメントを作成するのは、明白な理由により困難です。
  4. 複数のゲッターメソッドが必要な場合、一貫性はありません-既にBlrfl回答で述べたように。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.