Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Melg
537 / 158 / 64
Регистрация: 23.09.2013
Сообщений: 314
#1

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

28.09.2013, 19:55. Просмотров 752. Ответов 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" формата.
Отсюда возникает вопрос, каким образом построить систему инстанцирования фильтров, и контейнера фильтрации - так, что-бы с одной стороны - она так-же была гибкой, расширяемой, независимой от реализации, но при этом позволяла на стороне пользователя однозначно задавать и настраивать фильтры. Я бы очень хотел услышать ответы в коде, либо в терминологии применения паттернов проектирования, с некоторыми комментариями к заданой конкретике. Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.09.2013, 23:03     Гибкая архитектура и порождающие паттерны #2
абстрактная фабрика?
Melg
537 / 158 / 64
Регистрация: 23.09.2013
Сообщений: 314
28.09.2013, 23:36  [ТС]     Гибкая архитектура и порождающие паттерны #3
Цитата Сообщение от Jupiter Посмотреть сообщение
абстрактная фабрика?
Возможно, но возникает вопрос - каким образом и на этапе конкретной фабрики или абстрактной фабрики - я должен передавать настройки в конкретный продукт? Скажем для одного фильтра - нужна строка для фильтра аля ".txt" и тогда он будет считаться готовым к работе, а другому фильтру нужно указатель на пользователя.
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
29.09.2013, 01:06     Гибкая архитектура и порождающие паттерны #4
Цитата Сообщение от Melg Посмотреть сообщение
Возможно, но возникает вопрос - каким образом и на этапе конкретной фабрики или абстрактной фабрики - я должен передавать настройки в конкретный продукт?
в конкретную фабрику посредством абстрактной

Добавлено через 1 минуту
хотя наверное я плохо понял изначальную проблему...
Melg
537 / 158 / 64
Регистрация: 23.09.2013
Сообщений: 314
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 минуты
Поскольку проблема для меня достаточно животрепещущая, сейчас красочные плакаты подготовлю...
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
29.09.2013, 13:16     Гибкая архитектура и порождающие паттерны #6
Melg, может как-нибудь так?
C++
1
2
FilterInterface * filter = create_filter("fileTypeFilter");
filter->set_property("fileExtention", ".txt");
Melg
537 / 158 / 64
Регистрация: 23.09.2013
Сообщений: 314
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.
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
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 минут

Не по теме:

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

Melg
537 / 158 / 64
Регистрация: 23.09.2013
Сообщений: 314
29.09.2013, 14:52  [ТС]     Гибкая архитектура и порождающие паттерны #9
Я забыл в данном случае указать - использовать boost не разрешено. Да - пользователь должен знать то, какой фильтр ему нужен (т.е логический способ фильтрации, и исходные данные для данного способа) но он далеко не обязательно должен знать как выглядит класс, реализующий этот способ фильтрации. Иначе это уже программирование на уровне рализации.
gray_fox
What a waste!
1253 / 1136 / 54
Регистрация: 21.04.2012
Сообщений: 2,359
Завершенные тесты: 3
29.09.2013, 15:03     Гибкая архитектура и порождающие паттерны #10
Цитата Сообщение от Melg Посмотреть сообщение
Я забыл в данном случае указать - использовать boost не разрешено.
Свой аналог any написать не сложно, + это только пример, можно и по другому как-нибудь эти свойства хранить...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 19:35     Гибкая архитектура и порождающие паттерны
Еще ссылки по теме:

Объекты и архитектура C++
ОС и архитектура ЭВМ C++
Какие паттерны используются в программе и для чего? C++
Тест и задачи на smartPtr и паттерны C++
С чего начать изучать паттерны проектирования? C++

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

Или воспользуйтесь поиском по форуму:
Melg
537 / 158 / 64
Регистрация: 23.09.2013
Сообщений: 314
29.09.2013, 19:35  [ТС]     Гибкая архитектура и порождающие паттерны #11
Если у кого-то есть альтернативные предложения по поводу решения задачи - проблема всё еще считается актуальной.
Yandex
Объявления
29.09.2013, 19:35     Гибкая архитектура и порождающие паттерны
Ответ Создать тему
Опции темы

Текущее время: 00:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru