我正在处理遗留代码,并且我经常看到方法调用具有来自同一对象的多个属性传递给方法:
update(user.getID(), user.getLanguage() etc...)
这样做是否有明显的优势或劣势,或者我也可以传入用户对象(在本例中)并处理名为?的方法中的属性?
跟进:
很多优秀的答案,谢谢。对于问题中缺乏确切细节的道歉,但正如我所说的那样,我正在研究整个系统,这似乎是一个很好的简单例子。请随意将此问题转变为社区维基问题,因为没有人可以接受其他答案,因为他们都很好,并且有正确的分数。
答案 0 :(得分:15)
两者都有其优点。我决定每种方法取决于它应该做什么。但是对于遗留代码,除非确实存在问题,否则我宁愿不改变任何内容。
Pro几个值,con object reference:
Pro传递单个用户对象:
如您所见,根据您的需要,物业可视为优势或劣势。
答案 1 :(得分:13)
事实上,传递对象的引用会更好,更多,原因有两个:
为了避免过长的参数列表,建议的重构是创建一个包含所有数据的对象 - 您是否已经拥有这样的对象并不幸运?
答案 2 :(得分:5)
这取决于您是否接受来自调用方法的对象类的依赖性。
使用此时
update(user)
声明更新的类必须知道用户的类。
如果你使用这个
update(user.getID(), user.getLanguage() etc...)
并且成员是原始的或属于Java标准库,而update()对用户类没有进一步的依赖...
答案 3 :(得分:3)
update(String, String, String...)
,这会导致以错误的顺序传递参数的风险update
做了什么,但让它成为用户类的一部分可能是有意义的:user.update(additionalInformation)
。答案 4 :(得分:3)
根据我的经验,我认为这取决于方法应该做什么,如果它严格链接到包含所有参数的对象,最好传递对象,例如在执行更新的DAO对象中或保存最好传递Domain对象,否则如果方法更通用,并且有可能所有参数都不是来自同一个对象,最好将参数传递给方法。
答案 5 :(得分:3)
这是一种代码气味,可以让我考虑将update()方法移动到用户类。面向对象设计的一个重要原则是encapsulation - 将您的数据和对该数据的操作捆绑在一起。
然后你有Tell, Don't Ask原则。告诉对象做某事比向它索取信息更好。
程序代码获取信息然后做出决定。面向对象的代码告诉对象做事。
当然我没有足够的细节说你绝对应该做这样的事情,但这是需要考虑的事情。
答案 6 :(得分:2)
从您的代码段中说出您的方法更新有点难。但是,如果传入用户对象,则会将用户对象加到该方法中。如果您只传入字符串,整数等,则可以将该方法与user以外的其他来源一起使用。我的建议是,你不应该强迫方法比它需要的更具体。
答案 7 :(得分:2)
考虑到您正在处理遗留代码,您需要确保更改方法
签名不会破坏任何可能正在调用它的代码。如果您完全控制将调用这些方法的代码库,那么您可以通过传入user
对象来简化代码。
每次调用这些方法时,您还应该考虑用户是否对象是一个“重量级”对象,该对象会加载可能浪费的额外数据。这可能是您不能将user
对象作为参数传递的一个原因。同样的原因适用于延迟加载的对象。
不传递整个对象的另一个可能原因可能是你不希望它被方法更新,并且“某些原因”不能成为不可变的。可以使用户对象的getter方法返回值的“安全防御副本”。请参阅Joshua Bloch对这种编码实践的有效java,这在多线程应用程序中尤其有用。
答案 8 :(得分:2)
将一个对象的属性作为方法的单独参数传递没有任何好处。它的缺点是代码变得难以阅读和维护。争论越少越好。如果你可以在一个对象中组合参数,那就去做吧。
有一种重构技术,如果你想重构它,称为Preserve Whole Object。您可能还会发现类似主题的answer有用。