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

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

Страниц: 1 2 [3] 4 5 6   Вниз
  Печать  
Автор Тема: Этапы разработки ПО. Научите, как работает профессионал.  (Прочитано 39390 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

8Observer8, мне кажется или вы действительно занимаетесь совершенно всем, кроме программирования? Улыбающийся
Совершенно неважно как у вас появится игра Дурак, с техзаданием или без, главное что бы она появилась.
Вы тратите кучу времени на какие-то сопутствующее изыскания, вместо программирования. Улыбающийся
Программирование первично, все остальное вторично. Программируйте.
Все, что вы задумывали как первый этап, можно было за сегодня сделать. Если делать... Улыбающийся
Записан
8Observer8
Гость
« Ответ #31 : Апрель 19, 2014, 18:53 »

8Observer8, мне кажется или вы действительно занимаетесь совершенно всем, кроме программирования? Улыбающийся
Совершенно неважно как у вас появится игра Дурак, с техзаданием или без, главное что бы она появилась.
Вы тратите кучу времени на какие-то сопутствующее изыскания, вместо программирования. Улыбающийся
Программирование первично, все остальное вторично. Программируйте.
Все, что вы задумывали как первый этап, можно было за сегодня сделать. Если делать... Улыбающийся
Если честно я ещё не начал Улыбающийся Требования, ТЗ, подготовка, осмысление, настрой... в общем я устал... Завтра начну продумывать архитектуру Веселый

Надеюсь, до кодирования этой игры я всё же доберусь Веселый

P.S. Попробую этот проект через методологию TDD забацать. Хотелось бы сначала более чёткое ТЗ получить. В качестве документации будут модульные тесты, в количестве 1-2 для каждого метода, чтобы if-else - покрывали на 100%. Тесты будут передаваться заказчику в качестве: подтверждения работоспособности, тесты показывают как вызывать методы, заказчик сможет продемонстрировать свои требования, прислав мне новые тесты, под которые надо реализовать функционал. Без тестов же никак?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

P.S. Попробую этот проект через методологию TDD забацать. Хотелось бы сначала более чёткое ТЗ получить. В качестве документации будут модульные тесты, в количестве 1-2 для каждого метода, чтобы if-else - покрывали на 100%. Тесты будут передаваться заказчику в качестве: подтверждения работоспособности, тесты показывают как вызывать методы, заказчик сможет продемонстрировать свои требования, прислав мне новые тесты, под которые надо реализовать функционал. Без тестов же никак?
В одной хорошей старой книжке про это примерно так:
Цитировать
Подобные убеждения хоть и господствуют в умах теоретиков, но оказывают куда меньшее влияние на результат чем это принято думать
Улыбающийся
Напр не стоит мнить/надеяться что заказчик пришлет Вам тесты (или вообще что-то)
Записан
8Observer8
Гость
« Ответ #33 : Апрель 20, 2014, 07:48 »

Я решил хранить каждый класс в отдельном файле. А чтобы не было конфликтов имён, поместил каждый класс, который относится к игре, в пространство имён CardGame:
Код
C++ (Qt)
namespace CardGame {
   // ...
}
 

Card.h
Код
C++ (Qt)
#ifndef CARD_H
#define CARD_H
 
#include "string"
 
namespace CardGame {
 
   std::string suits[4] = {"Diamonds ", "Hearts ", "Spades ", "Clubs "};
   std::string cds[9] = {"6 ", "7 ", "8 ", "9 ", "10", "Jack ", "Queen ", "King ", "Ace "};
 
   enum suit {
       diamonds, hearts, spades, clubs
   };
 
   enum cname {
       six, seven, eight, nine, ten, jack, queen, king, ace
   };
 
   class Card {
   public:
 
       void set_suit( suit s ) {
           m_ms = s;
       }
 
       void set_cn( cname c ) {
           m_cn = c;
       }
 
       std::string get_suit( ) {
           return suits[m_ms];
       }
 
       std::string get_cn( ) {
           return cds[m_cn];
       }
   private:
       suit m_ms;
       cname m_cn;
   };
 
}
 
#endif // CARD_H
 

Deck.h
Код
C++ (Qt)
#ifndef DECK_H
#define DECK_H
 
#include "Card.h"
#include <deque>
#include <algorithm>
 
namespace CardGame {
 
   class Deck {
   public:
 
       void ini( ) {
           Card tmp;
           for ( cname i = six; i <= ace; i = static_cast<cname> (i + 1) )
               for ( suit j = diamonds; j <= clubs; j = static_cast<suit> (j + 1) ) {
                   tmp.set_suit( j );
                   tmp.set_cn( i );
                   m_tdeck.push_back( tmp );
               }
           shuffle( );
       }
 
       void shuffle( ) {
           std::random_shuffle( m_tdeck.begin( ), m_tdeck.end( ) );
       }
 
       Card get( ) {
           Card tmp = m_tdeck.front( );
           m_tdeck.pop_front( );
           return tmp;
       }
 
   private:
       std::deque<Card> m_tdeck;
   };
 
}
 
#endif // DECK_H
 

Player.h
Код
C++ (Qt)
#ifndef PLAYER_H
#define PLAYER_H
 
#include <deque>
#include <iostream>
#include "Card.h"
 
namespace CardGame {
 
   class Player {
   public:
 
       Player(std::string name) : m_name(name) {
       }
 
       void show( ) {
           for ( unsigned i = 0; i < m_hand.size( ); i++ )
               std::cout << m_hand[i].get_cn( ) << " ";
           std::cout << std::endl;
           for ( unsigned i = 0; i < m_hand.size( ); i++ )
               std::cout << m_hand[i].get_suit( ) << " ";
           std::cout << std::endl << std::endl;
       }
 
       void ini( ) {
           m_hand.clear( );
       }
 
       void add( Card c ) {
           m_hand.push_back( c );
       }
 
   private:
       std::deque<Card> m_hand;
       std::string m_name;
   };
 
}
 
#endif // PLAYER_H
 

main.cpp
Код
C++ (Qt)
#include <QCoreApplication>
#include <vector>
#include "Deck.h"
#include "Player.h"
#include <QDebug>
 
int main( int argc, char *argv[] ) {
   QCoreApplication app( argc, argv );
 
   // Колода
   CardGame::Deck deck;
 
   // Перемешиваем колоду
   deck.ini( );
 
   // Игроки
   std::vector<CardGame::Player> players;
   players.push_back( CardGame::Player( "Ivan" ) );
   players.push_back( CardGame::Player( "David" ) );
   players.push_back( CardGame::Player( "Joan" ) );
 
   // Раздаём игрокам по шесть карт
   for ( std::size_t i = 0; i < 6; ++i ) {
       try {
           players[i].add( deck.get( ) );
       } catch ( ... ) {
           qDebug( ) << "Uncaught exception.";
       }
   }
 
   // Показываем карты игроков
   for ( std::size_t i = 0; i < players.size( ); ++i ) {
       players[i].show( );
   }
 
   return app.exec( );
}
 

В коде файла main.cpp есть две проблемы:
1) В раздаче карт есть ошибка. У меня игрока всего три, а я пытаюсь выйти за диапазон массива: players. Должно срабатывать исключение, но этого не происходит. Почему?
2) После каждого запуска в процессах остаётся CardGame.exe. Мне приходится лезть в Диспетчер задач и вручную завершать процесс

