Тема 1. Архитектура приложения (Практикум - теоретические материалы)
Описание файла
Файл "Тема 1. Архитектура приложения" внутри архива находится в папке "Практикум - теоретические материалы". PDF-файл из архива "Практикум - теоретические материалы", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 5 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
Практикум на 3м курсе (осенний семестр) длякафедры АСВК ведет лаборатория компьютернойграфики и мультимедиа◦ Зав. лабораторией Ю.М. БаяковскийЗадания по практикуму дополняют задания покурсу компьютерной графикиСтраница практикумаhttp://courses.graphics.cs.msu.ru/user/index.php?id=8◦ Задания◦ ОценкиПолучение навыков разработки и реализацииархитектуры программного обеспеченияПрименение современных программныхтехнологий в практических задачах реального мираПараллельно – консультации по выполнениюзадания по курсу компьютерной графикиРазработка трехслойной архитектуры программы◦ Разделение GUI/Logic/Database◦ Вызов уровня логики из Native/.NET кода (GUI)Разработка открытой архитектуры программы (наоснове плагинов)Методы автодокументации исходного кодаМетоды сериализации объектовПрименение многопоточности для обработкимультимедийных данных…Вторник, 10:30, ауд.
607Для каждого задания – один семинар собъяснениемВ конце каждого семинара консультация позаданиюИногда возможен только необязательный семинар консультация24.09 Вводная часть, объяснение темы I08.10 Консультация по заданию I, объяснение темы II22.10 Консультация по заданию II5.11 Апелляция по заданиям I и II, объяснение темы III19.11 Консультация по заданию III, объяснение темыIV3.12 Консультация по заданию IV, апелляция позаданию III17.12 Апелляция по заданию IV, решение всехвопросов, проставление зачета (?)Задания по практикуму АСВК проверяются отдельно Выставляются дополнительные оценки Учитываются отдельно от оценок за машграф В случае вопросов к программе у проверяющихможет быть назначена апелляция на вечернеевремя (вместе с апелляцией по машграфу) По согласованию апелляция может проводиться иво время консультацийВсего 4 задания.
За каждое задание практикумавыставляется оценка от 0 до 5.◦ 0 – ничего не сделано◦ 5 – задание выполнено полностьюНа выполнение задания дается 3 недели. Междузаданиями перерывов нет. Опоздание штрафуется:первый день -0.5, за последующие дни -1, -2 ...В конце семестра подсчитываются полученные баллы◦◦◦◦15 баллов – отлично10-14 баллов – хорошо5-9 баллов – удовлетворительно< 5 баллов неудhttp://courses.graphics.cs.msu.ru/mod/assign/view.php?id=117 Состоит из двух частей Необходимо реализовать разделение GUI и логики:реализовать графический и консольный интерфейсбез дублирования кода Реализовать часть функционала в виде отдельныхмодулей-плагиновОбработка и совмещение каналов изображенияBGRЗагрузка и разделение изображения на цветовыеканалыУдаление рамок плёнки:◦ Детектор границ CannyФильтр Гаусса.Вычисление градиентов с помощью фильтра Собеля.Подавление немаксимумов.Отсечение по двум порогам: получение сильных и слабыхграниц. Отслеживание границ по гистерезису (поиск связныхкомпонент)◦ Найти линии рамки◦ Удалить рамкуЗагрузка и разделение изображения на цветовыеканалыУдаление рамок плёнки:◦ Детектор границ Canny◦ Найти линии рамки (выбирается второй максимум с края,обязательно применить подавление немаксимумов)◦ Удалить рамкуПоиск преобразования сдвига для совмещенияканаловПрименение фильтров постобработкиЗагрузка и разделение изображения на цветовыеканалыУдаление рамок плёнкиПоиск преобразования сдвига для совмещенияканалов:◦ выбрать подходящую метрику: кросс-корреляция илисреднеквадратичное отклонение◦ реализовать пирамиду изображений для ускорения(применить билинейную интерполяцию, бонус:бикубическая интерполяция)◦ Бонусы: поиск в регионе интереса, субпиксельная точностьПрименение фильтров постобработкиЗагрузка и разделение изображения на цветовыеканалыУдаление рамок плёнкиПоиск преобразования сдвига для совмещенияканаловПрименение фильтров постобработки◦◦◦◦◦Серый мирПовышение резкостиАвтоконтрастМедианная фильтрацияБаланс белого1.
Логика \ взаимодействие с пользователем(оконный и консольный интерфейс)2. Фильтр Гаусса, фильтр Собеля, билинейнаяинтерполяция - ядро алгоритма. Плагины: Фильтрыпостобработки, а также другие дополнительныефильтры (бонусы). Программа должна работать ибез плагинов, сообщив об ограниченнойфункциональности пользователю.повышается возможность повторногоиспользования модели возможность использовать несколькопредставлений (интерфейсов) для одной и той желогики приложения (модели) возможность раздельной разработки (2 человека),компиляции, обновления ядра и представления впроектеУдобно студентам АСВК (вам): пишите фильтры + делаете GUI. Ошибки приосвоении чего-то одного не влияют на другое.Придумана при разработке языка SmalltalkПассивная модель (структурноепрограммирование). Модель = данные, контроллеротвечает за логикуАктивная модель (ООП) — модель оповещаетпредставление об изменениях(подписка\оповещение).Модель: данные и методы, не связана свизуализациейПредставление: визуализация (GUI)Контроллер: обработка пользовательского ввода,обновление моделиМоdel-View-Presenter◦ Model - модель предметной области◦ Presenter - посредник, обрабатывает события от мыши иклавиатуры, содержит много логикиModel-View-ViewModel (связывание данных):Silverlight, Windows Presentation FoundationModel-View-AdapterКонтроллер – посредникВ классическом MVC между моделью ипредставлением существует поток данных внеконтроллера.
В MVA все общение ТОЛЬКО черезконтроллер.То, что описано в задании – модель.Консольный интерфейс – представление: выводсостояния программы на экран.Парсинг коммандной строки – контроллер\адаптер.GUI: Какой формы кнопочки, как представлятьдоступные фильтры: раскрывающимся списком,набором галочек\кнопок? – Представление.Что делать, если выбрана галочка «Серый мир»? –Контроллер\адаптер.QTVisual Studio .NETVisual Studio MFCWPFSilverlight…Собственный GUI OpenGL\DirectX Независимый программный модуль,подключаемый на этапе выполнения программыОбычно расширяет возможности приложения,иногда приложение может практически полностьюсостоять из сборных модулей (плагинов)Примеры приложений с такой архитектурой: FarManager, Mozilla Firefox, Microsoft Visual Studio,Notepad++, Adobe Photoshop …Работа с аудио и видео контентом в разныхформатахОбработка изображения с помощью фильтраСпам-фильтрыПлагины для CMSУлучшение качества и однородности кода• Четкая инкапсуляция деталей реализации за интерфейсами• Инкапсуляция сторонних библиотекУлучшение модульности проекта• В каждый момент времени идет работа с небольшим подмножеством файлов• Лучший способ организации больших проектовРадикальное уменьшение времени сборки• Не производится обработка внутренних заголовочных файлов для других компонент• Не требуется пересборка других компонентВозможность замены компонентов• Возможность обновления не всей программы, а только набора компонент• Возможность выбора из нескольких однотипных компонент (конфигурация)Возможность использования компонент с различными открытыми/закрытыми лицензиями• Таким образом можно использовать GPL-компоненты и раскрывать их код, не нарушая лицензииОбщий проект разделяется на набор компонентКомпоненты помещаются в отдельные DLLВ процессе выделения создаются интерфейсы,которые используется в основном проекте (SDK)DLL с компонентам подгружаются на этапевыполненияlibNAME.c (или .cpp)#include <dynamic.h>extern "C" int func_name() //импортируемая функция{cout<<"Hello world!\n I'm function hello()"<<endl;return 0;}Компиляция:gсс(++) -fPIC -c libNAME.cpp -o libNAME.oПолучение разделяемого модуля:gсс(++) -shared –o libNAME.so libNAME.oМожно определить _init() и _fini() (зарезервированные имена).main.c (или .cpp)#include <dlfcn.h> //этот заголовок содержит интерфейс функций для подключениябиблиотеки…void *handle = dlopen(«libNAME.so",FLAG); //загружает в память библиотеку с именемlibNAME.soint(*fun)(void) = dlsym(handle,“func_name"); //возвращает указатель на импортируемуюфункцию func_name…int x = (*fun)(); //пример вызова импортированной функции…dlclose(handle); //библиотека выгружается из памяти…Компиляция: gсс(++) -ldl main.c// myfirstdll.c#include <stdio.h>// Ключевое слово __declspec(dllexport) делает функцию экспортируемой__declspec(dllexport) void func_name(char *str){…}// DynCall.c#include <windows.h>// Загружаем MyFirstDLLHINSTANCE h=LoadLibrary("MyFirstDLL.dll");//получаем указатель на функциюvoid (*DllFunc) (char *str) = (void (*) (char *str)) GetProcAddress(h,“func_name");// Вызов функции Demo из DLLDllFunc("Test");// Выгрузка динамической библиотеки из памятиFreeLibrary(h);…Обычные DLL связываются наэтапе компиляцииКомпоненты подгружаются вовремя выполнения в два этапа:• Поиск всех компонент (вопределенном каталоге)• Регистрация найденных компонент вопределенном месте системыDLL:◦ IPlugin *createInstance(const char *);Application:◦ IPlugin* pluginInstance = createInstance(“RendererPlugin”);◦ IRenderer* renderer = dynamic_cast<IRenderer>(pluginInstance)Одно из трех:◦ Нарушается безопасность типов static_cast◦ Ограничивается применение плагинов dynamic_cast◦ Необходима разработка сложной и ломкой кастомной RTTI QueryInterfaceНеобходимы дополнительные соглашения дляпоиска однотипных плагинов (по имени, например)Интерфейсы определяется в приложенииДля интерфейсов применяются соглашения COM(С++ интерфейс = АТД)Плагины регистрируются сами в нужном местесистемыApplication:DLL:Система разрабатывается с нуля дляподдержки плагиновА нужно ли поддерживать возможность работы изразных сред?Версии интерфейсов / библиотекСуперклассы - да/нетПриведение типовПодсчет ссылокКак искать плагины?СобытияСпецификация Microsoft для любого ЯПОО модель: инкапсуляция, наследование,полиморфизмКлиент и компонент, взаимодействие черезинтерфейс (набор функций)Идентификация по GUID ( Globally Unique IDentifier)– в реестреЛюбой интерфейс – производный от IUnknown.Минимум 3 метода:QueryInterface(), AddRef(),Release() .Если нет требований, чтобы плагины и/илиосновное приложение работали из разных сред,нет смысла поддерживать соглашения COM.
Ненужны STDMETHODCALLTYPE, BSTR и т.п.Можно выделять и удалять память в разных DLL(это стоит проверить)Более того: можно использовать набор базовыхнеабстрактных классов и подключать общуюбиблиотеку ко всем плагинам◦ Внимание: но нужно очень четко работать с версиями вэтом случае!Проверять версии◦ 1) У библиотеки (DLL)◦ 2) У плагина (интерфейса)Как проверять?Как поддерживать совместимость?◦ Старые плагины должны работать с новымиинтерфейсами?◦ Новые плагины должны работать со старымиинтерфейсами?Суперкласс:◦ запрос на информацию без создания экземпляра◦ = статические функции◦ Накладные расходы на создание/поддержкуПриведение типов◦ Dynamic_cast◦ QueryInterfaceПодсчет ссылок◦ AddRef/ReleaseПеребор файлов в папкахКонфигурационный файл (XML)В реестре (пишется инсталлятором)Предложить указать путь пользователюКак минимум должно быть 2 плагина, любой фильтр постпроцессингаи любой бонус должен быть в плагинеМожно вынести фильтр Гаусса, фильтр Собеля, фильтр Canny вотдельные компоненты (тогда базовая часть – разбить картинку на 3канала)Допускается (но будут накладные расходы на виртуальность)class IFilter{virtual tuple<uint, uint, uint> operator () (const Image &m) const = 0;}class BoxFilterOp: IFilter {…}Альтернатива: определить другой объемлющий фильтр над MatrixАльтернатива: не использовать шаблон, использовать свои илибиблиотечные классы для работы с изображением14 октября – крайний срок без потери балловСдавать только на сайт, только в курс практикумаЗа реализацию разделения логики и интерфейса(при выполнении требований) дается 2 балла, зареализацию плагинов (при выполнениитребований) 3 баллаЕсли часть требований не выполнена, оценкаснижаетсяДробные баллы не ставятсяВопросы – на следующем занятии (8 октября) и нафоруме к заданию.