Моя команда создает много одноразовых веб-форм. Большинство из этих форм просто отправляют электронную почту, а некоторые делают простую запись в базу данных.
Прямо сейчас каждая форма живет в своем отдельном решении в Visual Studio Team Foundation Server. Это означает, что у нас есть около 100 различных форм проектов, что затрудняет поддержание согласованности. Каждая форма уникальна тем, что поля разные, но все они делают одно и то же.
Я пытаюсь как-то сжать их, и я действительно мог бы использовать некоторые рекомендации.
- Должен ли я попытаться создать один файл решения со всеми нашими проектами форм в нем? Существует не так много кода, хотя я мог бы создать несколько вспомогательных классов, которые помогут с форматированием электронной почты и тому подобное. Было бы очень полезно иметь возможность обмениваться CSS, JavaScript, элементами управления и изображениями между проектами.
- Учитывая, что мы являемся магазином Microsoft, есть ли какие-то ощутимые преимущества от использования чего-то вроде MVC над Webforms для этого конкретного сценария? Я продаю концепцию MVC в целом, но поможет ли мне более эффективно собрать форму для сбора данных из 15 полей, если все, что она делает, это отправляет электронную почту? Форма, которая заставила меня задуматься об этом, имела хорошую логику, встроенную для отображения и скрытия полей на основе ответов пользователя, и кажется, что было бы менее эффективно использовать MVC и jQuery.
design
refactoring
Джош Эрл
источник
источник
Ответы:
Рефакторинг безопасно без испытаний сложно и чревато опасностью.
Я бы начал с:
Написание тестовых примеров, которые охватывают различные типы ввода в эти формы и ожидаемый результат. Похоже, на самом деле это не займет слишком много времени, поскольку вы чувствуете, что большинство этих форм идентичны по функциональности или близки к ним.
Запустите эти тестовые наборы для примерно 100 форм (включите покрытие кода, чтобы помочь вам отслеживать пути кода).
После этого вы сможете увидеть, что вы можете безопасно перефакторизовать, тогда вы можете (пример):
Запустите инструмент обнаружения дублирования кода (не уверен, как он называется в .NET, в Java у нас есть CPD). Сразу удалите 13 одинаковых форм. Теперь снова запустите тесты - Yay! Все они проходят, за исключением формы 11, хорошо, поэтому мы пока не можем это удалить.
Удалите весь локальный код форматирования электронной почты и получите все формы для вызова общего модуля обработки электронной почты. Запустите тесты, они все пройдут, кроме одного, ххммм ОК .... UTF-8 символов, исправьте это в универсальном модуле, запустите тесты снова, да, у нас все хорошо!
промыть и повторить.
источник
Я бы предложил абстрагироваться от части представления. Используя Model / View / Controller, поместите формы в View, и пусть они используют один и тот же контроллер. Этот контроллер может выполнять общее действие, например отправлять электронную почту на адрес по умолчанию, или перенаправлять данные формы на контроллер, который может. Таким образом, все, что вам нужно сделать, чтобы создать новую форму, это создать форму и направить вывод на этот контроллер. Эта архетектура может содержаться в одном проекте, который позволит вам делиться CSS и javascript, как вы упомянули.
Для обработки форматирования электронных писем я бы начал с создания универсального средства форматирования, скажем, такого, которое бы просто перечисляло имена и значения элементов формы, а также другой тип метаданных, такой как отправленное время, и т. Д. Вы можете сделать это как угодно, как хотите , Затем, если вам действительно нужно больше пользовательской обработки, добавьте фабрику. Фабрика будет возвращать интерфейс форматера. Затем в рамках фабрики вы можете выполнить поиск средства форматирования для этой конкретной формы или вернуть общий, если конкретный не существует. Такая конструкция также облегчит модульное тестирование cntroller, так как вы можете легко предоставить имитатор форматирования для целей тестирования.
Кстати, я бы не стал указывать адрес электронной почты в качестве аргумента в форме. Если вам нужно отправить по нескольким адресам, я бы предложил создать справочную таблицу, которая содержит все формы и электронное письмо для их отправки. Это может быть реализовано в XML или в коде (я видел оба, хотя я не уверен, что лучше). Это поможет избежать получения спамерами ваших адресов электронной почты со страницы формы.
источник