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

Проектирование ОО архитектуры - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как переделать из консольного приложения в форму? http://www.cyberforum.ru/cpp-beginners/thread368301.html
Всем привет! Есть рабочее консольное приложение на с++. управляет видеосервером, коннектит, посылает комманды и тп. всё через консоль. задача - сделать управление через программку под винду, кнопки жать то есть. можно ли как-то добавить прямо в рабочий проект (консольный) форму, натянуть нужных кнопок и привязать к ним выполнение консольных комманд? или при создании приложения Windows Forms...
C++ Я не могу преобразовать PNG (RGBA) в JPEG Проблема заключается в том, что программа сразу закрывается! #include <stdio.h> #include <stdlib.h> extern "C" { #include "png.h" #include "jpeglib.h" } typedef struct { int w, h, d, t, ps, ts; unsigned char pl; unsigned char tr; unsigned char * p; } image_info; http://www.cyberforum.ru/cpp-beginners/thread368292.html
C++ Псевдоалгоритм Хаффмана
есть алгоритм n – количество символов исходного алфавита P – массив вероятностей, упорядоченных по убыванию C – матрица элементарных кодов L – массив длин кодовых слов Huffman (n,P) IF (n=2) C := 0, L := 1 C :=1, L :=1 ELSE q:= P +P
C++ Непонятный синтаксис
Вот есть обявление. sp<DataSource> source; sp<DataSource> это что? Спасибо!
C++ База данных для приемной комиссии института. http://www.cyberforum.ru/cpp-beginners/thread368271.html
Нужно составить простенькую программу с базой данных для приемной комиссии института. Выручайте... Она не должна быть какой - то мудреной. Это домашнее задание. Но в ней должна быть какая то графическая оболочка. Желательно описать что за что там отвечает. Просто с языком я не знаком. Базу данных я потом сам составлю. Я там должен буду вводить ФИО, телефон, курс, и группу на которую зачислен...
C++ Нужны коментарии ко коду. Все доброго времени! Такой вопрос, есть код, работает исправно, что делает тоже ясно. Часть я уже прокоментил, но с большей частью траблы.( Прокоментируйте кажду строку что б докладно понимать какая строка что делает и зачем. Очень признателен! std::ifstream ifile("read.txt");//Считывание с файла. std::ofstream ofile("write.txt");//Запись в файл. if(ifile.is_open()){ ... подробнее

Показать сообщение отдельно
Bers
Заблокирован
18.10.2011, 14:32     Проектирование ОО архитектуры
Интересно мнение публики. "Программирование в терминах интерфейсов"
Вопрос такой: как правильно конструировать едино-образный интерфейс?

По аналогии с контейнерами STL - все они по разному решают задачи, но для удобства пользователя имеют единообразный интерфейс (что может предполагать некое родство между ними, а может и не предполагать)

Допустим в рамках одной архитектуры понадобилось создать несколько не связанных между собой сущностей (классов), но очень хочется выдержать единообразный интерфейс управления ими.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class SomeClass1
{
public:
   void CommonMethod() {}   //идентичен методам других классов
   void UniqueMedthod() {}    //уникальная реализация
}
 
class SomeClass2
{
public:
   void CommonMethod() {}   //идентичен методам других классов
   void UniqueMedthod() {}    //уникальная реализация
}
Каким образом можно добиться единообразности интерфейсов, при условии, что некоторые методы должны будут делать нечто уникальное. И даже те методы, которые изначально планировались как дефолтные для всех классов, в последствии для отдельных классов нужно будит переделывать, заменяя их реализацию.

1 Способ: Copy-Paste

Тупо копипастим прототипы по всем классам. Где нужно - копипастим и реализации. Где нужно - пишем ручками что-то своё.

Достоинства:
Быстро и просто.
Классы получаются абсолютно никак не связанны друг с другом. Можно делать любые модификации одного класса, и они никак не отразятся на других классах.

Недостатки:
Если выяснится, что для всех классов метод CommonMethod(); должен начать работать как то иначе (а такое случается сплошь и рядом, особенно, если в нем созрел ужасссссный баг) - придется придется заного все перекопипастивать, и пере тестировать.
Кроме того - дублирование существующего кода.

2 Способ: полиморфизм.

Можно просто унаследоваться от интерфейса, и переопределить реализацию тех методов, которые у клиента должны иметь уникальную реализацию. А можно разработать целую иерархию интерфейсов и микшировать их для отдельных клиентов-потомков при помощи наследования.

Достоинства: относительно простое и по своему элегантное решение. Классы-клиенты связаны некоторыми семейными узами. Что позволяет менять поведение объекта "на лету", и тп.
Кроме того, появляется возможность пользоваться "дефолтным интерфейсом".

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

3. Шаблоны.

В общем виде, это делается так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class Client> struct TData {};   //объявляем данные-члены будущего класса-клиента
 
template <class Client> 
class TInterface: public TData<Client> { ...  }; //объявляем интерфейс будущих клиентов
 
 
class ConcreteClient; //предварительное объявление
 
template <>
struct TData<ConcreteClient> {}; //уточняем данные члены для конкретного класса-клиента
 
//если нужно уточняем отдельные методы интерфейса для конкретного класса-клиента
 
class ConcreteClient: public TInterface<ConcreteClient> { }; //подключаем интерфейс к клиенту
Таким образом, класс клиент получит свой интерфейс, и свои данные-члены.

Недостатки:Архитектура с шаблонами значительно усложняется.
Кроме того, если класс-клиент сам является шаблоном, начнутся серьёзные траблы. Потому что нельзя выполнить частичную специализацию отдельного метода. И тогда придётся городить обходные пути. Все это в конечном счете настолько может усложнить понимание архитектуры, что начинают приходить крамольные мысли в голову: может быть копипаста - не такое уж зло?

Недостатки: иногда проще скопипастить прототип с реализацией, чем копипастить этот же самый прототип с этой же самой реализацией и ещё уродливую километровую шапку шаблона в придачу.

Достоинства: эффект как от полиморфизма, только нет потерь производительности.

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

4. Препроцессор.

Делается это так:

C++
1
2
3
4
class Client
{
        #include "IClient.h" //подключаем интерфейс клиента
};
Внутри файла "IClient.h" содержится:

C++
1
2
3
#include "CommonInterface.h" //подключаем идентичные для всех клиентов методы
 
//ниже идёт перечень всех уникальных методов
Достоинства: Очень простой и элегантный по своему способ. Позволяет без каких бы то ни было особых ухищрений и дублирования кода добиться эффекта "копипасты", но с той разницей. Что если что то где-то нужно будит поменять - менять придётся только в одном месте, а не во всех файлах.

Недостатки: При таком подходе у меня в студии ассистент тупить начал. А без него работать уже не комфортно.

Недостатки: Получается, что файлы cpp уже и не нужны. Вся реализация классов оказывается в хэдерах. Это может плохо сказаться на скорости компиляции, и на сокрытии данных.

Главный недостаток: если вдруг окажется, что клиенту больше не нужен "идентичный как у всех метод", и нужно будит сделать его уникальным, то попытка отвязать класс от commonInterface.h может доставить таких лулзов, что шаблоны сказкой покажутся.

Когда инклюд начинает сидеть на инклюде, и все это инклюдится в 100500 классов - начинаешь в такой архитектуре быстро путаться. Получается каша из классов. Многие классы оказываются "как то странно друг с другом связанны".

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

Это способы конструирования единообразного интерфейса, которые я знаю. А как делаете вы?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru