1

在下面的代码中,将私有成员 ,_field作为class Foo外部方法参数 ( Bar.DoSomething(_field)) 传递是否违反了SOLID 编程实践中的打开/关闭原则?

在面向对象编程中,开放/封闭原则指出“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”;也就是说,这样的实体可以允许其行为被扩展而无需修改其源代码。

据我了解,实体应该对扩展开放,但对修改关闭。但是,在这种情况下,在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 回答