Я часто вижу две противоречивые стратегии для интерфейсов методов, которые кратко суммируются следующим образом:
// 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());
Я видел сторонников второй формы, особенно в динамических языках, где может быть труднее оценить, какие поля используются.
Однако я предпочитаю первую форму: она короче, меньше места для ошибок, и если определение объекта будет изменено позже, вам не обязательно будет обновлять сигнатуры методов, возможно, просто измените, как вы работаете с объекта внутри метода.
Есть ли убедительный общий случай для любой формы? Есть ли ясные примеры того, когда вы должны использовать вторую форму в течение первого? Есть ли СОЛИДНЫЕ или другие принципы ООП, которые я могу указать, чтобы оправдать мое решение использовать одну форму над другой? Изменится ли какой-либо из вышеперечисленных ответов, если вы используете динамический язык?