Лучший способ справиться с объединением бизнес-кода и кода презентации?

Рассмотрим гипотетическую ситуацию, когда старая, унаследованная библиотека презентаций поддерживалась на протяжении многих лет, и постепенно в нее закодировалось все больше и больше бизнес-логики в результате процесса поспешных исправлений и отсутствия надлежащего архитектурного контроля. В качестве альтернативы рассмотрите бизнес-класс или пространство имен, которые не отделены от представления границами сборки и, таким образом, могут ссылаться на что-то вроде System.Windows.Forms без необходимости добавления ссылки (гораздо более отрезвляющее действие, чем простое предложение using) .

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

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

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

Это достойный подход? Как лучше мне это сделать? Я полагаюсь на вашу коллективную интернет-мудрость.

Спасибо!


person bwerks    schedule 13.08.2010    source источник
comment
Спасибо, что заставили меня выучить новое слово сегодня. Я все еще не уверен, что знаю, что означает объединение, но в любом случае я собираюсь начать его использовать немедленно!   -  person Jimmy Hoffa    schedule 14.08.2010
comment
Ваш основной вопрос. Как мне создать уровень бизнес-логики из набора бизнес-логики, существующей в пользовательском интерфейсе? ?   -  person Jimmy Hoffa    schedule 14.08.2010
comment
Мое впечатление о соединении - это соединение двух вещей в одно, обычно с оттенком ошибки / негатива. Рад, что тебе понравилась моя дикция! Но да, основной вопрос заключается не в том, как мне сделать трехуровневую систему, а скорее в том, как исправить этот беспорядок с практической точки зрения.   -  person bwerks    schedule 14.08.2010


Ответы (4)


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

Я нашел книгу Эффективная работа с устаревшим кодом быть неоценимым в таких ситуациях. Кроме того, не сразу переходите к шаблонам, не изучив сначала принципы объектно-ориентированного дизайна, такие как SOLID принципы. Они часто направляют ваш выбор моделей и решений об эволюции системы.

person Jordão    schedule 13.08.2010
comment
Я привык работать в среде .NET3.5 +, где Moq доступен как ресурс для модульного тестирования. Однако эта кодовая база основана на C # 2.0 / .NET3.0, а Moq не существует так давно. Я пробовал Rhino раньше, но каким бы хорошим и мощным он ни был ... Я его очень ненавижу. Есть ли другие альтернативы? - person bwerks; 14.08.2010
comment
@bwerks: Мне очень жаль, но на данный момент у меня нет рекомендаций по созданию хорошего фреймворка для фиксации. Похоже на вопрос SO. - person Jordão; 23.08.2010

Я смиренно предлагаю Модель – Представление – Контроллер - MVC имеет высокую вероятность успешного решения вашей проблемы. Он разделяет различные логики, во многом, как вы описываете.

alt text

HTH

person JustBoo    schedule 13.08.2010
comment
К сожалению, этот конкретный компонент возник в MVC; К сожалению, с учетом того, как все закончилось, в представлении было много метрической тонны бизнес-логики, а модель была изобиловала блоками сообщений типа «да / нет», которые использовались для корректировки курса во время обработки. Вместо M, V, C это M / V / C, если вы понимаете мой грамматический сдвиг. - person bwerks; 14.08.2010

Я бы подошел к этому, четко обозначив сущности и действия, которые они могут или могут с ними сделать. Затем один за другим попробуйте начать создавать независимые объекты бизнес-логики для тех, кто выполняет рефакторинг логики из пользовательского интерфейса, вызывая пользовательский интерфейс для объектов BL.

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

Затем, как говорит JustBoo, ​​я думаю, у вас будет достаточно отчетливая ситуация, чтобы начать абстрагировать контроллеры от вашего BL и пользовательского интерфейса и заставить все это функционировать в дизайне MVC.

person Jimmy Hoffa    schedule 13.08.2010
comment
Джимми Хоффа, да? Где ты Джимми? Это точно не под стадионом. :-D - person JustBoo; 14.08.2010

Хорошо, учитывая ваши различные комментарии, я бы прислушался к совету г-на Хоффа и расширил его. Я уверен, что вы слышали, что сложные проблемы следует разбивать на все более мелкие единицы работы, пока они не будут «побеждены».

Использование этого метода в сочетании с методологиями рефакторинга может решить вашу проблемы. Об этом есть книга и много информации в сети. Теперь у вас есть ссылка. На этой странице есть масса ссылок на информацию.

Еще одна ссылка от автора книги.

Итак, вы медленно, но верно реорганизуете все до совершенства MVC, шаг за шагом.

HTH

person JustBoo    schedule 13.08.2010