Re[3]: Использование "точных" названий и разделенных классов
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 03.09.08 12:27
Оценка:
Здравствуйте, a.coder, Вы писали:

AC>Имхо, следующие задачи решать станет проще:

AC>* реализация логики, связанной с фильтрами, если фильтры реализовать так, как удобно для бизнес-логики, а не для диалога.
AC>* юнит-тестирование

Хорошо, допустим.

AC>Да, в первую очередь хотелось бы ограничить интерфейс Filter GUI. Как было в примере, в 3 разных проектах используется один и тот же диалог, но из-за того, что в нем используется класс сущности для извлечения данных, неудобно эту саму сущность изменять.


Да, вполне согласен. Такое вполне может статься, особенно, если сущность подкручивалась под нужды тех или иных диалогов.

AC>Попробую описать свою проблему конкретным примером


AC>Структура проектов такая:

AC>1. PluginProject1 (enum FilterTypes1)
AC>2. PluginProject2 (enum FilterTypes2)
AC>3. PluginCoreProject3 (BaseFilter, KeywordsFilterDialog, ListFilterDialog)

AC>В PluginCoreProject3 есть классы фильтра BaseFilter и диалогов KeywordsFilterDialog, ListFilterDialog.

AC>У фильтра BaseFilter есть поле Type — типа int.

.Net-овского reflection мало оказалось?

AC>
AC>public class BaseFilter
AC>  ...

AC>  public KeywordsFilterDialog(BaseFilter filter)
AC>    ...

AC>


Странно. По идее KeywordsFilterDialog отлично знает о том, какой именно фильтр ему нужен (KeywordsFilter), но получает почему-то BaseFilter. Зачем такие сложности?

AC>Проекты PluginProject1 и PluginProject2 используют BaseFilter, но Type трактуются в каждом по-своему. Для этого заведены enum'ы FilterTypes1 и FilterTypes2. В коде же используются преобразования типа:


[skip преобразования]

AC>Такие конструкции неудобны, когда дальше в логике приходится интенсивно использовать Filter.


Ещё бы... Прости за ёрничество, а оперировать объектами нужных типов вместо базового религия не позволяет?

AC>Была идея сделать BaseFilter generic'ом, которому передавался бы свой enum в каждом проекте, но тут я уперся в диалоги.


Зачем??? Выкиньте вы этот хвост enum-ов. Не нужны они тут.

AC>Диалоги в своих конструкторах обязательно принимают BaseFilter как один из аргументов.


Ну вот и зачем? Зачем передавать в конструктор параметр базового типа, когда на самом деле нужен вполне определённый? Чтобы плодить код кастинга?

AC>Неудобно конструктору GuiControl'а передавать generic тип. Использовать дизайнер форм становится сложнее.


AC>Основной аргумент, против таких идей — не стоит вообще так заморачиваться для наших небольших проектов


Да нет, вопрос скорее в том, как обосновано решение о введении дополнительной прослойки. Если просто абстрактным "хорошо-плохо", то это одно, а если соображениями практического порядка — совсем другое. Но вам, ИМХО, имеет смысл поменять дизайн. Что-то больно много всего накручено, альтернативный способ идентификации типов через enum/int — вообще в топку (во всяком случае, из твоих примеров не следует, что это зачем-то нужно, кроме как для того, чтобы упражняться в преобразованиях BaseFilter).
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.