Russian Qt Forum
Ноябрь 24, 2024, 03:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Паттерны проектирования для проектов на Qt  (Прочитано 31271 раз)
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


Просмотр профиля
« Ответ #15 : Апрель 26, 2014, 13:29 »

Да я уже говорил, тут нужно из разряда читателя переходить уже в разряд писателя, писателя на C++. Улыбающийся
Как я могу разрабатывать средние и сложные приложения без уверенного знания паттернов? Улыбающийся

Можно до всего допереть своими мозгами, не зная, что то, что ты придумал и написал - это ваще какой-то паттерн, оказывается.

Паттерны, кроме прочего, я бы сказал, что очень важны при работе в команде. Чтобы каждый раз не объяснять что мол "вот здесь захерячь такую-то фигню", можно сказать "здесь примени декоратор, а тут выпили синглтон, ибо юнит-тестам мешает и вообще нахер нам этот глобальный объект тут"
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #16 : Апрель 26, 2014, 14:00 »

Обращаюсь к тем, кто активно использовал и использует паттерны проектирования на практике. Напишите, пожалуйста, названия паттернов с которыми вы работали. Если есть ссылочка под рукой с хорошей статьёй или туториалом, то укажите, пожалуйста.
Когда-то баловался этим Улыбающийся. Подробно об используемых в Qt паттернах написано в книге "An Introduction to Design Patterns in C++ with Qt 4".
Записан

Пока сам не сделаешь...
Hrundel
Гость
« Ответ #17 : Апрель 26, 2014, 15:31 »

Подробно об используемых в Qt паттернах написано в книге "An Introduction to Design Patterns in C++ with Qt 4".

Или здесь  Подмигивающий
« Последнее редактирование: Апрель 26, 2014, 15:32 от Hrundel » Записан
8Observer8
Гость
« Ответ #18 : Апрель 27, 2014, 08:05 »

Спасибо за ссылки! Я начинаю понимать, что не надо всё подряд читать. Ибо книг море. А важно, для глубокого понимания, иметь сразу много разных источников и сравнивать: в одном месте тема лучше раскрыта, а в другом - другая. Хотя некоторые книги достойны быть прочитанными от корки до корки... Некоторые сразу, а некоторые постепенно, пока какие-то моменты не будут доведены до автоматизма.

В этой книге "An Introduction to Design Patterns in C++ with Qt 4" я нашёл пример "CardGame" Улыбающийся Это Божий Промысел Улыбающийся
Записан
8Observer8
Гость
« Ответ #19 : Апрель 27, 2014, 08:33 »

Мне всё равно никуда уже не деться от изучения всех паттернов Улыбающийся Думаю, стоит потратить время, чтобы изучить досконально все паттрены. Конечно хорошо бы учиться применять это на практике. Здесь вижу единственный вариант: заучивать примеры из книг и развивать их, фантазиваровать. А паттернов не так уж и много Улыбающийся

Широко ли используется сейчас идиома невиртуального интерфейса (NVI) в индустрии разработки ПО для реализации паттерна "Шаблонный метод"?

Ответ на этот вопрос здесь: http://www.e-reading.ws/chapter.php/1002058/88/Mayers_-_Effektivnoe_ispolzovanie_CPP.html

Вот он ответ:
Цитировать
Идиома NVI – это интересная альтернатива открытым виртуальным функциям, но с точки зрения проектирования она дает не слишком много. В конце концов, мы по-прежнему используем виртуальные функции для вычисления жизненной силы каждого персонажа. С точки зрения проектирования гораздо более сильным было бы утверждение о том, что вычисление жизненной силы персонажа не зависит от типа персонажа, что такие вычисления вообще не являются свойством персонажа как такового. Например, мы можем потребовать, чтобы конструктору каждого персонажа передавался указатель на функцию, которая вызывалась бы для вычисления его жизненной силы:

Ещё, судя из правила выше, место реализации паттерна "Шаблонный метод" (через идиому невиртуального интерфейса) предлагается другой паттерн - "Стратегия". Из-за того, что в данной задаче более логично указывать функцию вычисления жизненной силы при создании объекта, то есть передавать указатель на функцию в конструкторе и\или же менять функцию вычисления жизненной силы с помощью void setHealthCalculator( HealthCalcFunc hcf ). Это повышает гибкость. Теперь функция вычисления жизненной силы не зависит от типа объекта и её можно менять во время исполнения.

