Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
1

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

28.09.2013, 19:55. Просмотров 1269. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.09.2013, 19:55
Ответы с готовыми решениями:

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

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

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

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

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

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

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

Добавлено через 4 минуты
Поскольку проблема для меня достаточно животрепещущая, сейчас красочные плакаты подготовлю...
0
What a waste!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
29.09.2013, 13:16 6
Melg, может как-нибудь так?
C++
1
2
FilterInterface * filter = create_filter("fileTypeFilter");
filter->set_property("fileExtention", ".txt");
0
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
29.09.2013, 13:24  [ТС] 7
Цитата Сообщение от gray_fox Посмотреть сообщение
Melg, может как-нибудь так?
C++
1
2
FilterInterface * filter = create_filter("fileTypeFilter");
filter->set_property("fileExtention", ".txt");
Интересная идея, но как она должна реализовываться на уровне интерфейса, и как на уровне реализации - интересует set_property, и create_filter.
0
What a waste!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
29.09.2013, 14:43 8
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
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
29.09.2013, 14:52  [ТС] 9
Я забыл в данном случае указать - использовать boost не разрешено. Да - пользователь должен знать то, какой фильтр ему нужен (т.е логический способ фильтрации, и исходные данные для данного способа) но он далеко не обязательно должен знать как выглядит класс, реализующий этот способ фильтрации. Иначе это уже программирование на уровне рализации.
0
What a waste!
1576 / 1277 / 171
Регистрация: 21.04.2012
Сообщений: 2,677
29.09.2013, 15:03 10
Цитата Сообщение от Melg Посмотреть сообщение
Я забыл в данном случае указать - использовать boost не разрешено.
Свой аналог any написать не сложно, + это только пример, можно и по другому как-нибудь эти свойства хранить...
0
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
29.09.2013, 19:35  [ТС] 11
Если у кого-то есть альтернативные предложения по поводу решения задачи - проблема всё еще считается актуальной.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2013, 19:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.