设计问题:传递您使用的字段或传递对象?

Kyl*_*tan 12 oop method-signature

我经常看到两种方法接口的冲突策略,概括如下:

// Form 1: Pass in an object.
double calculateTaxesOwed(TaxForm f) { ... }

// Form 2: Pass in the fields you'll use.
double calculateTaxesOwed(double taxRate, double income) { ... }

// use of form 1:
TaxForm f = ...
double payment = calculateTaxesOwed(f);

// use of form 2:
TaxForm f = ...
double payment = calculateTaxesOwed(f.getTaxRate(), f.getIncome());
Run Code Online (Sandbox Code Playgroud)

我见过第二种形式的拥护者,特别是在动态语言中,可能更难评估正在使用的字段.

但是,我更喜欢第一种形式:它更短,错误的空间更小,如果对象的定义稍后更改,您不一定需要更新方法签名,也许只是改变您使用内部对象的方式.方法.

这两种形式都有令人信服的一般情况吗?是否有明确的例子说明何时应该使用第二种形式?我可以指出是否有SOLID或其他OOP原则来证明我决定使用一种形式而不是另一种形式?如果您使用动态语言,上述任何答案都会改变吗?

And*_*ett 6

老实说,这取决于所讨论的方法.

如果方法在没有对象的情况下有意义,那么第二种形式更容易重用并删除两个类之间的耦合.

如果该方法依赖于该对象,则足够公平地传递该对象.

对于第三种形式,您可能会传递一个设计用于该方法的接口.通过第二种形式的灵活性,为您提供第一种形式的清晰度.