Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 32

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

02.08.2013, 10:48. Показов 1522. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.08.2013, 10:48
Ответы с готовыми решениями:

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

Правильно ли я сделал?
#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) ||...

UML, правильно ли сделал?
Добрый день, подскажите, пожалуйста, правильно ли я описал класс в нотации UML? Не уверен в правильности оформления. Вот так выглядит мой...

7
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
02.08.2013, 11:03
Цитата Сообщение от loou Посмотреть сообщение
Важна производительность
я бы тогда создал отдельно модуль который бы по полной сразу проверял загружаемый или создаваемый ресурс, а в программе для работы с этим ресурсом полностью отключил бы проверки, в угоду производительности

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

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

Добавлено через 5 минут
Цитата Сообщение от loou Посмотреть сообщение
Еще вопрос. Если я свой клас сGeomObj сделаю в виде шаблона, я могу задать список допустимых типов для параметра типа?
Я не нашел, но это по моему странно. Если я не хочу чтобы в мой шаблон пихали не понять что, то что же делать?
Нету смысла в шаблоне, в который можно пихать только определенные типы. Подумайте, может вам вовсе не шаблон нужен?
1
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 32
02.08.2013, 11:27  [ТС]
Цитата Сообщение от 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.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
02.08.2013, 11:42
Цитата Сообщение от loou Посмотреть сообщение
ну вот double, int и т.д. хочу, а вот class : cXZ в качестве параметра шаблона не хочу. У меня там корни, степени и т.д. что они будут с объектами делать?
А ничего не будет делать. Не скомпилируется. Но ограничить шаблон только числовыми типами можно
0
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 32
02.08.2013, 11:55  [ТС]
Но ограничить шаблон только числовыми типами можно
Скажите как, если не трудно. Ну либо ключевое слово для поиска. А то пока найти не могу.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2013, 18:15
В большей степени критики, пожалуй, заслуживает не реализация, а постановка задачи.
Цитата Сообщение от 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
1 / 1 / 0
Регистрация: 02.08.2013
Сообщений: 32
02.08.2013, 21:55  [ТС]
Спасибо, за комментарии. На счет постановки - я привел в общих чертах архитектуру, вы ее по критиковали. Был бы очень рад если бы вы продолжили в том же духе.

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

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

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

C++
1
std::vector<cGeomObj> ReadFromFile(const std::string& filename);
Не вижу повода использовать std::list. Вектор вполне подойдет.
Спасибо! Наверно так и сделаю. Тогда выбор конструктора тоже на нее ложится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.08.2013, 21:55
Помогаю со студенческими работами здесь

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

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

Правильно ли я сделал?(Математические.Функции)
#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; ...

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru