Определенно лучше передавать объект Person, а не набор примитивных типов в качестве параметров. Сравните следующие два метода
public static void Withdrawal(Account account, decimal amount)
{
DB.UpdateBalance(account.AccountNumber, amount);
}
public static void Withdraw(int accountNumber, decimal amount)
{
DB.UpdateBalance(accountNumber, amount);
}
Два метода выглядят почти одинаково, но второй небезопасен. Int может прийти откуда угодно, так что вы облажались, если напишите это:
private void CloseTransaction(Transaction tran)
{
BankAccounts.Withdrawal(tran.Account.RoutingNumber, tran.Amount);
// logic error: meant to pass Account.AccountNumber instead of Account.RoutingNumber
}
Это наихудший тип ошибки, потому что он не вызовет ошибку компиляции или исключение времени выполнения. Вы можете поймать эту ошибку в ваших автоматических тестах, если напишите их достаточно хорошо, но эту ошибку легко пропустить и, возможно, можно будет скрыть в течение нескольких месяцев, не обнаружив ее.
Я работал в компании, которая писала банковское программное обеспечение, и мы действительно столкнулись с ошибкой такого типа в производстве. Это происходило только во время передачи конкретного вида хранилища, и было обнаружено только тогда, когда один из наших банков заметил, что их балансы GL уменьшались на несколько долларов каждый раз, когда они запускали процесс на конец месяца. Банк подозревал кражу сотрудников в течение нескольких месяцев, но только благодаря тщательному анализу кода кто-то отследил проблему до ошибки в нашем программном обеспечении.