Defensive Programming via Validating Decorators

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Вы проверяете входные параметры своих методов на корректность? Я нет. Раньше я это делал, но уже не делаю. Я просто позволяю своим методам аварийно завершаться с нулевым указателем и другими исключениями, когда параметры неверны. Это может показаться нелогичным, но только в начале. Я предлагаю вам вместо этого использовать декораторы проверки корректности.

Давайте рассмотрим этот довольно типичный пример на Java:

Довольно оборонительно, верно? Если мы удалим эти проверки, код будет намного короче, но он выдаст довольно запутанные сообщения, если клиентом будет предоставлено значение NULL. Более того, если файл уже существует, наш Report тихо перезапишет его. Достаточно опасно, верно?

Да, мы должны защищать себя, и мы должны быть оборонительными.

Но не таким образом, не путем надувания класса проверками, которые никак не связаны с его основной функциональностью. Вместо этого мы должны использовать декораторы для выполнения проверки. Вот как это делается. Сначала должен быть интерфейс Report:

Затем класс, который реализует основной функционал:

И, наконец, ряд декораторов, которые будут обеспечивать нам защиту:

Теперь клиент имеет гибкость составления сложного объекта из декораторов, выполняющих свои специфические задачи. Основной объект будет осуществлять отчетность, в то время как декораторы будут проверять параметры.

Что мы достигаем с помощью этого подхода? Прежде всего: более мелкие объекты. И более мелкие объекты всегда означают более высокую поддерживаемость. Наш класс DefaultReport всегда будет оставаться маленьким, независимо от того, сколько проверок мы можем придумать в будущем. Чем больше вещей нам нужно проверить, тем больше мы создадим проверяющих декораторов. Все они будут маленькими и связными. И мы сможем объединять их в разных вариациях.

Кроме того, этот подход делает наш код намного более повторно используемым, поскольку классы выполняют очень мало операций и не защищают себя по умолчанию. Хотя быть защитным - это важная особенность, мы будем использовать проверяющих декораторов. Но это не всегда будет так. Иногда проверка является слишком дорогой по времени и памяти, и мы можем захотеть работать непосредственно с объектами, которые не защищают себя.

Я также решил больше не использовать Java Validation API по той же причине. Его аннотации делают классы намного более громоздкими и менее связными. Вместо этого я использую проверяющих декораторов.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 16:51

sixnines availability badge   GitHub stars