Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вчленение объектов предметной области, особенности ООП 
:(
    Опции темы
Нитонисе
Дата 15.11.2010, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Пишу программу - расчет многопролетной балки. Пытаюсь применять объектный подход.
Главный объект программы - Балка. У балки может быть от одного до бесконечности Пролетов. В каждом пролете нужно построить Эпюры. Эпюра - это график распределения внутренних усилий по длине Пролета.
Эпюры я выделяю в отдельный класс.
Код

class Diagram
{
  protected:
    std::vector<int> X; // набор сечений Пролета, где мы определяем внутренние усилия, сечений может быть много, например 100
    std::vector<float> M; // значение момента в сечении
    std::vector<float> Q; // значение поперечной силы в сечении
};

В классе Пролет имеется ссылка на объект класса Эпюра.
Код

class Span
{
  public:
    void setX(); // задает набор сечений и передает скомпанованный вектор объекту Эпюра
    void calcM(); // рассчитывает моменты в сечениях и пепредает скомпанованный вектор объекту Эпюра
    void calcQ(); // рассчитывает поперечные силы в сечениях и передает скомпанованный вектор объекту Эпюра

  protected:
    Diagram *diagram;
};

Как видно из кода класса Пролет (Span) все переменные класса Эпюра (Diagram) задаются вне этого класса. Что уже само по себе не удобно. При этом некоторые другие функции могут обращаться к значениям векторов X,M,Q класса Diagram, например функция отрисовка Эпюры на канве. И опять же, снаружи осуществлять доступ к отдельным элементам этих векторов неудобно. Придется писать свои функции доступа наподобие
Код

int Diagram::getX(int index)
{
  return X[index];
}

Насколько оправдана такая структуризация данных с учетом усложненных методов доступа к данным? При этом класс Diagram обладает собственными функциями, например определение максимальных и минимальных значений из векторов M,Q. Класс может быть использован и в других программах в таком же виде.
PM MAIL   Вверх
mes
Дата 15.11.2010, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  15.11.2010,  08:51 Найти цитируемый пост)
class Span
{
  public:
    void setX(); // задает набор сечений и передает скомпанованный вектор объекту Эпюра
    void calcM(); // рассчитывает моменты в сечениях и пепредает скомпанованный вектор объекту Эпюра
    void calcQ(); 


это выглядит не логичным в рамках ООП..

Добавлено через 1 минуту и 40 секунд
Цитата(Нитонисе @  15.11.2010,  08:51 Найти цитируемый пост)
Главный объект программы - Балка. У балки может быть от одного до бесконечности Пролетов. В каждом пролете нужно построить Эпюры.

вот читайте что сами написали и сравните с вашим кодом.. smile



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 15.11.2010, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  15.11.2010,  09:56 Найти цитируемый пост)
это выглядит не логичным в рамках ООП.. 

А что выглядит логичным? Определить эти функции в классе Diagram? По задумке класс Diagram - хранилище результатов расчета балки. Тобишь расчетная часть - не входит в сферу компетенции этого хранилища и реализуется в другом классе (классе Span).

Либо расчеты сделать вообще внешними по отношении и к Span и к Diagram?
PM MAIL   Вверх
mes
Дата 15.11.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  15.11.2010,  09:01 Найти цитируемый пост)
 Определить эти функции в классе Diagram? По задумке класс Diagram - хранилище результатов расчета балки. Тобишь расчетная часть - не входит в сферу компетенции этого хранилища и реализуется в другом классе (классе Span).

а почему если не входит в диаграм, надо обязательно засунуть в span ?


Цитата(Нитонисе @  15.11.2010,  08:51 Найти цитируемый пост)
. В каждом пролете нужно построить Эпюры.

Читается как, на основании пролета надо построить эпюры.. 
А значит пролет входит в состав диаграмы, а не диаграма входит в состав пролета.. 



--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 15.11.2010, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  15.11.2010,  10:09 Найти цитируемый пост)
а почему если не входит в диаграм, надо обязательно засунуть в span ?

Потому что по-моему логично расчеты поместить в этот объект. Для расчета этот объект обладает всем необходимым, а именно - длина пролета, вектор нагрузок (собственно больше ничего и не надо). Результаты же расчета хранятся в векторах X,M,Q. Их можно было бы объявить тоже в классе Span как атрибуты, но меня останавливает то, что точно такие же атрибуты могут быть и в другом классе и в другой программе. Тогда пришлось бы тупо дублировать собственный функции определения максимальных M,Q, что хоть в сущности нетрудоемко, но по сути считаю неправильно.

Цитата(mes @  15.11.2010,  10:09 Найти цитируемый пост)
Читается как, на основании пролета надо построить эпюры.. А значит пролет входит в состав диаграмы, а не диаграма входит в состав пролета.. 

Первое предложение верно, а вот логика второго не ясна))
PM MAIL   Вверх
mes
Дата 15.11.2010, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  15.11.2010,  09:23 Найти цитируемый пост)
 Для расчета этот объект обладает всем необходимым, а именно - длина пролета, вектор нагрузок (собственно больше ничего и не надо). 

расчет совершается над пролетом, а не пролетом.. 


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 15.11.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  15.11.2010,  10:34 Найти цитируемый пост)
расчет совершается над пролетом, а не пролетом.. 

