Источник: Nuances of Programming
Согласно Роберту К. Мартину, разработчик должен относиться к написанию кода как к сочинению истории, стараясь изложить ее как можно красивее. Это не только порадует читателей кода, но и поможет самому разработчику решить многие проблемы:
- повысить читабельность;
- сократить количество ошибок;
- облегчить процесс внесения изменений;
- создать условия для масштабируемости, тестируемости, отказоустойчивости и т. д.
Вот несколько полезных советов, которые значительно улучшат ваши функции.
1. Беритесь за одно дело и выполняйте его хорошо
Каждая функция должна выполнять одну задачу. Но иногда, выполняя одну задачу, разработчик старается попутно решить другие подзадачи. Поступаем ли мы неправильно в этом случае? Нет, если сохраняется тот же уровень абстракции внутри функции.
2. Скройте оператора switch внутри низкоуровневого класса
Оператор switch выполняет несколько задач, и не всегда можно обойтись без него. В таком случае следует спрятать этого оператора где-нибудь внутри базового или низкоуровневого класса, чтобы не повторять его. Достичь этого можно с помощью полиморфизма.
3. Сведите аргументы к минимуму
Хорошей практикой является сведение к минимуму аргументов функции. Использование большого количества аргументов приводит к увеличению концептуальных решений и усложнению тестирования. Аргумент out может еще больше запутать код, ведь обычно не предполагается, что информация будет исходить из аргументов.
4. Никогда не используйте аргументы-флаги
Функция, которая принимает аргумент bool, выполняет минимум две задачи: преобразует одно значение в true, а другое — в false. Это ужасная практика.
5. Передавайте аргументы как объект
Всегда лучше передать аргументы как объект вместо того, чтобы передавать длинный список аргументов.
6. Выбирайте исключения вместо кодов ошибок
При возвращении кодов ошибок приходится иметь дело с многочисленными условными операторами (if else). Это делает код уродливым. С другой стороны, возврат исключений упрощает работу и устраняет необходимость в многочисленных условных операторах. Вот два наглядных примера.
При использовании кода ошибки получаем следующее:
if(deleteConfigurationFromDb(adfsProvider)==E_OK){
if(deleteConfigurationFromSettingFile(adfsProvider)==E_OK){
}
}
При использовании исключения ошибки код будет выглядит как:
try{
DeleteConfigurationFromDb(adfsProvider);
DeleteConfigurationFromSettingFile(adfsProvider);
}
catch(Exception e){
logger.log(e.getMessage)
}
7. Выбирайте подходящее имя
Очень важно дать имя функции, которое отражает ее предназначение. В случае функции с одним аргументом (называемой монадой), функция и аргумент должны образовывать красивую пару глагол/существительное, например, read(book).
8. Разделяйте команду и запрос
Как уже говорилось выше, функция должна выполнять одну задачу. Поэтому нужно определить функцию таким образом, чтобы она либо выполняла что-то (команда), либо отвечала на что-то (запрос), но не совмещала в себе и то, и другое. Иными словами, функция должна либо изменить состояние объекта, либо вернуть какую-то информацию об этом объекте.
public boolean set(string attribute, string value)
if(set("username","Robert")) .....
В приведенном выше коде функция set устанавливает значение именованного атрибута и возвращает true в случае успеха и false, если такого атрибута не существует. Это приводит к появлению странного оператора if в следующей строке.
Заключение
Это, конечно, далеко не все лайфхаки, которые нужно учитывать при написании функции. С опытом у вас их будет гораздо больше.
Читайте также:
Перевод статьи Dhruba Dahal, Eight tips to Write Functions like a Senior Developer