Динамические vs статические классы
От: Khimik  
Дата: 07.12.24 10:36
Оценка: :)
Я как обычно излагаю Delphi понятия, но вроде на C++ должно быть всё очень похоже. Если не ошибаюсь, в C++ есть динамические классы, которые корректно называть собственно классами, и статические классы, аналогом которых в Delphi являются рекорды?
Часто возникает выбор — оборачивать ли какую-то сущность а класс или рекорд. Я обычно делаю рекорд из всего, что не требует никакого динамического выделения памяти. Например у меня есть рекорд tvector, включающий в себя три числа x, y, z. Для разных операций с векторами вроде вычисления длины вектора, сложения, умножения и т.д. я пишу функции (какие-то в виде собственных функций рекорда, какие в виде просто функций). Делать из векторов класс было бы весьма неудобно, т.к. надо их будет каждый раз инициализировать и финализировать, а с рекордом я могу написать vector2:=vector1.
Но везде, где появляются динамические массивы и строки, обычно мне кажется удобнее создавать класс. У класса есть три базовых функции, которые надо проверять и править каждый раз, когда я что-то в него добавляю: конструктор, деструктор и ассигн. В Delphi нет и видимо в принципе не может быть полностью безглючного присвоения data2:=data1 с такими рекордами, поэтому надо делать data2.assign(data1).
Собственно к рекорду тоже можно прикрутить ассигн, но мне интуитивно кажется что это всё не есть удачные решения. Тут главный момент — передача данных в произвольных функциях. С классами всё понятно и удобно, потому что я всегда знаю что переменная класса — это указатель, соответственно если например класс передаётся как параметр какой-то функции, я точно знаю что перед её вызовом был вызван конструктор класса, а после будет вызван деструктор. С рекордами, если они содержат что-то динамическое, приходится передавать данные в функциях через var, и я плохо осознаю, например, не будет ли лишних проблем, если переменную с var передать как var ещё одной подпрограмме, может быть рекурсивной.
С классами меня естественно раздражает их медленность по сравнению с рекордами, плюс то что классы хранят какую-то дополнительную информацию вроде названия класса или таблицы виртуальных методов, а это ещё тормоза. В Delphi нет быстрых классов без этого? Если нет, может я когда-то дозрею до того, что начну активно использовать указатели к рекордам. Но может быть я слышал что использование указателей в современном программировании считается моветоном, вроде безусловных переходов?
Сишники, вам понятны эти дельфистские заморочки, или у вас как-то по-другому?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.