web-dev-qa-db-ja.com

「組み合わせた」ゲッター/セッターVS個別メソッドの利点は何ですか?

これは、「jQueryからの」「結合された」ゲッター/セッターメソッドと呼ばれるものです。

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.text(); // myHTML now equals "This is my HTML" (Getter)
foo.text("This is a new value"); // The text now equals "This is a new value")

これは、別々の(理論的な)メソッドを使用した同じロジックです。

var foo = $("<div>This is my HTML</div>"),
    myText;

myText = foo.getText(); // myHTML now equals "This is my HTML" (Getter)
foo.setText("This is a new value"); // The text now equals "This is a new value")

私の質問:

JQueryのようなライブラリーを設計するとき、なぜ2番目ではなく最初のルートに行くことにしたのですか? 2番目のアプローチは一目でわかりやすく、理解しやすいのではないでしょうか。

12
Levi Hackwith

ここでは純粋に推測していますが、jQueryの構造化に多くの関数スタイル設定を使用したjQuery開発者は、明らかに関数型パラダイムに傾いていると思います。

それを考えると、機能パラダイムには冗長性を減らすという強い文化があり、2番目のアプローチには不要な冗長性があると主張することができます。最初のアプローチは、すべての一般的な命令型言語に慣れている人にとっては明らかではないかもしれませんが、2つではなく1つだけのメソッドを使用することで、より少ないコストでより多くのことを実現しています。これは危険かもしれませんが、機能パラダイムでは一般的なツールであり、すぐに慣れるものです。

機能的なパラダイムで練習すれば、式典への欲求をすぐに乗り越えて、少ないリソースでより多くのことを実行できることを理解することができます。これは、多くの人がホワイトスペース管理に関して好みを持っているのと同じ方法で、好みに基づいて主観的な選択であることは明らかです。このように、私は1つの方法がより良いと言っているのではなく、人々が慣れ親しんでいるものであることを示しています。

これが、jQuery開発者がこれを行ったと私が信じる理由であり、一般的に誰かがこのアプローチを取るかもしれない理由です。

13
Jimmy Hoffa

フォーム

foo.text("This is a new value"); 

多くのことを意味します。最も一般的には、それはfooオブジェクトを提案し、textというメソッドが文字列を受け入れ、何かを行うとなります。これがプロパティであるという意味はまったくありません。

多くの言語では、これはの省略形と考えることができます

var result = foo.text("This is a new value"); 

結果は破棄されます。したがって、この方法はあいまいすぎて、(コードの読みやすさの観点から)プロパティを設定する効果的な方法にはなりません。

2
Robert Harvey

少し投機的ですが、これが私のショットです。

jQueryはjavascriptの機能的な性質を完全に受け入れます。それがとても素晴らしいことですが、Javaなどのより純粋なOO言語)を使用している場合、多くの開発者が頭を悩ませる可能性があります。すべての慣習と優れた慣習を破るようです。

関数型言語は宣言型構文に重点を置く傾向があります。コマンドではなく、事実についての声明を読む傾向があります。例

var eligible = customers.where(c => c.age > 30);

「対象となるお客様は30歳以上のお客様です」と読むことができます。対照的に、命令型言語は一連のコマンドのように読みます

for (customer in customers)
    if (customer.age > 30)
        eligible.add(customer)

これは、「各顧客を確認し、30歳以上の場合は、対象となるコレクションに追加してください」と読むことができます。

setおよびgetオペレーションを追加すると、jQueryが命令ライブラリのように感じられます。次のステートメントを読む方法を検討することができます

// The element tag have an html of <p>hello</p>
$("#element").html("<p>hello</p>"); 

// content represent the html of the element tag
var content = $("#element").html();


//Imperative style

// Set the element tag to an inner html of <p>hello</p>
$("#element").setHtml("<p>hello</p>");

//Get the html of #element, and put it in the content variable
var content = $("#element").getHtml();

アクションの動詞をjQuery APIの外に置くことで、宣言的なAPIのように感じました。ライブラリに一貫した機能的な感触を与えます。それが私が彼らがキーワードをオーバーロードしたと思う理由です。

これは、JavaScriptに最近導入されたばかりの properties のように動作するため、特にブラウザーの非互換性を抽象化することを目的としたjQueryのようなライブラリーではまだ広く使用されていません。

そのようなプロパティが満載のクラス定義を見たことがある場合、「set」および「get」接頭辞は不必要に見えます。valueパラメータを追加すると、セッターであることをすでに示しているからです。 Martin Fowler は、パラメーターを必要とするゲッターについて良い点を示していますが、その場合でも、追加の値パラメーターはセッターを明確に示し、セッターが右側に表示されることはほとんどありません。割り当ての側。そして、コードを書くときとにかく、ライブラリのドキュメントを見る必要があります。

メリットだけを求めたので、デメリットはカバーしません。

1
Karl Bielefeldt