Вот есть Пролет (Span). Он характеризуется длиной (int length), приложенной к нему нагрузкой (vector<Load*> loads) и двумя значениями крайних моментов М1 и М2 (в предыдущем посте не указал, но эти значения нужны для расчета всех значений внутренних усилий по длине пролета). Нужно рассчитать внутренние усилия в сечениях балки с заданым интервалом. Набор сечений хранится в векторе X класса Diagram.
Вы предлагаете вместо определения расчетной функции внутри этого класса, которая бы оперировала данными этого класса, объявить внешнюю функцию, в которую в качестве аргументов передать следующее:
 - длину пролета
 - левый крайний момент М1
 - правый крайний момент М2
 - вектор нагрузок на пролет
 - координата сечения, где определяем усилия
 - ссылку на объект Diagram для записи результата расчета.
Не слишком ли много аргументов будет у функции? Ведь внутри класса эта функция работает без передаваемых аргументов вовсе.

Хотя можно в качестве аргумента передавать объект Span... только что от этого выигрываем?

Это сообщение отредактировал(а) Нитонисе - 15.11.2010, 10:59
PM MAIL   Вверх
mes
Дата 15.11.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  15.11.2010,  09:57 Найти цитируемый пост)
Набор сечений хранится в векторе X класса Diagram.

с чего бы вдруг ?! 

Цитата(Нитонисе @  15.11.2010,  09:57 Найти цитируемый пост)
в которую в качестве аргументов передать следующее:
 - длину пролета
 - левый крайний момент М1
 - правый крайний момент М2
 - вектор нагрузок на пролет
 - ссылку на объект Diagram для записи результата расчета.

не обязательно так smile

Добавлено через 59 секунд
Цитата(Нитонисе @  15.11.2010,  09:57 Найти цитируемый пост)
Вот есть Пролет (Span). Он характеризуется длиной (int length), приложенной к нему нагрузкой (vector<Load*> loads) и двумя значениями крайних моментов М1 и М2 

вот уже сколько параметров заменяются одним smile


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 15.11.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  15.11.2010,  11:00 Найти цитируемый пост)
с чего бы вдруг ?! 

Ну с того что надо где-то хранить набор сечений))

Цитата(mes @  15.11.2010,  11:00 Найти цитируемый пост)
не обязательно так 

Ну я выше предложил - можно объект Span передать в качестве аргумента и получить внутри функции доступ ко всем его данным. Только что от этого выигрывается?
PM MAIL   Вверх
mes
Дата 15.11.2010, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  15.11.2010,  09:57 Найти цитируемый пост)
объявить внешнюю функцию, 

хочу уточнить: внешнюю по отношению к Span.. но не обязательно абсолютно внешнюю.. 




--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 15.11.2010, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  15.11.2010,  11:01 Найти цитируемый пост)
хочу уточнить: внешнюю по отношению к Span.. но не обязательно абсолютно внешнюю.. 

Непонятно для чего. Хотелось бы иметь возможность применять данные разработки и в других программах, подключая готовый модуль, а не готовый модуль + наборы внешних функций, который вобщем-то не нужны без объекта класса Span, уж коль скоро они оперируют его данными.
PM MAIL   Вверх
mes
Дата 15.11.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  15.11.2010,  10:06 Найти цитируемый пост)
а не готовый модуль + наборы внешних функций

ну так кто против? 
или это аргумент чтоб запихнуть в Span,и еще к тому же следить за тем когда вызывать функции calc ?

Добавлено через 1 минуту и 19 секунд
Цитата(Нитонисе @  15.11.2010,  10:06 Найти цитируемый пост)
 который вобщем-то не нужны без объекта класса Span

Так нужно учитывать и кому это нужно ..Spanу оно нужно ? 


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 15.11.2010, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  15.11.2010,  11:09 Найти цитируемый пост)
ну так кто против? или это аргумент чтоб запихнуть в Span,и еще к тому же следить за тем когда вызывать функции calc ?

Так что ж тогда объявлять собственными функциями объекта если не функции, оперирующие собственными данными?) Каков глубинный смысл выносить такие функции за пределы класса?
PM MAIL   Вверх
mes
Дата 15.11.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 6
Всего: 250



Цитата(Нитонисе @  15.11.2010,  10:12 Найти цитируемый пост)
Так что ж тогда объявлять собственными функциями объекта если не функции, оперирующие собственными данными?)

функции описывающие внутреннее поведение объекта, а не операции над ним.. 



Это сообщение отредактировал(а) mes - 15.11.2010, 11:36


--------------------
PM MAIL WWW   Вверх
Нитонисе
Дата 15.11.2010, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(mes @  15.11.2010,  11:09 Найти цитируемый пост)
Так нужно учитывать и кому это нужно ..Spanу оно нужно ? 

Конечно нужны. А как же получить усилия в Spanе?
Хотелось бы использовать в программе код такого типа
Код

// создаем вектор нагрузок
vector<Load*> loads;

// заполняем вектор нагрузок (в данном случае всего одной)
Load *load;
load = new Load;
loads.push_back(load);

// работаем с объектом Span
Span s; // создали объект
s.setLoad(loads);  // приложили нагрузку
s.calcM();  // посчитали моменты в сечениях
s.drawM();  // нарисовали эпюру моментов


В вашем же случае будет
Код

Span s;
s.setLoad(loads);
calcM(s);  // внешняя функция
s.drawM();

В чем преимущества этого метода?

P.S. Что у вас за манера постоянно править свои посты по всей теме? Думаете так удобнее общаться?

Добавлено через 44 секунды
Цитата(mes @  15.11.2010,  11:36 Найти цитируемый пост)
функции описывающие внутреннее поведение объекта, а не операции над ним.. 

Так расчет внутренних усилий - это и есть поведение объекта.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1140 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.