将引用传递给对象或在Java中的对象中传递单个属性是否更好?

Ale*_*lue 18 java parameters

我正在处理遗留代码,我经常看到方法调用具有来自同一对象的多个属性传递给方法:

update(user.getID(), user.getLanguage() etc...)
Run Code Online (Sandbox Code Playgroud)

这样做是否有明显的优点或缺点,或者我也可以传递用户对象(在这种情况下)并处理方法中的属性?

跟进:

很多优秀的答案,谢谢.对于问题中缺乏确切细节的道歉,但正如我所说的那样,我正在研究整个系统,这似乎是一个很好的简单例子.请随意将此问题转变为社区维基问题,因为没有人可以接受其他答案,因为他们都很好并且有正确的分数.

use*_*434 15

两者都有其优点.我决定每种方法取决于它应该做什么.但是对于遗留代码,我宁愿不改变任何东西,除非实际存在问题.

Pro几个值,con对象参考:

  • 如果您没有绑定到特定的类,则可以从其他来源传递值
  • 方法不能(意外地)改变对象状态(C++可以使用"const")

Pro传递单个用户对象:

  • 您已绑定到用户对象,因此很难意外传递不相关/无效的值
  • 很明显,该方法需要用户对象的数据
  • 更改(例如重命名)getter需要在方法的所有调用中进行更改,而不仅仅是在其实现中
  • 如果添加了新属性并且需要传递,则类似
  • 方法可以改变对象状态

如您所见,根据您的需求,可以将物业视为优势或劣势.


Mic*_*rdt 13

事实上,这将是太多,太多更好的引用传递的对象,原因有二:

  • 它避免重复调用该方法的每个地方的所有getter(DRY原则)
  • 它导致更短的方法签名.方法几乎不应该有三个以上的参数,因为它太容易混淆顺序,很难重构.

为避免过长的参数列表,建议的重构是创建一个包含所有数据的对象 - 您是否已经拥有这样的对象并不幸运?

  • @Marko Topolnik:在这种情况下,参数类型应该是包含getter的接口,然后可以由不同的类实现.将对象"分解"为方法调用的参数列表是一件根本错误的事情. (3认同)
  • 除非OP不想将被调用者与他在args中分解的对象耦合.例如,他可以通过分解不同的对象来调用相同的方法.鉴于这么少的信息,我不知道如何建议. (2认同)

Phi*_*hil 6

这是一种代码味道,会让我考虑将 update() 方法移至用户类。面向对象设计的伟大原则之一是封装——将数据以及对该数据的操作捆绑在一起。

然后你就有了“告诉,不要问”原则。告诉对象做某事比向对象询问信息更好。

程序代码获取信息然后做出决策。面向对象的代码告诉对象做事。

当然,我没有足够的细节来说明你一定应该这样做,但这是需要考虑的事情。


Pet*_*Mmm 5

这取决于您是否接受来自调用方法的对象类的依赖性.

使用时

update(user)
Run Code Online (Sandbox Code Playgroud)

声明更新的类必须知道用户的类.

如果你使用这个

update(user.getID(), user.getLanguage() etc...)
Run Code Online (Sandbox Code Playgroud)

并且成员是原始的或属于Java标准库,而update()对用户类没有进一步的依赖...


Lud*_*son 2

很难从代码片段中说出你的方法更新了什么。但是,如果您传入用户对象,则将用户对象耦合到该方法。如果您只传递字符串、整数等,则可以将该方法与用户以外的源一起使用。我的建议是,您不应该强迫方法变得比需要的更具体。