Наименование метода: включение или исключение типа параметра несколькими похожими методами
Когда вы сталкиваетесь с классом, в котором есть несколько похожих методов, работающих с разными типами параметров, включаете ли вы какое-либо описание параметров в имя метода, или вы сохраняете то же имя и полагаете, что сами параметры предоставляют достаточно информации? Сравните два приведенных ниже примера:
interface Option1 {
update(ObjectA);
update(ObjectB);
update(List<Object>);
}
interface Option2 {
updateA(ObjectA);
updateB(ObjectB);
updateAll(List<Object>);
}
Я слышал следующие аргументы:
- Вариант 1 лучше, так как он не содержит избыточной информации
- Вариант 2 лучше, так как код более читабелен и проще в обслуживании
2 ответа
Решение
Это зависит. Перегрузка метода существует, потому что это полезно. Однако это также может вызвать у вас горе.
Если вы рассматриваете возможность перегрузки, подумайте:
- Методы решают разные проблемы?
- Будет ли ухудшена читаемость - сможет ли читатель определить, какой метод вызывается?
- Возможно ли, что ваш интерфейс может быть смешан с другими с похожими именами методов?
- Возможно ли, что аргументы реализуют более одного из типов параметров? В этом случае может возникнуть неоднозначность, и компилятор может потребовать, чтобы вы ее исправили.
Например:
- в Java
String.indexOf()
перегружен Все перегрузки имеют одинаковые намерения. Не будет никаких дополнительных методов indexOf(), смешанных с листовым классом. - Методы setX() обычно не все именуются
set()
- на все вышеперечисленные вопросы можно ответить "да".
Для статически типизированного языка, который поддерживает перегрузку методов, вариант 1.
Для работы с иерархиями объектов, вариант 1.
Для всех остальных случаев я бы предложил вариант 2.
Мои 2 цента.:)