7

代替関数名が API をより明確にする場合、ゲッターとセッターの「getMyValue()」および「setMyValue()」パターンを放棄することは適切ですか?

たとえば、C++ に次のクラスがあるとします。


public class SomeClass {
private:
    bool mIsVisible;

public:
    void draw();
    void erase();
}

次のように「mIsVisible」を取得/設定する関数を追加できます。


bool getVisible() { return mIsVisible; };

void setVisible(bool visible) { if (!mIsVisible && visible) { draw(); } else if (mIsVisible && !visible) { erase(); }

mIsVisible = visible;

}

ただし、代わりに次の方法を使用することも同様に可能です。


bool isVisible() { return mIsVisible; };

void show() { 
    if (!mIsVisible) {
        mIsVisible = true;
        draw();
    }
}

void hide() {
    if (mIsVisible) {
        mIsVisible = false;
        erase();
    }
}

簡単に言えば、単一の「setVisible(bool)」メソッドと、「show()」と「hide()」メソッドのペアのどちらが良いですか? 慣習はありますか、それとも純粋に主観的なものですか?

4

10 に答える 10

13

Pragmatic Programmers の Web サイトにある記事「 Tell, Don't Ask 」を読んでください。2 番目の例が正しい方法であることがわかると思います。

基本的に、最初の例で暗示されているコードを通じてロジックを広めるべきではありません。

  1. 現在の可視性の値を取得し、
  2. 価値観で判断し、
  3. オブジェクトを更新します。
于 2008-10-06T17:12:45.247 に答える
5

あなたが与えた例ではshow()hide()少なくとも私にとっては非常に理にかなっています。

一方、プロパティがあり、呼び出される関数を作成することにした場合、それskinPigmentは非常に貧弱で、自明ではない選択になります。tanMe()makeAlbino()

これは主観的なものであり、ユーザー (このクラスを利用する人々) の考え方に合わせて考える必要があります。どちらの方法を決定するにしても、それは彼らにとって明らかであり、十分に文書化されている必要があります.

于 2008-10-06T17:08:54.193 に答える
3

セッターは、実際にはオブジェクト指向とはほとんど関係がありません。これは、この例で適用されているプログラミング イディオムです。ゲッターはわずかに優れていますが、多くの場合、なくても問題ありません。すべてを取得して設定できる場合、オブジェクトを持つ意味は何ですか? 操作はオブジェクトに対して呼び出されて物事を達成する必要があり、内部状態の変更はこれの副作用にすぎません。ポリモーフィズム (オブジェクト指向の基礎の 1 つ) が存在する場合のセッターの悪い点は、すべての派生クラスにセッターを持たせることです。問題のオブジェクトが mIsVisible と呼ばれる内部状態を必要としない場合はどうなるでしょうか? 確かに、彼は呼び出しを無視して空として実装できますが、無意味な操作が残されます。OTOH、表示や非表示などの操作は、さまざまな実装で簡単にオーバーライドできます。

于 2008-10-06T17:48:55.843 に答える
3

私は isVisible()/show()/hide() セットを使います。

setVisible() は、内部変数を変更するすべてを意味します。show() と hide() は副作用を明確にします。

一方、getVisible()/setVisible() が内部変数を変更することだけを行った場合は、それらを public フィールドとして使用することから、ほとんど変更していません。

于 2008-10-06T17:39:25.817 に答える
2

一般に、セッター/ゲッターはプロパティの値のみを設定する必要があると思います。この例では、 isVisible プロパティの値に基づいてアクションも実行しています。この場合、関数を使用してアクションを実行し、状態を更新する方が、プロパティの更新の副作用としてアクションを実行するセッター/ゲッターを使用するよりも優れていると私は主張します。

于 2008-10-06T17:20:13.827 に答える
2

mIsVisible を切り替えると、オブジェクトの可視性がすぐにオンまたはオフになる場合は、表示/非表示のシナリオを使用してください。もう少し古い状態にとどまる場合 (たとえば、他の何かが再描画をトリガーするまで) は、set/get シナリオが適しています。

于 2008-10-06T17:23:24.100 に答える
1

私は show() と hide() メソッドの方が好きです。setVisible(boolean) メソッドがすぐに表示/描画されるかどうかはわかりません。さらに、show() と hide() は、インターフェイス (IMHO) のより適切な名前のメソッドです。

于 2008-10-06T17:20:51.110 に答える
0

暗黙のうちに、リストした「表示」機能と「非表示」機能は両方ともセッターです

ブール値については、あなたが示したような単一のツールが良いと思います。ただし、.show および .hide 関数も、オブジェクトの状態を変更する関数ではなく、コマンドのように見えます。

于 2008-10-06T17:11:27.823 に答える
0

実際に次のようなコードを書く必要がある場合

if (shouldBeShowingAccordingToBusinessLogic()) w.show();
else w.hide();

いたるところで、あなたはより良いかもしれません

w.showIfAndOnlyIf(shouldBeShowingAccordingToBusinessLogic())

または、本当に奇妙なケースの場合、ロジックがコードストレッチの最後までダウするかどうかを決定できない場合は、試すことができます

w.setPostponedVisibility(shouldBeShowingAccordingToBusinessLogic());
...
w.realizeVisibility();

(奇妙だと言いませんでしたか?)

于 2008-10-06T18:05:34.330 に答える
0

表示/非表示ソリューションを使用するもう 1 つの動機は、セッターとして、

このsetVisibleメソッドには、表示または非表示も行うという「副作用」がありますSomeClass。display/hide メソッドは、何が起こるかの意図をよりよく伝えます。

于 2008-10-06T18:06:31.910 に答える