Жутко огромный конструктор... как сделать лучше?
От: FDSC Россия consp11.github.io блог
Дата: 04.06.07 13:02
Оценка:
Есть класс, в нём есть куча коэффициентов для системы дифференциальных уравнений. Получается что-то невообразимое (см. ниже)

Как это нормально сделать? Массив тут не очень-то подходит, потому что всё равно тогда нужно будет сделать индексатор, который будет по именам коэффициентов работать (использование коэффициентов нужно именно по именам) — т.е. всё равно куча тупого кода получается.

Вот думаю, можно это как-то нормально сделать, что бы кода было поменьше?

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;      // Момент инерции относительно оси Z
                public Iy  : XmlIOsystem.CalclulatorFunction;      // Момент инерции относительно оси Y
                public Zp  : XmlIOsystem.CalclulatorFunction;      // Максимальное расстояние по оси z до материала сечения от центра масс по направлению оси z     (больше нуля)
                public Zm  : XmlIOsystem.CalclulatorFunction;      // Максимальное расстояние по оси z до материала сечения от центра масс против направления оси z (больше нуля)
                public Yp  : XmlIOsystem.CalclulatorFunction;      // Аналогично Zp, но по оси Y
                public Ym  : XmlIOsystem.CalclulatorFunction;      // Аналогично Zm, но по оси Y
                
                public E   : XmlIOsystem.CalclulatorFunction;      // Модуль Юнга
                public G   : XmlIOsystem.CalclulatorFunction;      // Модуль сдвига
                public aT  : XmlIOsystem.CalclulatorFunction;      // Коэффициент температурного расширения
                
//                lF  : 
                public lFx : XmlIOsystem.CalclulatorFunction;      // Распределённая нагрузка по оси стержня
                public lFy : XmlIOsystem.CalclulatorFunction;      // -//- по локальной оси y
                public lFz : XmlIOsystem.CalclulatorFunction;      // -//- -//- z
                public lMx : XmlIOsystem.CalclulatorFunction;      // Распределённый крутящий момент
                public lMy : XmlIOsystem.CalclulatorFunction;      // Изгибающий помент (вокруг оси y)
                public lMz : XmlIOsystem.CalclulatorFunction;      // -//-              (вокруг оси z)
                
                public T0  : XmlIOsystem.CalclulatorFunction;      // Температура на оси стержня
                public tz  : XmlIOsystem.CalclulatorFunction;      // Коэффициент неравномерности температуры по оси z
                public ty  : XmlIOsystem.CalclulatorFunction;      // Коэффициент неравномерности температуры по оси y
                
                public 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: Жутко огромный конструктор... как сделать лучше?
От: Klapaucius  
Дата: 04.06.07 13:49
Оценка: 4 (1)
Здравствуйте, 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]: Жутко огромный конструктор... как сделать лучше?
От: FDSC Россия consp11.github.io блог
Дата: 04.06.07 14:32
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>[Record (Exclude = [Lv, L])]


K>Он сгенерирует конструктор для тривиально инициализируемых полей, а для Lv и L — сами напишите. А вообще было бы, наверное, лучше разделить этот класс. По моему, большинство полей можно сгруппировать. Вы, в общем-то, и сами их на группы разбили и разделили пустыми строками.


Разбивать никакого смысла не имеет

А как этим конструктором/атрибутом пользоваться? Где вообще это написано об этом атрибуте?
Re[3]: Жутко огромный конструктор... как сделать лучше?
От: Kisloid Мухосранск  
Дата: 04.06.07 14:37
Оценка: 4 (1)
Здравствуйте, FDSC, Вы писали:

FDS>А как этим конструктором/атрибутом пользоваться? Где вообще это написано об этом атрибуте?


здесь
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
Re[3]: Жутко огромный конструктор... как сделать лучше?
От: Klapaucius  
Дата: 05.06.07 12:12
Оценка: +1 :)
Здравствуйте, 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]: Жутко огромный конструктор... как сделать лучше?
От: FDSC Россия consp11.github.io блог
Дата: 05.06.07 14:39
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Здравствуйте, FDSC, Вы писали:


FDS>>Разбивать никакого смысла не имеет


K>Ну ну. А сгруппировать переменные? Вот например I, P, M, lF, lM, t — это векторы. Почему Вы их покомпонентно передаете? Просто даже если Вы такой конструктор автоматически сгенерируете, как Вы его потом использовать будете? По моему, функция с 23-я аргументами это страшно, как атомная война. Я таких ужасов и в Фортране не видел, если память не изменяет.


Я видел ещё хлеще, причём на Delphi и C++: несколько сотен ГЛОБАЛЬНЫХ переменных, причём их реально непонятно как разделять, так же, как и мои

I и t — это не векторы, по крайней мере по своей математической сущности

Там не будет функции с 23-мя аргументами, зачем? Аргументы уже есть непосредственно в классе, дальше функция внутри себя их будет использовать.

Вектора передаю покомпонентно потому что не вижу смысла их объединять: используются они именно как компоненты, а не как векторы

Все указанные величины — переменные коэффициенты в системе 12 дифференциальных уравнений



P.S. Насчёт того, что это страшно — согласен, поэтому и запостил
Re[5]: Жутко огромный конструктор... как сделать лучше?
От: FDSC Россия consp11.github.io блог
Дата: 05.06.07 14:41
Оценка:
Здравствуйте, FDSC, Вы писали:

FDS>Вектора передаю покомпонентно потому что не вижу смысла их объединять: используются они именно как компоненты, а не как векторы


P.S. Собственно говоря, они наоборот разделены, пользователь их задаёт (и хранит) как вектор
Re[4]: Жутко огромный конструктор... как сделать лучше?
От: Dufrenite Дания  
Дата: 14.06.07 18:27
Оценка:
Здравствуйте, 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 Дания  
Дата: 14.06.07 19:22
Оценка:
Сообразил: Record используется когда нет нужды в сложных вычислениях в конструкторе.
Re[5]: Жутко огромный конструктор... как сделать лучше?
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.06.07 23:16
Оценка:
Здравствуйте, 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]: Жутко огромный конструктор... как сделать лучше?
От: Dufrenite Дания  
Дата: 16.06.07 21:41
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Элементарно, Ватсон... Создать собственный конструктор который вызовет автоматически сгенерированный.


Точно. Только лучше наверное будет сгенерировать полный инициализатор:


[Record]
class Person
{
    internal this(name : string, age : int, sex : bool)
    {
        this(
            name,
            age,
            sex,
            if (age < 100) 1000 else 1500
            );
    }
    
    [Accessor(Name)]
    private name         : string;
    
    [Accessor(Age)]
    private age          : int;
    
    [Accessor(Sex)]
    private sex          : bool;
    
    [Accessor(CurrentCash)]
    private current_cash : decimal;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.