Помогите, пожалуйста, с этими проблемами.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #34 : Апрель 20, 2014, 08:04 »

1) В раздаче карт есть ошибка. У меня игрока всего три, а я пытаюсь выйти за диапазон массива: players. Должно срабатывать исключение, но этого не происходит. Почему?
А какое вы ждете исключение out_of_range? Так operator[] его не бросает, в отличие от vector::at()

2) После каждого запуска в процессах остаётся CardGame.exe. Мне приходится лезть в Диспетчер задач и вручную завершать процесс
Уверите запуск главного цикла app.exec(). Просто возвращайте код возврата.
Записан
8Observer8
Гость
« Ответ #35 : Апрель 20, 2014, 08:18 »

А какое вы ждете исключение out_of_range? Так operator[] его не бросает, в отличие от vector::at()
Надо бы это на всю жизнь запомнить! Спасибо! Улыбающийся

Просто возвращайте код возврата.
Не понимаю, зачем тогда так пишут, если приложение нельзя будет повторно запустить:
Код
C++ (Qt)
int main( int argc, char *argv[] ) {
   QCoreApplication app( argc, argv );
   // ...
   return app.exec( );
}
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Не понимаю, зачем тогда так пишут, если приложение нельзя будет повторно запустить:
Почему нельзя? Можно. Улыбающийся
Разберитесь, для чего это пишут и все станет ясно.
Записан
8Observer8
Гость
« Ответ #37 : Апрель 20, 2014, 08:36 »

В документации Qt написано, что эта функция app.exec( ) запускает цикл обработки сообщений от операционной системы. При закрытии окна должен выполняться return app.exec( ); Непонятно, почему этого не происходит.

Вывожу текст e.what():

Код
C++ (Qt)
   // Раздаём игрокам по шесть карт
   for ( std::size_t i = 0; i < 6; ++i ) {
       try {
           players.at(i).add( deck.get( ) );
       } catch (const std::out_of_range &e) {
           std::cerr << e.what() << std::endl;
           return 1;
       } catch ( ... ) {
           std::cerr << "Uncaught exception." << std::endl;
           return 1;
       }
   }
 

Но какое-то странное сообщение выводится:

Цитировать
vector::_M_range_check

Что это значит?

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

Сообщений: 4350



Просмотр профиля
« Ответ #38 : Апрель 20, 2014, 08:48 »

При закрытии окна должен выполняться return app.exec( ); Непонятно, почему этого не происходит.
Потому что у вас нет окон?

Но какое-то странное сообщение выводится:
А какое сообщение вы ждали?
Его тип out_of_range, однозначно описывает проблему.
А в сообщении просто сохраняется имя функции, которая проверяет диапазон и бросает исключение.
Записан
8Observer8
Гость
« Ответ #39 : Апрель 20, 2014, 08:53 »

Потому что у вас нет окон?
Как же нет окон? А консольное окно? Улыбающийся

А какое сообщение вы ждали?
Его тип out_of_range, однозначно описывает проблему.
А в сообщении просто сохраняется имя функции, которая проверяет диапазон и бросает исключение.
Ожидал более внятного сообщения для пользователя. А "_M_range_check" - это какая-то абракадабра Улыбающийся Тогда буду дописывать, как в примере: http://www.cplusplus.com/reference/stdexcept/out_of_range/
Цитировать
Out of Range error: vector::_M_range_check
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #40 : Апрель 20, 2014, 08:56 »

Как же нет окон? А консольное окно? Улыбающийся
Это не ваше окно, не Qt-шное. Улыбающийся

Тогда буду дописывать как в примере: http://www.cplusplus.com/reference/stdexcept/out_of_range/
Да не надо ничего дописывать. Поймали исключение с таким типом, просто скажите об этом своими словами, понятными пользователю. Вовсе не обязательно везде печатать what().
Записан
8Observer8
Гость
« Ответ #41 : Апрель 20, 2014, 09:09 »

Это не ваше окно, не Qt-шное. Улыбающийся
Да, из терминала так просто не выйдешь. Может exec() для консолького приложения это почти тоже самое, что и бесконечный цикл? Надо послать сообщение, чтобы завершить?

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

Сообщений: 4350



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

Может exec() для консолького приложения это почти тоже самое, что и бесконечный цикл? Надо послать сообщение, чтобы завершить?
exec, для любого приложения, это бесконечный цикл - главный цикл приложения, в котором обрабатываются все события.
В вашем случае, он не нужен, поэтому его проще вообще не запускать.

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

Сообщений: 11445


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

В коде файла main.cpp есть две проблемы:
1) В раздаче карт есть ошибка. У меня игрока всего три, а я пытаюсь выйти за диапазон массива: players. Должно срабатывать исключение, но этого не происходит. Почему?
2) После каждого запуска в процессах остаётся CardGame.exe. Мне приходится лезть в Диспетчер задач и вручную завершать процесс

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

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

Сообщений: 4350



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

А вообще все гораздо проще - есть ли хоть какие-то шансы на этом что-то заработать?
Android, сетевой дурак, школьники на уроках играют через wi-fi/bluetooth. Монетизация через показ рекламы или покупка за 50 центов отключалки рекламы.

Лично я их в упор не вижу.
Здесь остается только сожалеть. Улыбающийся

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


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