Подтвердить что ты не робот

Почему мы должны использовать классы, а не записи, или наоборот?

Я использую Delphi уже довольно давно, но вместо того, чтобы приходить из CS-фона, я узнал "на работе" - в основном от моего босса, и дополненными кусочками и кусочками, собранными из Интернета, пользователями руководства, примеры и т.д.

Теперь мой босс - старая школа, начал программирование с помощью Pascal и не обязательно обновлялся с последними изменениями в Delphi.

Совсем недавно я задавался вопросом, является ли один из наших основных методов "неправильным".

Большинство наших приложений взаимодействуют с MySQL. В общем случае мы создадим record со структурой для хранения данных, считываемых из БД, и эти записи будут храниться в TList. Обычно у нас будет единица, которая определяет различные записи, которые у нас есть в приложении, а также функции и процедуры, которые засевают и считывают записи. Мы не используем процедуры записи, например, здесь

После рассмотрения некоторых примеров я начал задаваться вопросом, лучше ли нам использовать classes вместо записей, но мне трудно найти сильное руководство в любом случае.

То, с чем мы имеем дело, будет представлять информацию о пользователе: имена, DOB, события, типы событий. Или информация о расписании: часы, рабочие места и т.д.

4b9b3361

Ответ 1

Большая разница заключается в том, что записи являются типами значений, а классы - ссылочными типами. В двух словах это означает, что:

  • Для типа значения при использовании назначения a := b выполняется копия. Есть два разных экземпляра: a и b.
  • Для ссылочного типа, когда вы используете назначение, a := b, обе переменные относятся к одному экземпляру. Существует только один случай.

Главным следствием этого является то, что происходит, когда вы пишете a.Field := 42. Для записи тип значения, присваивание a.Field изменяет значение члена в a, но не в b. Это потому, что a и b - разные экземпляры. Но для класса, поскольку a и b оба относятся к одному экземпляру, то после выполнения a.Field := 42 вы можете с уверенностью утверждать, что b.Field = 42.

Нет жесткого и быстрого правила, в котором говорится, что вы всегда должны использовать типы значений или всегда использовать ссылочные типы. Оба имеют свое место. В некоторых ситуациях предпочтительнее использовать один, и в других ситуациях предпочтительнее использовать другое. По сути, решение всегда сводится к решению о том, что вы хотите, чтобы оператор присваивания имел в виду.

У вас есть существующая база кода и, по-видимому, знакомые с ней программисты, которые сделали особый выбор. Если у вас нет веских оснований переключиться на использование ссылочных типов, внесение изменений почти наверняка приведет к дефектам. И недостатки как в существующем коде (переход к ссылочному типу меняет смысл оператора присваивания), так и в коде, который вы пишете в будущем (вы и ваши коллеги разработали интуицию относительно значения оператора присваивания в конкретных контекстах, и эта интуиция сломается если вы переключаетесь).

Что еще, вы заявляете, что ваши типы не используют методы. Тип, который состоит только из данных и не имеет связанных с ним методов, скорее всего, наилучшим образом представлен типом значения. Я не могу сказать это точно, но мои инстинкты говорят мне, что оригинальные разработчики сделали правильный выбор.