Object.DoSomething()vs DoSomethingWith(Object)

Jam*_*mes 6 oop

这可能仅仅是一个偏好问题,但是,我有兴趣知道何时使用这两种方法的最佳实践方式.

例如

var person = new Person();
person.Run();
Run Code Online (Sandbox Code Playgroud)

而不是

var person = new Person();
Excercise.Run(person);
Run Code Online (Sandbox Code Playgroud)

上面的例子可能不是最好的,但我的一般观点是你何时决定赋予对象责任而不是另一个类?

Bri*_*new 13

不要为你的对象做事.他们在那里为你做事.

这听起来很简单,但它是一个有用的格言.这意味着(正如您所确定的)调用对象上的方法,它将使用可用的所有知识来生成结果.它强化了封装和分离/遏制责任

这没有发生的指标是这样的代码:

priceBond(bond.getPrincipal(), bond.getMaturity(), bond.getCoupons(), interestRate)
Run Code Online (Sandbox Code Playgroud)

债券对象正在向某些第三方提供所有信息.像上面这样的代码最终会在任何地方重复出现.而是写

bond.priceBond(interestRate)
Run Code Online (Sandbox Code Playgroud)

并将所有信息保存在一个对象中.

如果你的对象受到大量吸气剂的影响,那么这可能表明你的物体没有做到他们应该做的事情.


Ant*_*lev 7

一般来说,这个OOPish构造:

person.Run(distance);
Run Code Online (Sandbox Code Playgroud)

只是一个语法糖:

Person.Run(person, distance);
Run Code Online (Sandbox Code Playgroud)

哪里person成为一个隐含的this参考.虚拟功能等有一些细微之处,但你明白了.

至于你的问题,你基本上有一个丰富的领域模型而不是贫穷的领域,这是许多辩论的主题.


And*_*ech 5

通常,在这种情况下Person,一个类具有行为;

在这种情况下,行为是Run因此人应该有方法Run

var p = new Person();
p.Run();
Run Code Online (Sandbox Code Playgroud)