Название: Как правильно реализовать? Отправлено: XpycT от Август 30, 2009, 12:37 Всем привет.
Есть у меня приложение, которое является клиентом для трекера. На данный момент работает только с TBDev Yuna Edition. Хотелось бы добавить поддержку других типов трекеров (XBT,Btit,TorrentPier и т.п.), и думаю оформить это в виде динамических библиотек. Вопрос вот в чем: Предположим при запуске(и в настройках) приложения я сделаю,например, QComboBox, и зависимо от его выбора будет использоваться нужный набор запросов к серверу и их обработка. Вот не совсем понимаю как это реализовывать. Это мне надо создавать классы с одинаковой структурой или как? Почему-то в голову кроме как switch'a ничего не приходит: Код Кажется мне что я думаю не в том направлении, может кто подскажет как лучше сделать :-\ Название: Re: Как правильно реализовать? Отправлено: BlackTass от Август 30, 2009, 12:59 Ну наиболее логичным вариантом будет создать pure virtual базовый класс и сделать кучку его наследников (по одному на каждый трекер). И соответственно при смене селекшена в вашем комбобоксе вы будете подменять объект работы с трекером (предварительно убив старый и инциализировав новый).
К вопросу о том как создавать новый инстанс нужного нам типа. Можно через тот же свитч; можно завести в базовом классе енум, который будет отображать все множество наследников (хотя мне такой вариант не очень нравится, он нарушает основы ООП, так как предок будет знать о потомках; лучше сделать еще один класс (вне иерархии классов для трекеров), который будет хранить этот енум и отдавать нужный инстанс наследников нашего базового класса); можно работать по какому-либо более тяжелому ключу, чем просто инт (например по некоему строковому ключу). В последнем случае можно сделать копию иерархии классов для трекеров, которая будет нести чисто утилитный смысл - отдавать нужный инстанс и уже инстансы утилитных классов хранить в ассоциативном массиве или еще в какой-нить структуре. Я это к чему :) Вариантов решения проблемы много. Название: Re: Как правильно реализовать? Отправлено: SABROG от Август 31, 2009, 14:50 Предположим при запуске(и в настройках) приложения я сделаю,например, QComboBox, и зависимо от его выбора будет использоваться нужный набор запросов к серверу и их обработка. По идее можно вынести в базовый класс общий функционал для всех трекеров. Методы, которые должны работать несколько иначе в зависимости от версии трекера сделать виртуальными. Затем унаследоваться от этого класса и реализовать несколько вариантов с которыми ты умеешь работать. В combobox (или в какую-нибудь структуру settings) можно поместить ссылку/указатель на объект подобного класса и вызывать его методы. Можно конечно воспользоваться еще шаблонами, но это дублирование кода. Кстати, а нужен ли этот комбобокс вообще? Программа может автоматически определять версию трекера? Название: Re: Как правильно реализовать? Отправлено: XpycT от Август 31, 2009, 18:47 Цитировать Кстати, а нужен ли этот комбобокс вообще? Программа может автоматически определять версию трекера? Дело в том что начальная версия проги работала через некий PHP-API, но в данный момент я пытаюсь полностью от него оказаться. Единственный вариант определения типа трекера я вижу только получения какой-то страницы, ее парсинг и выдерку некой информации, которая есть только в данном типе трекера. Ясно что с api это намного проще - но тогда использование клиента становится реально только при условии установки данного api владельцем трекера :)В принципе попробую базовым классом, Но сегодня разбирал структуру TorrentPier и понял что наследованием от базового класса не обойтись, ну или в крайнем случае придется его сильно "раздуть" :( . Название: Re: Как правильно реализовать? Отправлено: XpycT от Сентябрь 01, 2009, 13:22 Возникла проблемка, почему-то QMap передается только со второго раза. Получается у меня виртуальный класс :
Код и его наследник *.h Код в *.cpp получаю категории и заполняю catmap Код а в основном приложении при клике на кнопку беру карту и заполняю с нее комбобокс Код
Но вот почему-то он заполняется только после второго клика, а на первом карта остается пустой :( Название: Re: Как правильно реализовать? Отправлено: Alex Custov от Сентябрь 01, 2009, 14:29 у тебя virtual QMap<int,QString> returnCategory() и QMap<int,QString> catmap; дублируются в базовом классе и наследнике. Оставь только в базовом классе.
Название: Re: Как правильно реализовать? Отправлено: XpycT от Сентябрь 01, 2009, 15:32 у тебя virtual QMap<int,QString> returnCategory() и QMap<int,QString> catmap; дублируются в базовом классе и наследнике. Оставь только в базовом классе. Спасибо, помогло :) |