Здравствуйте, Nuzhny, Вы писали:
N>Здравствуйте, Khimik, Вы писали:
K>>Я тут не понимаю. Почему код на C++ более компактен и лучше читаем?
N>Потому что вся логика реализуется в более понятных абстракциях. Перегрузка арифметических операций позволяет писать единообразный код для перемножения и сложения матриц, векторов, скаляров. Не надо помнить, какие там функции для этого (типа MatMulToVect(M, V)), а писать просто: M * V. N>Самое крутое, что можно в таком стиле писать большие выражения, а они уже будут вычисляться не по частям, а как единое целое. Так умеет Eigen, OpenCV и множество других библиотек.
Ну вот в Delphi XE8 есть рекорды с процедурами и функциями. По-моему, их можно назвать статическими классами.
Скажем, есть у меня рекорд — вектор (три координаты):
type
TVect=record
x,y,z:double;
function VectRad:double;//Длина вектора
function VectRad2:double;//Квадрат длины
function IsNil:boolean;//Равен ли нулю
function MinVect:tvect;//Поменять все знаки
end;
Так что в коде можно писать, например:
CurRadius:=myvector1.VectRad;
На самом деле, я только начал понемногу переписывать старый дерьмокод, который писал без этих возможностей. Для суммы векторов у меня пока есть функция:
function SumVects(vect1,vect2:tvect):tvect;
begin
result.x:=vect1.x+vect2.x;
result.y:=vect1.y+vect2.y;
result.z:=vect1.z+vect2.z;
end;
Когда дойдут руки, заменю её на это:
TVect=record
...
class operator Add(self, othervect:tvect):tvect;
end;
И можно будет в коде писать так:
MyVector3:=MyVector1+MyVector2;
Хотя уже на этом примере видно, что такой подход далеко не всегда применим: скажем, умножать два вектора можно по-разному (скалярное или векторное умножение).
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен