В информатике и объектно-ориентированном программировании пассивная структура данных ( PDS ), также называемая простой старой структурой данных или простыми старыми данными ( POD ), является записью , в отличие от объектов. Это структура данных , которая представлена только как пассивные коллекции значений полей ( переменных экземпляра ), без использования объектно-ориентированных функций. [1]
Пассивные структуры данных подходят, когда есть часть системы, где должно быть четко указано, что подробная логика для обработки данных и целостности находится в другом месте. PDS часто находятся на границах системы, где информация перемещается в другие системы или постоянное хранилище и из них, а логика проблемной области, которая находится в других частях системы, не имеет значения. Например, PDS был бы удобен для представления значений полей объектов, которые конструируются из внешних данных, в части системы, где семантические проверки и интерпретации, необходимые для допустимых объектов, еще не применяются.
Тип PDS в C++ или Plain Old C++ Object определяется как скалярный тип или класс PDS. [2] Класс PDS не имеет определяемого пользователем оператора присваивания копии, определяемого пользователем деструктора и нестатических членов данных, которые сами по себе не являются PDS. Более того, класс PDS должен быть агрегатом, то есть у него нет определяемых пользователем конструкторов, закрытых или защищенных нестатических данных, виртуальных базовых классов [a] и виртуальных функций. [4] Стандарт включает утверждения о том, как PDS должен вести себя в C++. type_traits
Библиотека в стандартной библиотеке C++ предоставляет шаблон с именем is_pod
, который можно использовать для определения того, является ли данный тип POD. [5] В C++20 понятие «простые старые данные» (POD) и тем самым is_pod
устарело и заменено концепцией «тривиальных» и «стандартно-разметочных» типов. [6]
В некоторых контекстах C++ позволяет использовать только типы PDS. Например, a union
в C++98 не может содержать класс, который имеет виртуальные функции или нетривиальные конструкторы или деструкторы. Это ограничение накладывается, поскольку компилятор не может определить, какой конструктор или деструктор следует вызывать для объединения. Типы PDS также могут использоваться для взаимодействия с C , который поддерживает только PDS.
В Java некоторые разработчики считают, что концепция PDS соответствует классу с открытыми членами данных и без методов (Java Code Conventions 10.1), [7] т. е. объекту передачи данных . [8] Другие также включают в концепцию PDS объекты Plain old Java (POJO), класс, который имеет методы, но только геттеры и сеттеры, без логики, и JavaBeans, если они не используют обработку событий и не реализуют дополнительные методы помимо геттеров и сеттеров. [ необходима цитата ] Однако POJO и Java Beans имеют инкапсуляцию и, таким образом, нарушают фундаментальное определение PDS.
Записи (представленные в Java 16 в 2021 году) являются поверхностно неизменяемыми носителями данных без инкапсуляции, и поэтому их также можно считать PDS.
В PHP ассоциативные массивы и stdClass
объекты можно считать PDS. [ необходима цитата ]
Другие структурированные представления данных, такие как XML или JSON, также могут использоваться в качестве PDS, если не используются существенные семантические ограничения.
В Python модуль dataclass предоставляет dataclasss — часто используемые как контейнеры без поведения для хранения данных с опциями проверки данных. Dataclasss в Python, представленные в версии 3.7, которые предоставляют удобный способ создания класса и хранения значений данных. Dataclasss используются для сохранения нашего повторяющегося кода и обеспечения лучшей читаемости. [9]
В языке C структуры используются таким же образом.