1

以下のコードで、外部メソッド パラメーター ( ) としてプライベート メンバー を渡すことは_fieldclass FooSOLIDプログラミング プラクティスのOpen/Closed 原則Bar.DoSomething(_field)に違反しますか?

オブジェクト指向プログラミングでは、オープン/クローズの原則により、「ソフトウェア エンティティ (クラス、モジュール、関数など) は、拡張に対してオープンである必要がありますが、変更に対してクローズされている必要があります」と述べられています。つまり、そのようなエンティティは、ソース コードを変更せずに動作を拡張できます。

私が理解しているように、エンティティは拡張に対して開かれている必要がありますが、変更に対しては閉じられています。ただし、この場合、 is はand is_fieldのコンストラクターで一度設定されます。プライベート メンバーを外部メソッドのパラメーターに渡すことは、オープン/クローズの原則またはその他のベスト プラクティスに違反していますか?Fooreadonly

  public class Foo
  {
    private readonly int _field;

    public Foo(int input)
    {
      _field = input;
    }

    private void FooDoSomething()
    {
      Bar.BarDoSomething(_field); //Breaking Open/Closed Principle?
    }
  }

  public static class Bar
  {
    public static void BarDoSomething(int input)
    {
      //Something happens
    }
  }
4

1 に答える 1

3

いいえ、これはオープン/クローズの原則に違反していません。の観点からするとBarinputは に属する内部フィールドではありませんFoo。それはただの整数です。の内部状態はFoo、クラス内に隠されています。

さらに一歩進んでref、パラメータを渡すときに指定しない限り、

Bar.BarDoSomething(ref _field);

Barの値を変更することさえできません_field。やり取りは一方通行です。Foo何かをするように言っBarています。それは良い。

明確にするために-ref使用されていて、オープン/クローズの原則に関係のない値を変更Bar できたとしても。しかし、 の目的が値Bar.DoSomething返すことintである場合は、値を変更するメソッドではなく、を返す関数の方が適しています。そうすれば、呼び出し元は値を取得し、更新するかどうかを決定できます_field

于 2016-04-27T20:09:31.100 に答える