返回一个新的Object vs修改作为参数传入的对象

vic*_*csz 5 c# java oop design-principles

我在代码审查期间遇到了以下代码.

我的直觉告诉我,这不遵循适当的OOP.

我认为相反,LoadObject方法应返回一个新的SomeObject对象,而不是修改传递给它的那个对象.虽然我无法真正找到解释为何更好的原因.

我的解决方案更好吗?如果是这样,为什么?特别是在给定的代码示例(如果有的话)中打破了OOP原则或标准?

   public void someMethod()
    {
        ...
        var someObject = new SomeObject();
        LoadSomeObject(reader,someObject);
    }

    private void LoadSomeObject(SqlDataReader reader, SomeObject someObject)
    {
       someObject.Id = reader.GetGuid(0);
    }
Run Code Online (Sandbox Code Playgroud)

Rus*_*uss 8

编写代码的方式没有任何问题,因为您只修改someObject上的属性.

但是,在LoadSomeObject中创建someObject并返回它也是正确的.

在这一点上,两种选择都是正确的.


小智 3

我不是 OO 大师,所以对这些持保留态度。

  1. 对象应该尽可能管理自己/定义自己的行为。如果您曾经了解过松散耦合,那么这背后的原理是显而易见的。将细节转移到 SomeObject 的实现上可能是更好的设计决策LoadSomeObject,但是对于这样一个一般的示例来说很难讨论。

  2. 可变状态在任何命令式代码(包括面向对象代码)中都完全没问题,它是这些范例的核心“功能”。OTOH,不可变状态具有不可描述的优势(我想我们在这里对这个主题有一些问题,否则请询问任何 FP 拥护者),并且拥有一些不可变对象并不是特别非 OO。

编辑:您也可以将 reader 传递给 SomeObject 的构造函数。