以下代码说明了我有时会看到的模式,即当一个对象在多个方法调用中作为参数传递时,它会被隐式转换。
var o = new MyReferenceType();
DoSomeWorkAndPossiblyModifyO(o);
DoYetMoreWorkAndPossiblyFurtherModifyO(o);
//now use o...
这对我来说感觉不对(它几乎没有面向对象)。可以接受吗?
答案 0 :(得分:2)
根据您的方法名称,我认为转换中没有任何隐含的内容。这种模式是可以接受的。另一方面,如果您的方法具有printO(o)
或compareTo(o)
等名称,但实际上修改了对象o
,则设计会很糟糕。
答案 1 :(得分:1)
除了修改该对象外,它完全取决于方法的实际作用。
例如,主要与在内存中保留某个状态相关的对象可能没有任何与在任何地方保持该状态相关的内容。
这些方法可以例如从数据库加载数据,并使用该信息更新对象。
然而!由于我主要使用C#编程,因此.NET是一种完全面向对象的语言,我实际上会编写这样的代码:
var o = new MyReferenceType();
SomeOtherClass.DoSomeWorkAndPossiblyModifyO(o);
SomeOtherClass.DoYetMoreWorkAndPossiblyFurtherModifyO(o);
//now use o...
在这种情况下,其他类的实际名称(或其他类如果涉及2个)将给我一个关于实际发生的事情和/或上下文的重要线索。
示例:
Person p = new Person();
DatabaseContext.FetchAllLazilyLoadedProperties(p);
DatabaseContext.Save(p); // updates primary key property with new ID
答案 2 :(得分:1)
这是可以接受但通常不好的风格。 通常的“好”方法是:
DoSomeWorkAndModify(&o); // explicit reference means we will be accepting changes
o = DoSomeWorkAndReturnModified(o); // much more elastic because you often want to keep original.
你提出的方法是有意义的,当o很大,并且在内存中复制它是不可能的,或者如果它是一个函数你(没有其他人=私人)非常频繁地使用而且不想打扰与&句法。否则,它的懒惰会导致一些非常难以发现的错误。