Введение

В информатике и объектно-ориентированном программировании пассивная структура данных (PDS), также называемая простой старой структурой данных или простыми старыми данными (POD), является записью, в отличие от объектов. Это структура данных, которая представляется исключительно как пассивное собрание значений полей (переменных экземпляра) без использования объектно-ориентированных возможностей.

Обоснование

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

В C++

Тип PDS в C++, или простой объект C++, определяется как скалярный тип или класс PDS. Класс PDS не имеет оператора присваивания, определенного пользователем, не имеет деструктора, определенного пользователем, и не содержит нестатических членов данных, которые сами не являются PDS. Более того, класс PDS должен быть агрегатным, то есть не иметь конструкторов, объявленных пользователем, не иметь приватных или защищенных нестатических данных, не иметь виртуальных базовых классов и виртуальных функций. Стандарт содержит положения о том, как типы PDS должны себя вести в C++. Библиотека признаков типов в стандартной библиотеке C++ предоставляет шаблон с именем `is_pod`, который можно использовать для определения, является ли данный тип POD. В C++20 понятие "простые старые данные" (POD) и, следовательно, `pod` считается устаревшим и заменено понятиями "тривиальный" и "стандартный макет". В некоторых контекстах C++ разрешает использовать только типы PDS. Например, объединение в C++98 не может содержать класс, имеющий виртуальные функции или нетривиальные конструкторы или деструкторы. Это ограничение связано с тем, что компилятор не может определить, какой конструктор или деструктор следует вызывать для объединения. Типы PDS также могут использоваться для взаимодействия с C, который поддерживает только PDS.

На Яве

В Java некоторые разработчики считают, что концепция PDS соответствует классу с публичными полями данных и отсутствием методов (Java Code Conventions 10.1), то есть объекту передачи данных. Другие также относят к концепции PDS простые Java-объекты (POJO) – классы, имеющие методы, но только геттеры и сеттеры, без какой-либо логики, – и JavaBeans, если они не используют обработку событий и не реализуют методы, выходящие за рамки геттеров и сеттеров. Однако POJO и JavaBeans обладают инкапсуляцией и, следовательно, противоречат фундаментальному определению PDS. Записи (представленные в Java 16 в 2021 году) являются поверхностно неизменяемыми структурами данных без инкапсуляции и, таким образом, также могут рассматриваться как PDS.

На других языках

В PHP ассоциативные массивы и объекты stdClass могут рассматриваться как PDS. Другие структурированные представления данных, такие как XML или JSON, также могут использоваться как PDS, если не накладываются существенные семантические ограничения. В Python модуль dataclass предоставляет классы данных, которые часто используются как контейнеры без поведения для хранения данных, с возможностями валидации данных. Классы данных в Python, представленные в версии 3.7, обеспечивают удобный способ создания класса и хранения значений данных. Классы данных позволяют избежать повторения кода и повысить читаемость. В языке C структуры используются аналогичным образом.