我经常看到方法接口的两种相互冲突的策略,大致概括如下:
// 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());
我见过第二种形式的拥护者,特别是在动态语言中,可能更难评估正在使用的字段。
但是,我更喜欢第一种形式:它更短,出错的空间更小,如果对象的定义稍后发生更改,您不一定需要更新方法签名,也许只需更改您在方法。
这两种形式是否有令人信服的一般情况?是否有明确的例子说明何时应该使用第二种形式而不是第一种形式?是否有 SOLID 或其他 OOP 原则我可以指出来证明我决定使用一种形式而不是另一种形式?如果您使用动态语言,上述任何答案是否会发生变化?