Правда теперь мы лишили себя возможности "выполнять предварительные действия" и "выполнять завершающие действия". Хотя мы эти "действия" притягиваем за уши в данном примере. Тут очевидно паттерн "Стратегия" - лучше.

Как я понял - открытые виртуальные функции это плохо если мы хотим проводить какие-то инициализирующие операции до вызова переопределяемого метода и проводить какие-то завершающие операции после вызова.

Как мне кажется, когда говорят, что мы применяем "Шаблонный метод", то имеется ввиду, что мы применяем идиому NVI. Или NVI - это уже только для C++?

Здесь приведена реализация паттерна «Стратегия» посредством указателей на функции: http://www.e-reading.ws/chapter.php/1002058/88/Mayers_-_Effektivnoe_ispolzovanie_CPP.html

Повысилась гибкость (это цитаты по ссылке выше):
- Разные экземпляры персонажей одного и того же типа могут иметь разные функции вычисления жизненной силы.
- Функция вычисления жизненной силы для одного и того же персонажа может изменяться во время исполнения. Например, класс GameCharacter мог бы предложить функцию-член setHealthCalculator, которая позволяет заменить текущую функцию вычисления жизненной силы.

На этом примере более или менее понятно почему мы перешли от паттерна "Шаблонный метод" к паттерну "Стратегия". Надеюсь, что это можно будет применить где-то ещё Улыбающийся

Я сделал пример реализации более наглядным. В файле main.cpp сначала создаю персонажа класса Player и монстра класса EvilBadGay. У них функция вычисления жизненной силы - по умолчанию. Потом меняю им функции с помощью метода базового класса: void setHealthCalculator( HealthCalcFunc hcf )

main.cpp
Код
C++ (Qt)
#include <iostream>
#include "Player.h"
#include "EvilBadGay.h"
#include "functionsForHealthCalc.h"
 
int main() {
   GameStuff::Player player(std::string("David"));
   GameStuff::EvilBadGay monster(std::string("Black"));
 
   std::cout << "Name: " << player.name( ) << std::endl;
   std::cout << "Health Value: " << player.healthValue( ) << std::endl;
   std::cout << std::endl;
 
   std::cout << "Name: " << monster.name( ) << std::endl;
   std::cout << "Health Value: " << monster.healthValue( ) << std::endl;
   std::cout << std::endl;
 
   // Change health functions
   player.setHealthCalculator(GameStuff::loseHealthSlowly);
   monster.setHealthCalculator(GameStuff::loseHealthQuickly);
 
   std::cout << "After changing health functions:" << std::endl;
   std::cout << std::endl;
 
   std::cout << "Name: " << player.name( ) << std::endl;
   std::cout << "Health Value: " << player.healthValue( ) << std::endl;
   std::cout << std::endl;
 
   std::cout << "Name: " << monster.name( ) << std::endl;
   std::cout << "Health Value: " << monster.healthValue( ) << std::endl;
 
   return 0;
}
 

Output:
Цитировать
Name: David
Health Value: 1

Name: Black
Health Value: 1

After changing health functions:

Name: David
Health Value: 2

Name: Black
Health Value: 3

Весь код примера: https://github.com/8Observer8/pattern_StrategyByFuncPointers
« Последнее редактирование: Апрель 27, 2014, 08:41 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Апрель 27, 2014, 09:19 »

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

http://insidecpp.ru/antipatterns/

Многие из них ТС уже успешно освоил  Улыбающийся
Записан
8Observer8
Гость
« Ответ #21 : Апрель 27, 2014, 09:31 »

Спасибо за ссылку. А где конкретно я напортачил? Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #22 : Апрель 27, 2014, 09:43 »

А где конкретно я напортачил? Улыбающийся
Не знаю где напортачили вы, т.к. вы еще ничего не сделали, а вот Igors многие из них усвоил и использует в повседневной жизни. Улыбающийся
http://insidecpp.ru/antipatterns/reinventing_the_wheel/
http://insidecpp.ru/antipatterns/blob/
http://insidecpp.ru/antipatterns/premature_optimization/
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Апрель 27, 2014, 17:25 »

Не знаю где напортачили вы, т.к. вы еще ничего не сделали, а вот Igors многие из них усвоил и использует в повседневной жизни. Улыбающийся
http://insidecpp.ru/antipatterns/reinventing_the_wheel/
http://insidecpp.ru/antipatterns/blob/
http://insidecpp.ru/antipatterns/premature_optimization/
Ну не без этого, а колесо вообще мой любимый Улыбающийся  Ну неинтересно мне, подобно девочке-отличнице, что-то усердно заучивать, а интересно самому что-то придумать. А Ваши какие любимые?  Улыбающийся
Записан
8Observer8
Гость
« Ответ #24 : Апрель 27, 2014, 17:57 »

