web-dev-qa-db-ja.com

プロパティが変更されるたびにオブジェクトを更新するために、セッターでプライベートメソッドを呼び出す

以下のコードは、オブジェクトのプロパティの値を設定し、セッターでprivateメソッドを呼び出してオブジェクトのステータスを更新する方法を示しています。この呼び出しは、多くの場合、適切なプラクティスまたはセッターであり、着信する値のみを検証し、他の種類のロジックに参加すべきではありませんか?

public class Toolbar
{
    private bool isMenuButtonVisible;
    public bool IsMenuButtonVisible
    {
        get => isMenuButtonVisible;
        set
        {
            isMenuButtonVisible = value;
            UpdateToolbarVisualState();
        }
    }

    private void UpdateToolbarVisualState()
    {
        MenuButtonBackground.IsVisible = IsMenuButtonVisible;
        MenuButtonIcon.IsVisible = IsMenuButtonVisible;
        MenuButtonLabel.IsVisible = IsMenuButtonVisible;
        //...
    }
}
1
apex39

ゲッターとセッターでメソッドを呼び出すのは危険な習慣です。場合によっては、些細なことでも許容できます。あなたの例は、許容できるケースの良い例です。これが危険な方法である理由は、オブジェクトの状態をオブジェクトの外部に公開し、その状態の推論もオブジェクトの外部に移動するためです。非常に単純なケースでは、プロセスの一部としてメソッドを呼び出すだけの方が簡単な場合がありますが、これにより、より多くの潜在的な副作用が生じ、オブジェクトの使用が困難になります。より良い解決策は、オブジェクトのプロパティを設定するのではなく、Hide()メソッドとShow()メソッドを分離することです。

明示的なメソッドが好まれる理由は、オブジェクトを尋ねるのではなく、何をすべきかをオブジェクトに伝えているためです。可視性の場合、それはおそらくほとんど変化しませんが、より複雑な手順では、このパターンに従う習慣を身に付けるのが良いでしょう。ページング機能を追加する場合の例として、オブジェクトがどのページにあるのかを尋ね、結果をインクリメントして、そのページに移動するように指示したくない場合があります。オブジェクトに次のページに移動するように伝え、オブジェクト自体に次のページの計算、次のページがない場合の処理​​、または必要になる可能性のある処理を処理させます。適切なオブジェクト指向のアプローチは、オブジェクトの状態を可能な限りカプセル化し、オブジェクトがすべきことであるメソッドのみを公開することです。

1
Ryathal