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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
loou
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 29
#1

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

02.08.2013, 10:48. Просмотров 498. Ответов 7
Метки нет (Все метки)

Собствено с архитектурой вроде определился. Хотелось бы конструктивной критики.

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

Базовый клас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 константа, ее лучше сделать параметром шаблона?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2013, 10:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Архитектура программы. Правильно ли сделал? (C++):

Правильно ли сделал - C++
Нужно проверить правильно ли я сделал?? #include &lt;iostream.h&gt; #include &lt;math.h&gt; void main() { double k,a,n,m,p; cout...

Правильно ли я сделал? - C++
#include &lt;iostream&gt; using namespace std; int main() { int a,b,c; cin&gt;&gt;a&gt;&gt;b&gt;&gt;c; if ((a+b&gt;c) || (a+c&gt;b) ||...

Правильно ли я сделал пример - C++
http://www.cyberforum.ru/cpp-beginners/thread648042.html#post3434602 Правильно*?

правильно ли я сделал задание? - C++
правильно ли сделано задание? //предположим, что указатель pa был определен в следующем выражении с использованием оператора new. ...

Правильно ли я сделал?(Математические.Функции) - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; int main() { setlocale(0,&quot;&quot;); float pi,rez; ...

Правильно я сделал программу по уравнению? - C++
z=\sqrt{\left|y-2 \right|+3}+\frac{x+\frac{y}{2}}{2\left|1+y \right|}\left(x+1 \right) вот что у меня получилось ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 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 константа, ее лучше сделать параметром шаблона?
а хотите ли вы чтобы её видели участки кода которые будут использовать ваш класс/шаблон
1
gore-lykovoe
32 / 32 / 1
Регистрация: 04.04.2010
Сообщений: 414
02.08.2013, 11:17 #3
Цитата Сообщение от loou Посмотреть сообщение
Это как бы "ядро" никаких проверок корректности данных при создании объекта не произвожу. Важна производительность. Максимально общий, чтобы можно было добавить любые возможные подклассы.
Нужно сделать его абстрактным. virtual double GetVal()=0;
Цитата Сообщение от loou Посмотреть сообщение
Сейчас в cGeomObj используется #define константа, ее лучше сделать параметром шаблона?
Делайте её чем хотете, но только не #define... макросы в С++ лучше не использовать

Добавлено через 5 минут
Цитата Сообщение от loou Посмотреть сообщение
Еще вопрос. Если я свой клас сGeomObj сделаю в виде шаблона, я могу задать список допустимых типов для параметра типа?
Я не нашел, но это по моему странно. Если я не хочу чтобы в мой шаблон пихали не понять что, то что же делать?
Нету смысла в шаблоне, в который можно пихать только определенные типы. Подумайте, может вам вовсе не шаблон нужен?
1
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 в качестве параметра шаблона не хочу. У меня там корни, степени и т.д. что они будут с объектами делать?
0
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
02.08.2013, 11:42 #5
Цитата Сообщение от loou Посмотреть сообщение
ну вот double, int и т.д. хочу, а вот class : cXZ в качестве параметра шаблона не хочу. У меня там корни, степени и т.д. что они будут с объектами делать?
А ничего не будет делать. Не скомпилируется. Но ограничить шаблон только числовыми типами можно
0
loou
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 29
02.08.2013, 11:55  [ТС] #6
Но ограничить шаблон только числовыми типами можно
Скажите как, если не трудно. Ну либо ключевое слово для поиска. А то пока найти не могу.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
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
2
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. Вектор вполне подойдет.
Спасибо! Наверно так и сделаю. Тогда выбор конструктора тоже на нее ложится.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 21:55
Привет! Вот еще темы с ответами:

Проверьте пожалуйста, правильно ли я сделал задание - C++
Вот задание Дано действительное х. Вычислить \frac{(x-1)(x-3)(x-7)K(x-63)}{(x-2)(x-4)(x-8)K(x-64)} { {...

Правильно ли я всё сделал? CGI и Visual C++ - C++
Долго занимался RTFMом STFW. Врезультате получилось всё вот так: 1. Создал проект консольного приложения в Visual Studio. #include...

C++ | Правильно ли я сделал задание | Массивы | Указатели и Ссылки - C++
Вообще прога должна показывать самое большое число по модулю, что она и делает, но меня интересует другой вопрос, правильно ли я...

динамически создать/удалить объекты класса (правильно сделал?) - C++
создал класс: myclass { } завел вектор, в котором будут храниться указатели на объекты данного класса: vector &lt;myclass*&gt; ob; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2013, 21:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru