Форум программистов, компьютерный форум CyberForum.ru

Архитектура программы. Правильно ли сделал? - C++

Восстановить пароль Регистрация
 
loou
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 29
02.08.2013, 10:48     Архитектура программы. Правильно ли сделал? #1
Собствено с архитектурой вроде определился. Хотелось бы конструктивной критики.

Задача по сути следующая:
- Считывать данные геометрических объектов из файла.
- Вычислить некоторое число для двух геометрических объектов.

Базовый класc для геометрических объектов имеет одну функцию которая возвращает число, плюс конструкторы деструкторы и т.д.

C++
1
2
3
4
5
6
7
8
class сGeomObj {
public:
    ...
    double GetVal();
    
protected:
    ...
};
Это как бы "ядро" никаких проверок корректности данных при создании объекта не произвожу. Важна производительность. Максимально общий, чтобы можно было добавить любые возможные подклассы.

Все проверки в "интерфейсном" классе, он заточен под данную задачу:
(правильно ли называть его интерфейсом?)

C++
1
2
3
4
5
6
7
8
9
10
11
12
class iGeomObjFromFile {
public:
    ...
    int      ReadFromFile(char* f_name);
    double CalcGoalValue(int i, int j);
    
protected:
    list < cGeomObj > gList;
    static cReaderFromFile        Reader;
    static cGoalValueCalculator  Calculator;
    ...
}
Reader - статический объект, используется функцией ReadFromFile, считывает данные из файла и проверяет их корректность, создает объекты сGeomObj.

Calculator - статический объект, используется функцией CalcGoalValue, вычисляет интересующее значение для двух объектов cGeomObj.


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

Еще. Сейчас в cGeomObj используется #define константа, ее лучше сделать параметром шаблона?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
02.08.2013, 11:03     Архитектура программы. Правильно ли сделал? #2
Цитата Сообщение от loou Посмотреть сообщение
Важна производительность
я бы тогда создал отдельно модуль который бы по полной сразу проверял загружаемый или создаваемый ресурс, а в программе для работы с этим ресурсом полностью отключил бы проверки, в угоду производительности

Добавлено через 1 минуту
Цитата Сообщение от loou Посмотреть сообщение
Все проверки в "интерфейсном" классе, он заточен под данную задачу:
(правильно ли называть его интерфейсом?)
Интерфейс Interface Общий метод для структурирования компьютерных программ для того, чтобы их было проще понять
http://ru.wikipedia.org/wiki/%D0%A8%...BD%D0%B8%D1%8F

Добавлено через 2 минуты
Цитата Сообщение от loou Посмотреть сообщение
Еще. Сейчас в cGeomObj используется #define константа, ее лучше сделать параметром шаблона?
а хотите ли вы чтобы её видели участки кода которые будут использовать ваш класс/шаблон
gore-lykovoe
 Аватар для gore-lykovoe
31 / 31 / 1
Регистрация: 04.04.2010
Сообщений: 414
02.08.2013, 11:17     Архитектура программы. Правильно ли сделал? #3
Цитата Сообщение от loou Посмотреть сообщение
Это как бы "ядро" никаких проверок корректности данных при создании объекта не произвожу. Важна производительность. Максимально общий, чтобы можно было добавить любые возможные подклассы.
Нужно сделать его абстрактным. virtual double GetVal()=0;
Цитата Сообщение от loou Посмотреть сообщение
Сейчас в cGeomObj используется #define константа, ее лучше сделать параметром шаблона?
Делайте её чем хотете, но только не #define... макросы в С++ лучше не использовать

Добавлено через 5 минут
Цитата Сообщение от loou Посмотреть сообщение
Еще вопрос. Если я свой клас сGeomObj сделаю в виде шаблона, я могу задать список допустимых типов для параметра типа?
Я не нашел, но это по моему странно. Если я не хочу чтобы в мой шаблон пихали не понять что, то что же делать?
Нету смысла в шаблоне, в который можно пихать только определенные типы. Подумайте, может вам вовсе не шаблон нужен?
loou
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 29
02.08.2013, 11:27  [ТС]     Архитектура программы. Правильно ли сделал? #4
Цитата Сообщение от Van111 Посмотреть сообщение
я бы тогда создал отдельно модуль который бы по полной сразу проверял загружаемый или создаваемый ресурс, а в программе для работы с этим ресурсом полностью отключил бы проверки, в угоду производительности
То есть, как то так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class iGeomObjFromFile {
public:
    ...
    int      ReadFromFile(char* f_name);
    double CalcGoalValue(int i, int j);
    
protected:
    list < cGeomObj > gList;
    static cErrorFinder              Checker;
    static cReaderFromFile        Reader;
    static cGoalValueCalculator  Calculator;
    ...
}
 
int iGeomObjFromFile :: ReadFromFile(char* f_name) {
// читаем данные из файла
// проверяем их с помощью объекта Checker
// запускаем конструктор cGeomObj
}
Спасибо!

Добавлено через 6 минут
Нужно сделать его абстрактным. virtual double GetVal()=0;
Ага, сделана, просто в пост virtual не попало

Делайте её чем хотете, но только не #define... макросы в С++ лучше не использовать
Спасибо!

Нету смысла в шаблоне, в который можно пихать только определенные типы. Подумайте, может вам вовсе не шаблон нужен?
ну вот double, int и т.д. хочу, а вот class : cXZ в качестве параметра шаблона не хочу. У меня там корни, степени и т.д. что они будут с объектами делать?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
02.08.2013, 11:42     Архитектура программы. Правильно ли сделал? #5
Цитата Сообщение от loou Посмотреть сообщение
ну вот double, int и т.д. хочу, а вот class : cXZ в качестве параметра шаблона не хочу. У меня там корни, степени и т.д. что они будут с объектами делать?
А ничего не будет делать. Не скомпилируется. Но ограничить шаблон только числовыми типами можно
loou
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 29
02.08.2013, 11:55  [ТС]     Архитектура программы. Правильно ли сделал? #6
Но ограничить шаблон только числовыми типами можно
Скажите как, если не трудно. Ну либо ключевое слово для поиска. А то пока найти не могу.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2013, 18:15     Архитектура программы. Правильно ли сделал? #7
В большей степени критики, пожалуй, заслуживает не реализация, а постановка задачи.
Цитата Сообщение от loou Посмотреть сообщение
- Считывать данные геометрических объектов из файла.
- Вычислить некоторое число для двух геометрических объектов.
Вопрос звучит как "мне нужно считать данные и произвести вычисления, давайте обсудим архитектуру". Т.е. информации практически ноль, и при этом какие-то разговоры об архитектуре.

Последняя фраза мне вообще не ясна. "Вычислить для двух объектов" - это выбрать из всего массива два объекта и для каждого из них посчитать по отдельности, либо речь о функции с двумя аргументами f(x, y)?

Цитата Сообщение от loou Посмотреть сообщение
C++
1
2
3
4
5
6
7
class сGeomObj {
public:
* * ...
* * double GetVal();
protected:
* * ...
};

Не по теме:

И от кого народ нахватался писать префиксы 'c', явно показывая, что это класс?


Само название GetVal - ни о чем не говорит. Т.е. вопрос такой: а это должно быть методом класса? Или может будет лучше сделать внешней функцией? Забегая вперед, скорее всего метод объявлен в классе справедливо, но задумываться о таких вещах стоит.

Цитата Сообщение от loou Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
class iGeomObjFromFile {
public:
* * ...
* * int * * *ReadFromFile(char* f_name);
* * double CalcGoalValue(int i, int j);
protected:
* * list < cGeomObj > gList;
* * static cReaderFromFile * * * *Reader;
* * static cGoalValueCalculator *Calculator;
* * ...
}
Сразу же вопрос: а нужен ли этот класс? Он выглядит как свалка всего, что просто не знал где разместить.
Первая же архитектурная проблема: класс предполагает определенный порядок вызова методов. Т.е. вызывать метод вычисления имеет смысл только после того, как выполнено чтение из файла.
Вообще чтение из файла я бы сделал отдельной функцией:
C++
1
std::vector<cGeomObj> ReadFromFile(const std::string& filename);
Не вижу повода использовать std::list. Вектор вполне подойдет.

Далее - почему reader статический? Он один общий на все файлы? Каковы его функции? Он stateless? А если нет, если в нем реализована какая-нибудь своя буферизация и при начале обработки следующего файла в нем остается некоторое состояние от предыдущего чтения?
Короче, на один файл - один reader.
Опять же, при такой постановке не вижу необходимости в cGoalValueCalculator как классе. Предполагаю, что вместо него вполне могут быть обычные функции.

Добавлено через 1 минуту
Цитата Сообщение от loou Посмотреть сообщение
Скажите как, если не трудно. Ну либо ключевое слово для поиска.
Type traits http://en.cppreference.com/w/cpp/types
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 21:55     Архитектура программы. Правильно ли сделал?
Еще ссылки по теме:

C++ Проверьте пожалуйста, правильно ли я сделал задание
Правильно ли я сделал пример C++
C++ Правильно я сделал программу по уравнению?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
loou
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 29
02.08.2013, 21:55  [ТС]     Архитектура программы. Правильно ли сделал? #8
Спасибо, за комментарии. На счет постановки - я привел в общих чертах архитектуру, вы ее по критиковали. Был бы очень рад если бы вы продолжили в том же духе.

Последняя фраза мне вообще не ясна. "Вычислить для двух объектов" - это выбрать из всего массива два объекта и для каждого из них посчитать по отдельности, либо речь о функции с двумя аргументами f(x, y)?
Да функция двух переменных, иначе класс iGeomObjFromFile точно не нужен.

Само название GetVal - ни о чем не говорит. Т.е. вопрос такой: а это должно быть методом класса? Или может будет лучше сделать внешней функцией? Забегая вперед, скорее всего метод объявлен в классе справедливо, но задумываться о таких вещах стоит.
Класс имеет множественное наследование, единственное что объединяет все производные классы - эта функция. Тут, по моему, все очевидно.

Про cGeomObjFromFile:
Сразу же вопрос: а нужен ли этот класс? Он выглядит как свалка всего, что просто не знал где разместить.
Ну, примерно так и есть. Я хотел в нем производить выбор производного от cGeomObj класса и соответствующего конструктора в зависимости от считанных из файла данных.

C++
1
std::vector<cGeomObj> ReadFromFile(const std::string& filename);
Не вижу повода использовать std::list. Вектор вполне подойдет.
Спасибо! Наверно так и сделаю. Тогда выбор конструктора тоже на нее ложится.
Yandex
Объявления
02.08.2013, 21:55     Архитектура программы. Правильно ли сделал?
Ответ Создать тему
Опции темы

Текущее время: 05:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru