С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316

Гибкая архитектура и порождающие паттерны

28.09.2013, 19:55. Показов 1843. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня возник вопрос следующего характера.
Предположим, что есть некоторый интерфейсный класс фильтра, есть реализации, наследованные от него, есть класс - контейнер, который умеет регистрировать в себе фильтры и последовательно их применять и вычислять конечный результат по логическому или. И есть класс - кусок MVC паттерна проектирования, который зарегестрированный контейнер с фильтрами уже умеет использовать для отображения отфильтрованных данных.
Эта система является высоко гибкой, открытой для расширения, масштабируемой, но эта гибкость и абстрактность - вызывает у меня проблемы, когда я хочу ей воспользоваться. А именно, для того что-бы конкретизировать свои намерения в использовании фильтров я должен написать в коде что-то вроде:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[CPP]
#include "filteringinterface.h"
#include "filtercontainerinterface.h"
#include "crazymvcpart.h"
#include "user.h"
 
#include "filetypefilter.h"           // :( so bad
#include "userfilefilter.h"           
#include "orfiltercontainer.h"   
 
 
int main(int argc,char **argv) {
   FilterInterface *file_type_filter = new FileTypeFilter(".txt");
   UserFileFilter *user_file_filter = new UserFileFilter;
   User *user = GetUserFromHell();
   user_file_filter->SetUser(user);
   FilterInterface *setupped_user_file_filter = user_file_filter;
 
   FilterContainerInterface *or_filter_container = new OrFilterContainer;
   or_filter_container->RegisterFilter(file_type_filter);
   or_filter_container->RegisterFilter(setupped_user_file_filter);
   
   CrazyMvcPart *mvc_part = new CrazyMvcPart;
   mvc_part->RegisterFilterContainer(or_filter_container);
   mvc_part->ShowFilteringResults();
}
[/CPP]

В чём суть проблемы - во-первых, допустим у меня 5 мест в коде где я хочу использовать мою наизамечательнейшую систему демонстрации фильтрованных данных, но в одном случае нужно фильтровать одними фильтрами, по правилу .txt в другом - другими - по другому правилу... А этот код приходится вызывать целиком. Во-вторых, я не могу в рантайме взять и подменить этот самый способ - всё инстанцирование уже захардкожено, и его нельзя будет изменить. В-третьих я жескто связываю "пользовательский" код - со всеми реализациями - т.е. заставляю пользователя инклюдить все хедеры, всех инстанцируемых сущностей, будь то фильтры, контейнер фильтров, или часть MVC. Но, при этом, только пользовательский код знает наверняка что нужны именно фильтры по типу, с тонкой настройкой ввиде ".txt" формата.
Отсюда возникает вопрос, каким образом построить систему инстанцирования фильтров, и контейнера фильтрации - так, что-бы с одной стороны - она так-же была гибкой, расширяемой, независимой от реализации, но при этом позволяла на стороне пользователя однозначно задавать и настраивать фильтры. Я бы очень хотел услышать ответы в коде, либо в терминологии применения паттернов проектирования, с некоторыми комментариями к заданой конкретике. Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.09.2013, 19:55
Ответы с готовыми решениями:

Порождающие паттерны
enum Direction {North, South, East, West} class MapSite { public: virtual void Enter() = 0; } class Room: public MapSite { ...

Порождающие паттерны
Здравствуйте Теории по паттернам полно а вот реальных практических примеров найти трудно . Не сочтите за труд скиньте ссылку или какую...

Архитектура Hibernate VS Паттерны (проектируем вместе:)
Всем привет! В Java недавно, поэтому прошу вашей помощи вникнуть в суть, если я чего-то недопонимаю, или же направить на путь истинный...

10
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.09.2013, 23:03
абстрактная фабрика?
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
28.09.2013, 23:36  [ТС]
Цитата Сообщение от Jupiter Посмотреть сообщение
абстрактная фабрика?
Возможно, но возникает вопрос - каким образом и на этапе конкретной фабрики или абстрактной фабрики - я должен передавать настройки в конкретный продукт? Скажем для одного фильтра - нужна строка для фильтра аля ".txt" и тогда он будет считаться готовым к работе, а другому фильтру нужно указатель на пользователя.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.09.2013, 01:06
Цитата Сообщение от Melg Посмотреть сообщение
Возможно, но возникает вопрос - каким образом и на этапе конкретной фабрики или абстрактной фабрики - я должен передавать настройки в конкретный продукт?
в конкретную фабрику посредством абстрактной

Добавлено через 1 минуту
хотя наверное я плохо понял изначальную проблему...
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
29.09.2013, 13:04  [ТС]
Только пользователь вкурсе, что ему нужно. В одном случае - ему нужен инстанс new FileTypeFilter, с переданным в него ( или с переданным посредством вызова метода - расширением - например .txt) После того как этот инстанс был создан и настроен - он уже не нужен пользователю как FileTypeFilter - а нужен как простая абстрация над фильтрами - FilterInterface - что-бы просто зарегестрировать его в контейнере с фильтрами. Когда он захочет себе контейнер с фильтрами - он может захотеть, что-бы результаты фильтрации применялись по логическому или - т.е если хотя-бы 1 фильтр сказал что объект надо отфильтровать - тогда в конечном счете объект будет отфильтрован. И в этом случае ему нужно создать инстанс new OrFilterContainer и только потом с ним начинать работать, если же пользователю нужно поведение, когда объект отфильтровывается только если все фильтры сказали, что объект нужно отфильтровать - тогда ему нужен инстанс типа new AndFilterContainer. Дальше конкретика пользователю опять не нужна, а нужен только FilterContainerInterface - для дальнейшей регистрации.

Добавлено через 7 минут
Мы можем свести всю задачу к одним только фильтрам - к нижнему уровню: проблема в чём - до того как фильтр будет настроен - он нужен именно как конкретный объект - FileTypeFilter, UserFileFilter, SomeMagicFilter - поскольку только в конкретных классах определены методы "тонкой настройки" для этих фильтров. FileTypeFilter - надо настроить передав ему char * массив - указывающий на то какое рассширение надо фильтровать. У него определен метод типа SetFileType. А вот на уровне общего интерфейса - FilterInterface - таких методов уже нет, и через него настроить ничего не получится. Насколько я знаю - класс абстрактная фабрики ничего не знает о своих конкретных реализациях. Т.е класс абстрактной фабрики не может содержать методы передатчики информации - необходимой для правильной инициализации фильтров. Тогда поидее остаются только классы конкретных фабрик, получается - что в классе конкретной фабрики - нужно определеть методы настройки для конкретного типа продукта, которому соответствует эта фабрика? Но как это впринципе решит проблему? Т.е. да, пользовательский код будет связан с классами фабрики и абстрактной фабрики - а не конкретной реализации фильтра, но в целом разве это решает задачу?

Добавлено через 4 минуты
Поскольку проблема для меня достаточно животрепещущая, сейчас красочные плакаты подготовлю...
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.09.2013, 13:16
Melg, может как-нибудь так?
C++
1
2
FilterInterface * filter = create_filter("fileTypeFilter");
filter->set_property("fileExtention", ".txt");
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
29.09.2013, 13:24  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Melg, может как-нибудь так?
C++
1
2
FilterInterface * filter = create_filter("fileTypeFilter");
filter->set_property("fileExtention", ".txt");
Интересная идея, но как она должна реализовываться на уровне интерфейса, и как на уровне реализации - интересует set_property, и create_filter.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.09.2013, 14:43
Melg, create_filter - обычная фабрика, конструктор по умолчанию. set_property примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class FilterInterface {
 
   using property_map = std::map<std::string, boost::any>;
 
public:
   virtual void filter() const = 0;
 
   void set_property(std::string const& id, boost::any const& value) const {
      properties.insert(std::make_pair(id, value));
   }
 
   template<typename T>
   T get_property(std::string const& id) const {
      property_map::const_iterator it = properties.find(id);
      if (it == properties.end()) {
         throw std::out_of_range("no such property");
      }
      return boost::any_cast<T>(it->second);
   }
 
private:
   property_map properties;
};
 
class FileTypeFilter : public FilterInterface {
 
public:
   virtual void filter() const {
      std::string extension = get_property<std::string>("fileExtension");
      // ...
   }
};
Добавлено через 1 час 0 минут

Не по теме:

Кстати, вообще нужно ли подобное? Можно отвязаться от конкретного типа фильтра в коде, но пользователь всё равно ведь должен знать, какой фильтр создать и как его проинициализировать - т.е. тот же тип фильтра по сути.

0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
29.09.2013, 14:52  [ТС]
Я забыл в данном случае указать - использовать boost не разрешено. Да - пользователь должен знать то, какой фильтр ему нужен (т.е логический способ фильтрации, и исходные данные для данного способа) но он далеко не обязательно должен знать как выглядит класс, реализующий этот способ фильтрации. Иначе это уже программирование на уровне рализации.
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.09.2013, 15:03
Цитата Сообщение от Melg Посмотреть сообщение
Я забыл в данном случае указать - использовать boost не разрешено.
Свой аналог any написать не сложно, + это только пример, можно и по другому как-нибудь эти свойства хранить...
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
29.09.2013, 19:35  [ТС]
Если у кого-то есть альтернативные предложения по поводу решения задачи - проблема всё еще считается актуальной.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2013, 19:35
Помогаю со студенческими работами здесь

Архитектура и паттерны для разработки ADO.Net сервера
Добрый день! Более опытные разработчики может быть подскажут, как правильно организовать работу с SQL бд используя объекты ADO.Net. Я...

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и как ее исправить?

архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников
сабж. кто чем может помочь юному,непонемающему в этой области человеку.желательно книгами.спасибо.

Порождающие полиномы для м-последовательностей
Доброго времени суток. кто-то может подсказать как рассчитать порождающие полиномы 15 степени для построения м-последовательностей?

Порождающие полиномы циклических кодов
Подскажите пожалуйста, где можно почитать про коды (цикличесикй, блочный и др.) с примерами, порождающих матриц и полиномов, а так же...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru