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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Паттерны проектирования для проектов на Qt  (Прочитано 31256 раз)
8Observer8
Гость
« Ответ #30 : Апрель 27, 2014, 19:47 »

Помогите, пожалуйста, разобрать и усвоить все паттерны из предыдущего моего сообщения. Я буду переписывать примеры, развивать их, а вы контролируйте меня. По ходу будет возникать много вопросов Улыбающийся

На данный момент, я усвоил два паттерна: паттерн "Шаблонный метод" и паттерн "Стратегия".

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

Для реализации функции вычисления жизненной силы лучше всего подойдёт паттерн "Стратегия". С его помощью мы можем менять функцию вычисления жизненной силы во время выполнения программы с помощью этого метода:
Код
C++ (Qt)
void setHealthCalculator( HealthCalcFunc hcf ) {
   healthFunc = hcf;
}
 
Ссылка: http://www.e-reading.ws/chapter.php/1002058/88/Mayers_-_Effektivnoe_ispolzovanie_CPP.html

Вот здесь описана более универсальная реализация паттерна "Стратегия" с помощью класса function (С++11) http://www.e-reading.ws/chapter.php/1002058/89/Mayers_-_Effektivnoe_ispolzovanie_CPP.html

Теперь мы можем задавать алгоритм вычисления жизненной силы не только с помощью передачи функции, но и с помощью передачи функциональных объектов и методов других классов. Главное чтобы сигнатура вызываемой сущности была совместимой с заданной, то есть чтобы параметр можно было неявно преобразовать в const GameCharacter&, а тип возвращаемого значения неявно конвертировать в int. Причём реализация паттерна "Стратегия" с помощью указателя на функцию и реализация паттерна "Стратегия" с помощью класса function отличаются только одной строкой в классе GameCharacter. В первом случае:
Код
C++ (Qt)
typedef int (*HealthCalcFunc)(const GameCharacter&);
 

Во втором случае:
Код
C++ (Qt)
typedef std::function<int (const GameCharacter&)> HealthCalcFunc;
 

Вот такие сущности мы можем теперь применять для вычисления жизненной силы:
Код
C++ (Qt)
#ifndef FUNCTIONS_FOR_HEALTHCALC_H
#define FUNCTIONS_FOR_HEALTHCALC_H
 
namespace GameStuff {
 
   class GameCharacter; // опережающее объявление
 
   /**
    * Функции вычисления жизненной силы; она возвращает не int
    */

   short calcHealth( const GameCharacter& gc );
 
   /**
    * Класс функциональных объектов, вычисляющих жизненную силу
    */

   struct HealthCalculator {
 
       int operator()(const GameCharacter&) const {
           return 5;
       }
   };
 
   /**
    * Функция алгоритма по умолчанию для вычисления жизненной силы персонажа
    */

   int defaultHealthCalc( const GameCharacter& gc );
 
   /**
    * Функции вычисления жизненной силы с другим поведением
    */

   int loseHealthQuickly( const GameCharacter& gc );
 
   /**
    * Функции вычисления жизненной силы с другим поведением
    */

   int loseHealthSlowly( const GameCharacter& gc );
}
 
#endif // FUNCTIONS_FOR_HEALTHCALC_H
 

Исходный код реализации паттерна "Стратегия" с помощью класса function: https://github.com/8Observer8/pattern_StrategyByFunctionClass
« Последнее редактирование: Апрель 27, 2014, 19:50 от 8Observer8 » Записан
Hrundel
Гость
« Ответ #31 : Апрель 27, 2014, 23:33 »

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

Прости, Игорь, но тут я не могу не поддержать Old. Информатики должны всю жизнь учится чему-то новому потому, что мы выбрали профессию, которая безостановочно развивается, и нужно обязательно идти в ногу, или не будешь востребован на рынке. (Конечно, не во все стороны одновременно развиваться, а углублять специализацию).
Записан
Bepec
Гость
« Ответ #32 : Апрель 28, 2014, 00:42 »

90% врачей не учатся ничему новому) На себе испытано, 5 операций Веселый
А вот насчёт всё знать - это плохо. Потому что глубоко знать не получится. А поверхностное представление даст только возможность пускать пыль в глаза.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Апрель 28, 2014, 06:59 »

А вот насчёт всё знать - это плохо.
А кто говорит насчет знать все? Вы наверное плохо представляете объемы уже накопленных знаний только по нашей отрасли... А вообще всё.... Улыбающийся

Потому что глубоко знать не получится.
Есть такое понятие - эрудиция. А уровень знаний всегда можно углубить до нужного состояния, если появиться такая необходимость и возникнет желание.

А поверхностное представление даст только возможность пускать пыль в глаза.
К сожалению поверхностное представление не мешает огромной куче людей заниматься программированием, так сказать "профессионально". Отсюда имеем миллионы глючный тормозящих огромных программ. Но так дешевле, а значит будем дальше с этим жить. Улыбающийся
« Последнее редактирование: Апрель 28, 2014, 07:37 от Old » Записан
8Observer8
Гость
« Ответ #34 : Апрель 28, 2014, 07:11 »

Я считаю, что ничего лишнего я не усваивал. TDD-тесты - неотъемлемая часть современной программной инженерии. Паттерны тоже. Так же документация doxygen - хороший выбор. Я чуть-чуть пощупал геометрию на OpenGL и физику на Bullet. Это просто хобби. Какие-нибудь кубики пороняю, посталкиваю предметы, может ещё что придумаю. Может сделаю простую игру, где персонаж сможет перемещаться в 3D пространстве. Но это так, для души. Ну, а без PHP и jQuery современному разработчику, я считаю, сейчас никуда. Так как некоторые решения лучше всего делать не настольным приложением, а размещать в интернете. Разработчик выбирает подходящее решение.

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

А сейчас надо паттерны усвоить. Всё равно этот путь придётся пройти...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Апрель 28, 2014, 09:04 »

.. и нужно обязательно идти в ногу, или не будешь востребован на рынке. (Конечно, не во все стороны одновременно развиваться, а углублять специализацию).
Ну с этим трудно не согласиться. Но на мой взгляд 8Observer8 - отличный пример интенсивного, но совершенно бесполезного изучения Улыбающийся За таким изучением дело до написания хоть какой-то программы не доходит. Собственно писать он ничего и не хочет, а полагает достаточно будет  просто применить "знания" - и все напишется само собой. Но почему-то мне кажется что этого не произойдет Улыбающийся Ну вот хз как можно было после тщательного изучения исключений спороть такое:
Код
C++ (Qt)
               bool ok;
               float x = listForPoints[1].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float y = listForPoints[2].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               float z = listForPoints[3].toFloat( &ok );
               if ( !ok ) {
                   throw( BadLine( list[i].toStdString(), i ) );
               }
 
               points.append( QVector3D( x, y, z ) );
           } else {
               throw( BadLine( list[i].toStdString(), i ) );
           }
 
Вот он, "не ленивый" программист, copy/paste и все дела. И ведь даже не шевельнулась мысль "как обобщить". Что же дало такое "изучение"? Да ничего. Изучалась-то форма, а не содержание.

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

Сообщений: 4350



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

И ведь даже не шевельнулась мысль "как обобщить".
А у вас сразу шевелилась?
Легко требовать от кого-то понимания того, что уже понял сам.
Эти мысли начинают "шевелится" со временем, после получения достаточного опыта кодирования. А ТС кодированием еще не занимался вообще.
Записан
8Observer8
Гость
« Ответ #37 : Апрель 28, 2014, 09:48 »

Да, опыта кодирования мне действительно не хватает Улыбающийся Буду теперь каждый день, как можно больше пальчиками работать Улыбающийся Кстати, советую вот эту программу для развития слепого десятипальцевого метода набора: "Соло на клавиатуре" http://ergosolo.ru/

Реальные знание это те, которые регулярно применяешь на практике, которые доведены до автоматизма. Думаю, надо стремиться расширять свой "несгораемый запас" Улыбающийся

Но обзорно я всё же рассмотрю паттерны до конца. Авось, что-то в памяти всплывёт и пригодится Улыбающийся
« Последнее редактирование: Апрель 28, 2014, 09:51 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Апрель 28, 2014, 10:39 »

Эти мысли начинают "шевелится" со временем, после получения достаточного опыта кодирования. А ТС кодированием еще не занимался вообще.
Не "кодирования" а "программирования", и собственно все остальное (чем так активно занимается ТС) - вещи побочные, они всего лишь помогают/облегчают. Нет главного - самого программирования, все "вокруг да около"
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #39 : Апрель 28, 2014, 10:48 »

Те мысли, о которых вы сокрушались, шевелятся именно при кодировании, никакого программирования там нет. Хотя нужно определиться, что считать программированием, а что кодированием.
Записан
Bepec
Гость
« Ответ #40 : Апрель 28, 2014, 11:38 »

Кодируют алкоголиков. Программируют приложения. Как бы это странно не звучало Веселый

offtop: для десятипальцевого набора предлагаю метод - взяться за крупный проект в качестве "ученика" у кого-нибудь.  Или же пойти в фирму на минимальный оклад. Собственно именно при работе (будь то на дядю или на себя программируешь) формируются знания и понимание чего тебе надо.
Записан
OKTA
Гость
« Ответ #41 : Апрель 28, 2014, 11:47 »

Кодируют алкоголиков. Программируют приложения. Как бы это странно не звучало Веселый

offtop: для десятипальцевого набора предлагаю метод - взяться за крупный проект в качестве "ученика" у кого-нибудь.  Или же пойти в фирму на минимальный оклад. Собственно именно при работе (будь то на дядю или на себя программируешь) формируются знания и понимание чего тебе надо.

Или приходишь в любой научный институт и говоришь - хлебом не кормите дайте программку написать - сразу завалят. особенно если к дедушкам подходить  Смеющийся На своем опыте исследовано  Смеющийся
Записан
8Observer8
Гость
« Ответ #42 : Апрель 28, 2014, 11:58 »

Я считаю, что брать работу надо у тех кто занимается инженерным программированием. А наши "дедушки"-учёные - это ближе к Кнуту. Там мне точно не выжить. Мне нравится направление Agile: http://www.agilealliance.org/ Вот к этим дедушкам я бы подошёл Улыбающийся
Записан
OKTA
Гость
« Ответ #43 : Апрель 28, 2014, 12:32 »

В научных институтах дедушки это те, кто будет давать тебе задания, а не те, кто будет тебя учить  Смеющийся в программировании они сами не бум-бум  Смеющийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Кодируют алкоголиков.
Ну тут от предметной области зависит. Улыбающийся
У разработчиков ПО: программирование это составление алгоритмов решения задачи, а кодирование это описание алгоритма на конкретном языке программирования.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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