Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++, как лучше спроектировать программу?

42K
18 сентября 2008 года
noobc
1 / / 18.09.2008
Код:
struct dot                                  //Структура "Точка"
{
   int x;                                   //Координата x
   int y;                                   //Координата y
};


struct drawtype                     //Структура параметров рисования фигуры
{
   int type;                            //тип рисуемой фигуры
   int a;                                   //
   int b;                                   // Координаты
   int c;                                   //частей элемента
   int d;                                   //
   int e;                                   //Цвет линий
   int f;                                   //Цвет заливки
};


class Element                          
{
   char iconame[20];                        //Массив имен иконок
   int sizex;                               //Размеры   
   int sizey;                               //Элемента
   vector<dot> dotcon;                  // Массив узлов
   vector<drawtype> drawset;                // Массив параметров отрисовки  
public:
   friend class scheme_elem;                        // Друж. класс конкретный элемент
   Element();                           // Необходимо для создания узла
   Element(char *);                     // Конструктор класса
   void draw_elem(int, int,int);                    //Рисуем элементы с учетом положения
   void draw_icon(int, int);                        //Рисуем иконки
   friend void save(char *);                //Обьявляем дружественной функцию сохранения для доступа к dotcon и drawset
   friend void load(char *);                        //Обьявляем дружественной функцию загрузки для доступа к dotcon и drawset
   friend void draw_connections();          //Обьявляем дружественной функция рисования проводов  для доступа к dotcon и drawset
   friend bool delete_wires(int, int);              //Обьявляем дружественной для доступа к dotcon и drawset
};
 

class scheme_elem
{  
   int pos;                             //положение на экране
   Element *parent;                     //указатель на шаблон
   dot coords;                          //координаты элемента
public:
   scheme_elem(Element &, int, int);                // Создание элемента в конкретной точке
   void connect(scheme_elem *, int, int);           //соединение элементов
   bool disconnect(int);                    //разьединение элементов
   void draw_elem();                        //Рисуем элементы
   void move(int, int);                     //Перемещение элемента
   void rotate (int);                       //Поворот элемента
   bool mousein(int, int);                  //Состояние курсора мыши. Расположен над элементом или нет
   bool collises(scheme_elem);              //Столкновение элементов
   int detect(int, int);                            //Определение точек соединения
   friend void save(char *);               
   friend void load(char *);
   friend void draw_connections();                 
   friend bool delete_wires(int, int);
};


struct connection  
{                                    
   scheme_elem *A, *B;     
   int Ai, Bi;                             
};
vector<connection> conn;               
vector<Element> templates;             
vector<scheme_elem> scheme;


как лучше переделать это? а то использование структур это же скрытой процедурное программирование:( да и вообще чтобы правильнее было
92
18 сентября 2008 года
Тень Пса
2.2K / / 19.10.2006
ну, как минимум сделать классы :) вместо структур
12K
18 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Классы - не обязательно, на самом деле, т.к. в данном случае структуры - теже классы только с доступом public по-умолчанию.

А вот назвать переменные должным образом не помешало бы.
535
18 сентября 2008 года
Нездешний
537 / / 17.01.2008
Цитата:
использование структур это же скрытой процедурное программирование


Это как это, можно поинтересоваться?

41K
18 сентября 2008 года
qwone
12 / / 27.08.2008
вообще то программировать на с++ можно по всякому (что так и делается)
но если вы пытаетесь использовать С++ по максиму ,то надо начинать создавать с класса-контейнера-файла
примерно облегченная версия исходника здесь.
http://www.cyberforum.ru/post55082.html
почему класс . класс в С++ не сильно важен . важен объект который создается по описанию данного класса . И как можно с ним манипулировать и на сколько это легко ( это те команды которые пишутся в main()
почему контейнер . Так вся главная информация находится в куче -динамической памяти .
Почему файл . так вся инфра формируется по структуре файла . всегда можно слить на винт или выдернуть кусок новой .
Разумеется если ваш контейнер сможет справиться с ней .
443
19 сентября 2008 года
REmindER
292 / / 23.03.2003
Наверное, лучше будет определить класс-представитель элемента и класс-манипулятор, который будет ими оперировать, без явных зависимых связей. Все операции, связанные с представлением элемента (поворот, перемещение и т.д.), переложить на плечи класса-представителя. С точки зрения проектирования, прорисовку, к примеру, элемента я бы определил как стратегию с абстрактными методами рисования, хотя, может быть, это бы замедлило выполнение. Инициализацию по загрузке производить с использованием фабрики, если элементы имеют хотя бы какую-то идентификацию (type; //тип рисуемой фигуры). Или сделать автоматическую индексацию при компиляции, чтобы не возиться с жесткими определениями типа элементов, с использованием списка.

Цитата:
...а то использование структур это же скрытой процедурное программирование:( да и вообще чтобы правильнее было



А процедурное программирование здесь причем?

Цитата:
...важен объект который создается по описанию данного класса...



Это точно. Особенно - в run-time'е. :D

41K
19 сентября 2008 года
qwone
12 / / 27.08.2008
REmindER

Согласен со всем . Правда пока не пытался вешать графический движок на классы . ну это будет в будующем
42K
19 сентября 2008 года
Action
4 / / 19.09.2008
Да уж, имена явно следует сменить. поверь, если напишешь норм имена, то не надо будет комментировать каждую строку
Цитата:
int a; //
int b; // Координаты
int c; //частей элемента
int d; //
int e; //Цвет линий
int f;

пройдет неделя и ты не вспомнишь что тут что (хотя с коментами еще можно повтыкать), но при использовании точно путаться будешь
+ избавляйся от глобальных переменных. меньше будет гимора.
+ еще советую избавиться от friend. если юзаешь френды, значит где то в проектировании допустил ошибку.

41K
20 сентября 2008 года
qwone
12 / / 27.08.2008
Action согласен !
По мне автор темы не выработал стиль программирования .(Стиль программирования - это свод неписаных правил позволяющих не запутаться в своих же программах , позволяющих тестировать в работе кусочки ,куски и целиком программу).
Прикольно у меня в программах мало переменных , а те что есть самоинициализируются или инициализируюся конструктором . Так что , когда я создаю объект он уже готов полностью . Если мне надо изменить параметр , то я его меняю членом-функцией .
Про френды . То это неплохая штучка при отладке и тестировке . Но я ее использую для вывода на консоль информации по состоянию переменных класса . Ну а иначе это очень усложняет отладку.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог