Есть класс, в нём есть куча коэффициентов для системы дифференциальных уравнений. Получается что-то невообразимое (см. ниже)
Как это нормально сделать? Массив тут не очень-то подходит, потому что всё равно тогда нужно будет сделать индексатор, который будет по именам коэффициентов работать (использование коэффициентов нужно именно по именам) — т.е. всё равно куча тупого кода получается.
Вот думаю, можно это как-то нормально сделать, что бы кода было поменьше?
public class Bar
{
public N1: Node; // Начальный узелpublic N2: Node; // Конечный узелpublic N3: Node; // Узел, указывающий направление оси y (точнее, лежащие в плоскости, перпендикулярной оси z)public Lv : VinVector;
public L : double;
// Параметры поперечного сеченияpublic A : XmlIOsystem.CalclulatorFunction; // Площадьpublic Iz : XmlIOsystem.CalclulatorFunction; // Момент инерции относительно оси Zpublic Iy : XmlIOsystem.CalclulatorFunction; // Момент инерции относительно оси Ypublic Zp : XmlIOsystem.CalclulatorFunction; // Максимальное расстояние по оси z до материала сечения от центра масс по направлению оси z (больше нуля)public Zm : XmlIOsystem.CalclulatorFunction; // Максимальное расстояние по оси z до материала сечения от центра масс против направления оси z (больше нуля)public Yp : XmlIOsystem.CalclulatorFunction; // Аналогично Zp, но по оси Ypublic Ym : XmlIOsystem.CalclulatorFunction; // Аналогично Zm, но по оси Ypublic E : XmlIOsystem.CalclulatorFunction; // Модуль Юнгаpublic G : XmlIOsystem.CalclulatorFunction; // Модуль сдвигаpublic aT : XmlIOsystem.CalclulatorFunction; // Коэффициент температурного расширения
// lF : public lFx : XmlIOsystem.CalclulatorFunction; // Распределённая нагрузка по оси стержняpublic lFy : XmlIOsystem.CalclulatorFunction; // -//- по локальной оси ypublic lFz : XmlIOsystem.CalclulatorFunction; // -//- -//- zpublic lMx : XmlIOsystem.CalclulatorFunction; // Распределённый крутящий моментpublic lMy : XmlIOsystem.CalclulatorFunction; // Изгибающий помент (вокруг оси y)public lMz : XmlIOsystem.CalclulatorFunction; // -//- (вокруг оси z)public T0 : XmlIOsystem.CalclulatorFunction; // Температура на оси стержняpublic tz : XmlIOsystem.CalclulatorFunction; // Коэффициент неравномерности температуры по оси zpublic ty : XmlIOsystem.CalclulatorFunction; // Коэффициент неравномерности температуры по оси ypublic this(
aA : XmlIOsystem.CalclulatorFunction,
aIz : XmlIOsystem.CalclulatorFunction,
aIy : XmlIOsystem.CalclulatorFunction,
aZp : XmlIOsystem.CalclulatorFunction,
aZm : XmlIOsystem.CalclulatorFunction,
aYp : XmlIOsystem.CalclulatorFunction,
aYm : XmlIOsystem.CalclulatorFunction,
aE : XmlIOsystem.CalclulatorFunction,
aG : XmlIOsystem.CalclulatorFunction,
aaT : XmlIOsystem.CalclulatorFunction,
alFx : XmlIOsystem.CalclulatorFunction,
alFy : XmlIOsystem.CalclulatorFunction,
alFz : XmlIOsystem.CalclulatorFunction,
alMx : XmlIOsystem.CalclulatorFunction,
alMy : XmlIOsystem.CalclulatorFunction,
alMz : XmlIOsystem.CalclulatorFunction,
aT0 : XmlIOsystem.CalclulatorFunction,
atz : XmlIOsystem.CalclulatorFunction,
aty : XmlIOsystem.CalclulatorFunction,
aN1: Node,
aN2: Node,
aN3: Node
)
{
N1 = aN1;
N2 = aN2;
N3 = aN3;
A = aA ;
Iz = aIz;
Iy = aIy;
Zp = aZp;
Zm = aZm;
Yp = aYp;
Ym = aYm;
E = aE ;
G = aG ;
aT = aaT;
lFx = alFx;
lFy = alFy;
lFz = alFz;
lMx = alMx;
lMy = alMy;
lMz = alMz;
T0 = aT0;
tz = atz;
ty = aty;
Lv = N2.Coordinate - N1.Coordinate;
L = Lv.norm();
}
}
Re: Жутко огромный конструктор... как сделать лучше?
Здравствуйте, FDSC, Вы писали:
FDS>Есть класс, в нём есть куча коэффициентов для системы дифференциальных уравнений. Получается что-то невообразимое (см. ниже)
FDS>Как это нормально сделать? Массив тут не очень-то подходит, потому что всё равно тогда нужно будет сделать индексатор, который будет по именам коэффициентов работать (использование коэффициентов нужно именно по именам) — т.е. всё равно куча тупого кода получается.
FDS>Вот думаю, можно это как-то нормально сделать, что бы кода было поменьше?
Используйте хотя-бы такой макроатрибут:
[Record (Exclude = [Lv, L])]
Он сгенерирует конструктор для тривиально инициализируемых полей, а для Lv и L — сами напишите. А вообще было бы, наверное, лучше разделить этот класс. По моему, большинство полей можно сгруппировать. Вы, в общем-то, и сами их на группы разбили и разделили пустыми строками.
... << RSDN@Home 1.2.0 alpha rev. 677>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[2]: Жутко огромный конструктор... как сделать лучше?
Здравствуйте, Klapaucius, Вы писали:
K>[Record (Exclude = [Lv, L])]
K>Он сгенерирует конструктор для тривиально инициализируемых полей, а для Lv и L — сами напишите. А вообще было бы, наверное, лучше разделить этот класс. По моему, большинство полей можно сгруппировать. Вы, в общем-то, и сами их на группы разбили и разделили пустыми строками.
Разбивать никакого смысла не имеет
А как этим конструктором/атрибутом пользоваться? Где вообще это написано об этом атрибуте?
Re[3]: Жутко огромный конструктор... как сделать лучше?
Здравствуйте, FDSC, Вы писали:
FDS>Разбивать никакого смысла не имеет
Ну ну. А сгруппировать переменные? Вот например I, P, M, lF, lM, t — это векторы. Почему Вы их покомпонентно передаете? Просто даже если Вы такой конструктор автоматически сгенерируете, как Вы его потом использовать будете? По моему, функция с 23-я аргументами это страшно, как атомная война. Я таких ужасов и в Фортране не видел, если память не изменяет.
... << RSDN@Home 1.2.0 alpha rev. 677>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[4]: Жутко огромный конструктор... как сделать лучше?
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, FDSC, Вы писали:
FDS>>Разбивать никакого смысла не имеет
K>Ну ну. А сгруппировать переменные? Вот например I, P, M, lF, lM, t — это векторы. Почему Вы их покомпонентно передаете? Просто даже если Вы такой конструктор автоматически сгенерируете, как Вы его потом использовать будете? По моему, функция с 23-я аргументами это страшно, как атомная война. Я таких ужасов и в Фортране не видел, если память не изменяет.
Я видел ещё хлеще, причём на Delphi и C++: несколько сотен ГЛОБАЛЬНЫХ переменных, причём их реально непонятно как разделять, так же, как и мои
I и t — это не векторы, по крайней мере по своей математической сущности
Там не будет функции с 23-мя аргументами, зачем? Аргументы уже есть непосредственно в классе, дальше функция внутри себя их будет использовать.
Вектора передаю покомпонентно потому что не вижу смысла их объединять: используются они именно как компоненты, а не как векторы
Все указанные величины — переменные коэффициенты в системе 12 дифференциальных уравнений
P.S. Насчёт того, что это страшно — согласен, поэтому и запостил
Re[5]: Жутко огромный конструктор... как сделать лучше?
Здравствуйте, FDSC, Вы писали:
FDS>Вектора передаю покомпонентно потому что не вижу смысла их объединять: используются они именно как компоненты, а не как векторы
P.S. Собственно говоря, они наоборот разделены, пользователь их задаёт (и хранит) как вектор
Re[4]: Жутко огромный конструктор... как сделать лучше?
Здравствуйте, Kisloid, Вы писали:
K>Здравствуйте, FDSC, Вы писали:
FDS>>А как этим конструктором/атрибутом пользоваться? Где вообще это написано об этом атрибуте?
K>здесь
Всё равно не понятно как пользоваться. Там такой пример:
[Record (Include = [name, age, sex])]
class Person {
public name : string;
public age : int;
public sex : bool;
current_cash : decimal;
}
Понятно, что в данном случае будет сгенерирован конструктор с 3-мя параметрами: name, age и sex.
Но как быть если я хочу инициализировать переменную current_cash например так:
current_cash = if (age < 100) 1000 else 1500;
Re[5]: Жутко огромный конструктор... как сделать лучше?
Здравствуйте, Dufrenite, Вы писали:
D>Но как быть если я хочу инициализировать переменную current_cash например так:
D>
D>current_cash = if (age < 100) 1000 else 1500;
D>
Элементарно, Ватсон... Создать собственный конструктор который вызовет автоматически сгенерированный.
[Record (Include = [name, age, sex])]
class Person
{
public this(name : string, age : int, sex : bool, current_cash : decimal)
{
this(name, age, sex);
current_cash = if (age < 100) 1000 else 1500
}
public name : string;
public age : int;
public sex : bool;
current_cash : decimal;
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Жутко огромный конструктор... как сделать лучше?