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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Паттерны проектирования для проектов на Qt  (Прочитано 31272 раз)
8Observer8
Гость
« : Апрель 25, 2014, 15:21 »

Привет!

Обращаюсь к тем, кто активно использовал и использует паттерны проектирования на практике. Напишите, пожалуйста, названия паттернов с которыми вы работали. Если есть ссылочка под рукой с хорошей статьёй или туториалом, то укажите, пожалуйста.

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

Если это возможно, то опишите подробно своими словами, какой-нибудь паттерн, который вы уже хорошо знаете, любите и применяете. Или какой-нибудь сами придумали, или кто-то придумал, а вы находили статью.

Может есть какие-то специальные паттерны для проектов на Qt? Может специфика сигнал-слотового взаимодействия между объектами накладывает свой отпечаток на паттерны?

P.S. Нашёл вот такую книжку, но для меня она пока тяжеловата: "Гамма Э. и др. - Приемы объектно-ориентированного проектирования. Паттерны проектирования - 2010"

Заранее спасибо за ответы!
Записан
Bepec
Гость
« Ответ #1 : Апрель 25, 2014, 15:32 »

offtop: сразу вспоминается анекдот про зоологов. Когда зоолог помнил названия всех всех зверей, но не помнил как они выглядят Веселый
Записан
OKTA
Гость
« Ответ #2 : Апрель 25, 2014, 15:50 »

Злой ты Верес  Смеющийся
Записан
8Observer8
Гость
« Ответ #3 : Апрель 25, 2014, 16:21 »

offtop: сразу вспоминается анекдот про зоологов. Когда зоолог помнил названия всех всех зверей, но не помнил как они выглядят Веселый
Такие звери как: класс, метод, исключение, полиморфизм, наследования и т.д. мне уже знакомы. Теперь хочется начать узнавать более крупных Улыбающийся
Записан
OKTA
Гость
« Ответ #4 : Апрель 25, 2014, 17:05 »

Паттерны изучать бессмысленно без практики. Советую сначала провести себе обзорную экскурсию по основным паттернам (хоть по вики), чтобы просто знать какие существуют и когда какие используются - не более. А когда в голове поверхностная информация будет лежать, на практике эти знания сами всплывут и тогда уже будешь изучать конкретный паттерн. Иначе эти знания как влетят, так и вылетят  Подмигивающий

P.S. И быть знакомым со зверями - мало - надо уметь их приручить  Подмигивающий
Записан
vipet
Бывалый
*****
Offline Offline

Сообщений: 452


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

паттерны - это сейчас маст-хэв для senior c++ девелопера, и тем более для архитектора

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

в качестве первой книги рекоммендую http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124/
книга "банды четырех" может быть трудновата для новичка, но ее тоже надо прочитать и осмыслить
Записан
OKTA
Гость
« Ответ #6 : Апрель 25, 2014, 17:11 »

паттерны - это сейчас маст-хэв для senior c++ девелопера, и тем более для архитектора

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

в качестве первой книги рекоммендую http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124/
книга "банды четырех" может быть трудновата для новичка, но ее тоже надо прочитать и осмыслить

Она на русском кстати есть, я в озоне покупал - офигенно написана  Смеющийся
Записан
8Observer8
Гость
« Ответ #7 : Апрель 25, 2014, 19:32 »

Спасибо за книжку! Улыбающийся

Решил для начала разобраться с частным случаем паттерна "Шаблонный метод", который реализован с помощью идиомы невиртуального интерфейса. Вот здесь подробно написано:
- http://www.e-reading.ws/chapter.php/1002058/86/Mayers_-_Effektivnoe_ispolzovanie_CPP.html
- http://www.e-reading.ws/chapter.php/1002058/87/Mayers_-_Effektivnoe_ispolzovanie_CPP.html

Этот паттерн часто ли используется в таком виде?

Там написано про какие-то "инварианты класса". Что это такое?

Как там написано (если я правильно понял), смысл в том, что в базовом классе находится реализация по умолчанию виртуальной функции, которая объявляется закрытой или защищённой. А вызывается эта функция с помощью открытой невиртуальной (невиртуальные функции в C++ не переопределяют, так как это приводит к трудноуловимым ошибкам). Клиент при наследовании может переопределить закрутую виртуальную функцию.

Я в примере для класса Monster оставил doHealthValue() по умолчанию из класса GameCharacter. А для класса Player переопределил:

main.cpp
Код
C++ (Qt)
#include <iostream>
#include "Player.h"
#include "Monster.h"
 
int main( ) {
   Player p( "Player" );
   Monster m( "monster" );
 
   std::cout << p.name( ) << ": " << p.healthValue( ) << std::endl;
   std::cout << m.name( ) << ": " << m.healthValue( ) << std::endl;
 
   return 0;
}
 

Output:
Цитировать
Player: 2
Monster: 1

GameCharacter.h
Код
C++ (Qt)
#ifndef GAMECHARACTER_H
#define GAMECHARACTER_H
 
#include <string>
 
class GameCharacter {
public:
 
   GameCharacter( std::string name ) : m_name( name ) {
   }
 
   int healthValue( ) const {
       //...
       // выполнить предварительные действия
       //...
 
       // выполнить реальную работу
       int retVal = doHealthValue( );
 
       //...
       // выполнить завершающие действия
       //...
 
       return retVal;
   }
 
   std::string name( ) const {
       return m_name;
   }
 
private:
 
   virtual int doHealthValue( ) const { /* производные классы могут
                                        * переопределить эту функцию
                                        */

       // алгоритм по умолчанию для вычисления
       // жизненной силы персонажа
       return 1;
   }
 
   std::string m_name;
};
 
#endif // GAMECHARACTER_H
 

Monster.h
Код
C++ (Qt)
#ifndef MONSTER_H
#define MONSTER_H
 
#include "GameCharacter.h"
 
class Monster : public GameCharacter {
public:
 
   Monster( std::string name ) : GameCharacter( name ) {
   }
};
 
#endif // MONSTER_H
 

Player.h
Код
C++ (Qt)
#ifndef PLAYER_H
#define PLAYER_H
 
#include "GameCharacter.h"
 
class Player : public GameCharacter {
public:
 
   Player( std::string name ) : GameCharacter( name ) {
   }
 
private:
 
   int doHealthValue( ) const {
       return 2;
   }
};
 
#endif // PLAYER_H
 
« Последнее редактирование: Апрель 25, 2014, 19:34 от 8Observer8 » Записан
Hrundel
Гость
« Ответ #8 : Апрель 26, 2014, 02:19 »

offtop: сразу вспоминается анекдот про зоологов. Когда зоолог помнил названия всех всех зверей, но не помнил как они выглядят Веселый

 Смеющийся Смеющийся Смеющийся

P.S. И быть знакомым со зверями - мало - надо уметь их приручить  Подмигивающий

Уже жду, что скажет Old  Подмигивающий

Записан
8Observer8
Гость
« Ответ #9 : Апрель 26, 2014, 07:06 »

Какие у паттерна "Шаблонный метод" недостатки и приимущества?

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

Скачал ту книжку, что советовали выше. Потрясающее оформление: столько картинок, юмора, примеров! Буду параллельно пытаться читать книгу "банды четырёх" Улыбающийся

« Последнее редактирование: Апрель 26, 2014, 07:20 от 8Observer8 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Уже жду, что скажет Old  Подмигивающий
Да я уже говорил, тут нужно из разряда читателя переходить уже в разряд писателя, писателя на C++. Улыбающийся
Записан
8Observer8
Гость
« Ответ #11 : Апрель 26, 2014, 09:32 »

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

Сообщений: 4350



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

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

Достоинства паттернов, в том, что несколько человек сели и систематизировали многие интересные решения и приемы, дали им общеупотребительные названия и сложили в одном месте с примерами.
Записан
Bepec
Гость
« Ответ #13 : Апрель 26, 2014, 10:06 »

Это всё следствие от программирования. Тем программист и отличается от "учителя-теоретика по программированию".
Программист сначала напишет программу. Всё нормально, она работает. Он посмотрит на код - перепишет. Понадобится ещё что-то, допишет. И вот когда уже нехватает места и/или возможностей для расширения кода, тогда таки программист обращается к опыту других Улыбающийся

PS допустим вот итераторы, интерфейсы - изучены мной в ходе разработки пары программ. И да, настоящая программа переписывается как минимум 1 раз Веселый
Записан
Hrundel
Гость
« Ответ #14 : Апрель 26, 2014, 11:01 »

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

Легко! С помощью С++!

И да, настоящая программа переписывается как минимум 1 раз Веселый

Согласен. Сейчас как раз курсовой переписываю. Прототип уже превратился в рабочую программу, но архитектуры - ноль и в коде леший ногу сломит. Теперь переписываю то же самое, но структурированно и чисто.
« Последнее редактирование: Апрель 26, 2014, 11:05 от Hrundel » Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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