Как организовать повторяющийся код?


11

Моя команда создает много одноразовых веб-форм. Большинство из этих форм просто отправляют электронную почту, а некоторые делают простую запись в базу данных.

Прямо сейчас каждая форма живет в своем отдельном решении в Visual Studio Team Foundation Server. Это означает, что у нас есть около 100 различных форм проектов, что затрудняет поддержание согласованности. Каждая форма уникальна тем, что поля разные, но все они делают одно и то же.

Я пытаюсь как-то сжать их, и я действительно мог бы использовать некоторые рекомендации.

  • Должен ли я попытаться создать один файл решения со всеми нашими проектами форм в нем? Существует не так много кода, хотя я мог бы создать несколько вспомогательных классов, которые помогут с форматированием электронной почты и тому подобное. Было бы очень полезно иметь возможность обмениваться CSS, JavaScript, элементами управления и изображениями между проектами.
  • Учитывая, что мы являемся магазином Microsoft, есть ли какие-то ощутимые преимущества от использования чего-то вроде MVC над Webforms для этого конкретного сценария? Я продаю концепцию MVC в целом, но поможет ли мне более эффективно собрать форму для сбора данных из 15 полей, если все, что она делает, это отправляет электронную почту? Форма, которая заставила меня задуматься об этом, имела хорошую логику, встроенную для отображения и скрытия полей на основе ответов пользователя, и кажется, что было бы менее эффективно использовать MVC и jQuery.

2
Что это было перенесено сюда из мета? Должно быть на ТАК.
Джош К

1
@Josh Stack Overflow предназначен для вопросов, непосредственно связанных с конкретными проблемами в коде. Разработка программ и рабочих процессов обсуждается здесь.

@Mark: Это звучит не очень субъективно, так как не было бы легко найти идеальное решение «наилучшей практики». Я не парень MS, поэтому я понятия не имею, что это за осложнение, однако я рискну предположить, что на этот вопрос лучше всего ответить не субъективно.
Джош К

Согласовано. Это будет закрыто на SO.
Уолтер

1
Об этом уже спрашивали на SO здесь
ChrisF

Ответы:


3

Рефакторинг безопасно без испытаний сложно и чревато опасностью.

Я бы начал с:

  • Написание тестовых примеров, которые охватывают различные типы ввода в эти формы и ожидаемый результат. Похоже, на самом деле это не займет слишком много времени, поскольку вы чувствуете, что большинство этих форм идентичны по функциональности или близки к ним.

  • Запустите эти тестовые наборы для примерно 100 форм (включите покрытие кода, чтобы помочь вам отслеживать пути кода).

После этого вы сможете увидеть, что вы можете безопасно перефакторизовать, тогда вы можете (пример):

  • Запустите инструмент обнаружения дублирования кода (не уверен, как он называется в .NET, в Java у нас есть CPD). Сразу удалите 13 одинаковых форм. Теперь снова запустите тесты - Yay! Все они проходят, за исключением формы 11, хорошо, поэтому мы пока не можем это удалить.

  • Удалите весь локальный код форматирования электронной почты и получите все формы для вызова общего модуля обработки электронной почты. Запустите тесты, они все пройдут, кроме одного, ххммм ОК .... UTF-8 символов, исправьте это в универсальном модуле, запустите тесты снова, да, у нас все хорошо!

промыть и повторить.


2
+1 См. Michael Feathers, «Эффективно работающий с устаревшим кодом» amazon.com/dp/0131177052, чтобы узнать, как подойти к рефакторингу.
Майкл Браун

Оооо, хорошая ссылка - мне нравится эта книга.
Мартейн Вербург

0

Я бы предложил абстрагироваться от части представления. Используя Model / View / Controller, поместите формы в View, и пусть они используют один и тот же контроллер. Этот контроллер может выполнять общее действие, например отправлять электронную почту на адрес по умолчанию, или перенаправлять данные формы на контроллер, который может. Таким образом, все, что вам нужно сделать, чтобы создать новую форму, это создать форму и направить вывод на этот контроллер. Эта архетектура может содержаться в одном проекте, который позволит вам делиться CSS и javascript, как вы упомянули.

Для обработки форматирования электронных писем я бы начал с создания универсального средства форматирования, скажем, такого, которое бы просто перечисляло имена и значения элементов формы, а также другой тип метаданных, такой как отправленное время, и т. Д. Вы можете сделать это как угодно, как хотите , Затем, если вам действительно нужно больше пользовательской обработки, добавьте фабрику. Фабрика будет возвращать интерфейс форматера. Затем в рамках фабрики вы можете выполнить поиск средства форматирования для этой конкретной формы или вернуть общий, если конкретный не существует. Такая конструкция также облегчит модульное тестирование cntroller, так как вы можете легко предоставить имитатор форматирования для целей тестирования.

Кстати, я бы не стал указывать адрес электронной почты в качестве аргумента в форме. Если вам нужно отправить по нескольким адресам, я бы предложил создать справочную таблицу, которая содержит все формы и электронное письмо для их отправки. Это может быть реализовано в XML или в коде (я видел оба, хотя я не уверен, что лучше). Это поможет избежать получения спамерами ваших адресов электронной почты со страницы формы.


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

Кроме того, какие-либо рекомендации по обработке логики формы, такие как заполнение раскрывающегося списка на основе выбора в другом раскрывающемся списке? Является ли jQuery единственным вариантом, если мы пошли по маршруту MVC?
Джош Эрл

@JoshEarl: я отредактировал идею для средства форматирования, но я не могу высказать какие-либо предложения относительно jQuery и т. Д. Сторона веб-страницы - это не та область, о которой я совершенно уверенно делаю рекомендации. Возможно, вам придется пойти с полным дизайном MVC, один контроллер на страницу, если все слишком сложно. Как сказал @Martijn, модульное тестирование поможет вам точно определить ваши требования. Мой дизайн предполагает довольно много общего между формами.
Майкл К
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.