Избегайте "широких" параметров (ссылочная прозрачность / ясность намерения).
Я бы пошел дальше, чем принятый ответ, и сказал бы (в общем), не передавайте объекты (или ссылки на объекты, строго говоря)к методам в качестве параметров.
На практике получается, что вы получаете неясный код, который я попытаюсь проиллюстрировать на следующем, слишком знакомом примере, который видят люди, работающие в отрасли:
Пример
Сравните это:
Employee emp = ...;
Validator.checkIsEligibleForPPCTP(emp);
с этим:
Employee emp = ...;
Validator.checkIsEligibleForPPCTP(emp.getEmailAddress());
Какого черта PPCTP
?Вам необходимо знание предметной области того, что является PPCTP.Все, что вы знаете, это то, что он будет смотреть на объект сотрудника и что-то делать.
Если, с другой стороны, вы избегаете прохождения всего объекта, а просто пропускаете то, что действительно актуально, читатели узнают больше о том, что происходит, без необходимости изучать определение checkIsEligibleForPPCTP
.Могу поспорить, что вам легче представить, что делает этот метод проверки, благодаря тому, что мы передаем ему адрес электронной почты (на самом деле, даже если вы немного ошибаетесь в своем воображении, повествование часто бывает достаточно хорошим, когда речь идет о кодепонимание).
Дальнейшие мысли
(Слабый) контраргумент
Но что если нам в будущем понадобится еще одно поле из этого широкого объекта?Вам придется изменить подпись.
О, как ужасно, я бы не хотел оседлать кого-то еще этим, никто, кроме меня, не умен (хорошо, изменение подписи требует некоторой осторожности, но есть и лучше)решения, чем просто передача вселенной в простой метод).
Этот твит является ответом на «префакторинг» / программирование «на будущее» (и это относится к проектированию на уровне методов):
Неправильная абстракция наносит гораздо больший ущерб, чем никакая абстракция вообще.Ожидание козырей угадывает каждый раз.
Пояснения
Да, я знаю, что java.lang.String
- это объект.И часто вам нужно пройти java.util.Collection
.Они отличаются от «пользовательских объектов», потому что:
- Строки являются неизменяемыми
- Коллекции могут (и должны) быть неизменными копиями при передаче в качестве параметров
- , если они являютсянет, ваш код будет труднее понять, потому что ваш метод становится состоящим из состояния / имеет побочные эффекты (т.е. это нечистая функция)
Если вы настаиваете на передаче объекта, вхотя бы сделать его неизменным.Но если вместо этого ваш объект emp является TLOYDEmployee
, то вы снова затрудняетесь понять смысл кода, и все, что вам нужно, - это общее понимание смысла делового жаргона (парадокс использования-повторного использования).