Prestructors

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

Предполагается, что предварительная обработка аргументов конструкторов перед их инкапсуляцией является плохой практикой. Тем не менее, очень часто это необходимо делать именно так: выполнить некоторые манипуляции с объектами, предоставленными в качестве аргументов, а затем только присвоить их атрибутам созданного объекта. Для этой цели я предлагаю использовать предварительные конструкторы, которые могут быть методами или автономными объектами.

Допустим, это ваш код:

Единственный конструктор ожидает список заголовков, который инкапсулируется как this.titles для последующего использования. Он также защищен от случайных изменений через декоратор JDK unmodifiableList. Пока все хорошо. Теперь мы хотим сделать наш класс немного умнее и позволить ему принимать не только List, но и массив строк:

Что не так с этим кодом? Те из вас, кто читал мои предыдущие blog посты об ООП, безусловно, знают ответ. Во-первых, здесь есть два основных конструктора, что является плохой практикой. Во-вторых, во втором конструкторе есть код, что также является плохой идеей.

Вот как я обычно рефакторю этот код, чтобы решить оба упомянутых проблемы:

Я называю этот новый статический метод toList() преструктором: он используется только в момент конструирования объекта и только из вторичного конструктора.

Еще более лучшим способом было бы создать новый класс ToList, который делал бы точно то же самое, но более декларативно и лениво:

ListOf из Cactoos является прекрасным примером такого преобразователя.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-17 at 15:52

sixnines availability badge   GitHub stars