Чтобы получить больше удовольствия от чтения, ознакомьтесь с оригинальной и полной статьей, размещенной на сайте enmascript.com 5 октября 2018 г.
При создании функций нам часто нужно создавать экземпляры на основе параметров, поступающих из конечной точки или аналогичного динамического источника. В этой статье я попытаюсь дать вам представление о том, как мы можем использовать шаблон с одной фабрикой в таких случаях.
Мы проведем рефакторинг фрагмента кода, чтобы сделать его более масштабируемым и понятным. Предположим, у нас есть такая предпосылка:
По заданному объекту данных элемента напишите алгоритм, который позволит пользователям указывать тип элемента для его динамической визуализации. Кроме того, проверьте элементы по мере необходимости:
- Общие текстовые поля ввода, такие как адрес электронной почты и пароль, должны быть проверены.
- Убедитесь, что разрывы строк удалены из элементов textarea.
Пример источника данных, назовем его elementsData.js:
export default { elements: { email: { type: 'email', text: 'Email', name: 'userEmail' }, summary: { type: 'textarea', text: 'Summary', name: 'summary' }, role: { type: 'select', text: 'Role', name: 'role', options: [ { value: 1, display: 'Software Developer' }, { value: 2, display: 'Designer' }, { value: 3, display: 'Manager' }, ... ] }, ... } };
Не масштабируемый подход
Теперь я напишу, что может быть псевдо «решением» для динамического создания типов элементов формы и их проверки (обратите внимание, что я буду определять только те методы, которые важны для целей этой статьи):
import config from './elementsData'; export default class FormElement { constructor(type) { this.type = type; this.elements = config.elements; } getElementByType() { return this.type in this.elements ? this.elements[this.type] : null; } /* This would validate our email*/ emailValidator() { ... } /* this would remove line breaks from our textareas */ textareaSanitizer() { ... } /* We would use this to bind all the validators and sanitizers events */ bindEventListeners() { ... } renderFormElement() { const element = this.getElementByType(); if (!element) { return false; } switch(this.type) { case 'email': return ` <div class="field-wrapper"> <input type="email" name=${element.name} placeholder=${element.text} /> </div> `; break; case: 'textarea': return ` <div class="field-wrapper"> <textarea name=${element.name} placeholder=${element.text} /> </div> `; case 'select': return ` <div class="field-wrapper"> <select name=${element.name}> ${element.options.map(option => ` <option value=${option.value}> ${option.display} </option> `)} </select> </div> `; } } }
и мы создадим экземпляр класса в нашем main.js, например:
const formElement = new FormElement('email'); formElement.renderFormElement();
Это должно работать, верно? Мы потребляем данные, динамически создаем элементы и проверяем их… НО, есть некоторые вещи, которых мы не видим, я хочу, чтобы вы подумали в будущем, что произойдет с этим классом, когда вы или кому-то еще нужно добавлять все больше и больше элементов формы?, метод renderFormElements
будет расти, и в итоге мы получим огромный метод с бесконечными условиями, методами проверки, и не будем даже говорить о сложности и масштабируемости.
Реализация одной фабрики
Фабричный шаблон — это шаблон проектирования, который является частью группы creational. Он в основном касается проблемы создания объектов, когда класс, который создает его экземпляр, должен быть динамическим, а также очень помогает в организации вашего кода. , так как:
- Изолирует объекты, которые необходимо создать.
- Продвигает небольшие классы с меньшей ответственностью.
- Ответственность за создание объекта делегирована классу под названием «фабрика».
- Создает экземпляры, получая динамическое значение в вашей точке входа.
Вот визуальное представление, которое я создал, чтобы продемонстрировать, как работает фабрика.
Теперь мы начнем с рефакторинга нашего решения на основе списка, который мы создали выше, давайте начнем: Продолжить чтение на enmascript.com