[英]Returning a new Object vs modifying one passed in as a parameter
我在代码审查期间遇到了以下代码。
我的直觉告诉我,这不遵循适当的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);
}
编写代码的方式没有任何问题,因为您只修改someObject上的属性。
但是,在LoadSomeObject中创建someObject并返回它也是正确的。
在这一点上,两种选择都是正确的。
我不是OO大师,所以带上一粒盐。
对象应该自己管理/尽可能自己定义自己的行为。 如果你曾经松散耦合,那么这背后的基本原理是显而易见的。 我很可能是将LoadSomeObject
的细节移动到LoadSomeObject
的实现的更好的设计决策,但是很难讨论这样的一般示例。
在任何命令性代码(包括OO代码)中,可变状态都是完美的,它是这些范例的核心“特征”。 OTOH,不可变状态具有不可忽视的优势(我想我们在这里有一些关于该主题的问题,否则请问任何FP倡导者),并且拥有一些不可变对象并不是特别非OO。
编辑:您也可以将读者传递给SomeObject的构造函数。
没有通用的OO概念,这与这样的代码相冲突。 但是,如果你不遵循一些设计原则,你会发现很难收集并理解操纵SomeObject实例的方法。 也许最简单的启动方式是分离两种主要的程序:
这里好主意,如果你想分开SomeObject操纵逻辑就是用SomeObjectBuilder创建类型
public void loadFromReader( SqlDataReader reader )
方法和
public SomeObject getValue()
属性
无论哪种方式都是完全可以接受的,但在决定哪种方式适合您的特定情况时,可以考虑使用返回对象做什么。 不可变性即在每个操作中创建一个新实例是如何处理.NET中的字符串。
复制方法显然需要返回副本。 其中作为单个对象的方法,例如由全局引用持有的方法,不适合返回新对象,因为更改可能会丢失。
如果LoadSomeObject
将返回新的SomeObject
,您可能希望更改方法名称以避免混淆。 也许对NewAndLoadSomeObject
?
我同意你的直觉,对大多数情况感觉有点不对劲。 我同意返回更好的东西,因为只是更清楚地表明正在修改某些东西。 查看正在使用的返回值可以立即清楚发生了什么。
我认为这仍然感觉好一点(在大多数情况下无论如何):
public void someMethod()
{
...
var someObject = new SomeObject();
someObject.Load(reader);
}
然后很明显在SomeObject
类中,你会有
public void Load(SqlDataReader reader)
{
this.Id = reader.GetGuid(0);
}
这个想法是赞成实例方法而不是静态方法。 当你可以让对象操作自己的数据时,为什么还要创建一个对象并传递它的数据呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.