Я нашёл описание паттернов с примерами в книге на русском: "Быстрая разработка программного обеспечения" http://rutracker.org/forum/viewtopic.php?t=905917

В этой книге есть параграф, который вынесен отдельно в содержании - "Перечень шаблонов проектирования". В этом перечне указаны названия паттернов с номером страницы. Написано кратко, но с разбором рабочих примеров. Примеры на Java и C++.

Такие паттерны приведены в перечне:
- Abstact Server
- Active Object
- Acyclic Visitor
- Adapter
- Bridge
- Command
- Composite
- Decorator
- Extension Object
- Facade
- Factory
- Mediator
- Monostate
- Null Object
- Observer
- Proxy
- Singleton
- Stairway to Heaven
- State
- Strategy
- Taskmaster
- Template Metod
- Visitor
« Последнее редактирование: Апрель 27, 2014, 18:01 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #25 : Апрель 27, 2014, 18:05 »

Ну неинтересно мне, подобно девочке-отличнице, что-то усердно заучивать
Это правильно, заучивать НЕ неинтересно, а не эффективно. Применить заученное вряд ли получиться.

а интересно самому что-то придумать.
К сожалению, без знаний можно придумывать только ерунду.

А Ваши какие любимые?  Улыбающийся
Да как то я к ним таких нежных чувств не испытываю. Улыбающийся

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Апрель 27, 2014, 18:27 »

К сожалению, без знаний можно придумывать только ерунду.
Ну так 8Observer8 следует именно этому правилу - знания, знания и знания. И он добился больших успехов - он действительно знает уже очень, очень много. Так почему же Вам этот процесс так упорно не нравится ?  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #27 : Апрель 27, 2014, 18:36 »

он действительно знает уже очень, очень много.
Вы правда так думаете?  Строит глазки
Мне кажется, что за метаниями от темы к теме, он уже ничего изучать не успевает.
Вот же последняя тема: http://www.prog.org.ru/topic_26931_0.html
Уперся, задал вопрос, получил ответ и забыл разобраться. Улыбающийся

P.S. Если 8Observer8 для вас знает "очень, очень много", то ... Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Апрель 27, 2014, 18:55 »

Мне кажется, что за метаниями от темы к теме, он уже ничего изучать не успевает.
А Вы? Чего-то успеваете? Ведь Вы же изучаете "все новое" - где уж там успеть  Улыбающийся

P.S. Если 8Observer8 для вас знает "очень, очень много", то ... Подмигивающий
Да, "слишком много" Улыбающийся Спокойнее относитесь к др точке зрения - может быть она имеет смысл...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #29 : Апрель 27, 2014, 19:12 »

А Вы? Чего-то успеваете?
Конечно.
Вы неадекватно воспринимаете изучение, наверное, из-за того что давненько этим не занимались. Улыбающийся
Изучение это приятный и не обременительный процесс. Вот например, где нибудь я сталкиваюсь с информацией по какому то проекту в интересной для меня области.
Скажем это библиотека. Я захожу на их сайт и первым делом смотрю примеры использования. Для меня, в первую очередь интересен, ее интерфейс с внешним миром. Если интерфейс адекватный, то я качаю ее исходники и выборочно смотрю внутренности. Если мне нравится, то я могу подробно на нее посмотреть, написать тесты, погонять/попробовать. Соответственно, у меня в голове откладывается информация, что есть такой проект и его можно использовать для этого или этого. Плюс, если код действительно интересный, то можно выхватить из него интересные решения или подходы.
Вот и все. Этим я занимаюсь в свободное время, когда я не программирую, а что то обдумываю.

P.S. Вот так же и с бустом, когда выходит новая версия, я смотрю, что нового там появилось и думаю где я могу это применить. Смотрю примеры, пишу тесты, сравниваю и т.д. А если возникает эта необходимость, то я сажусь за библиотеку подробней, разбираюсь и начинаю использовать.

Ведь Вы же изучаете "все новое" - где уж там успеть  Улыбающийся
Как врач, должен учится всю жизнь, как учитель, так и программист просто обязан... Улыбающийся
Грустно, что это вызывает у вас улыбку. Грустный





« Последнее редактирование: Апрель 27, 2014, 19:18 от Old » Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.19 секунд. Запросов: 23.