Что вы называете классами без методов?


10

Что вы называете классами без методов?

Например,

class A
{
  public string something;
  public int a;
}

Выше класс без каких-либо методов. У этого типа класса есть специальное имя?


1
Класс без метода?
ChaosPandion

11
Технический термин - запись или структура .
Килиан Фот

4
«Мешок с недвижимостью»
Мартин Йорк,

Килиан: Я предпочитаю "прославленную структуру" для добавленной коннотации.
Джейсон

Ответы:


23

Большую часть времени: анти образец.

Почему? Потому что это облегчает процедурное программирование с помощью классов «Оператор» и структур данных. Вы разделяете данные и поведение, что не совсем хорошо ООП.

Часто: DTO (объект передачи данных)

Структуры данных только для чтения, предназначенные для обмена данными, полученными из объекта бизнеса / домена.

Иногда: просто структура данных.

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


4
Я не рекомендую всем делать классы только с общедоступными методами получения / установки в java, это просто умопомрачительно, и некоторые контейнеры даже не запускают код установки / получения (глядя на Glassfish ...), так что либо это по умолчанию, либо у вас есть ошибка. Я не верю, что инкапсуляция ООП была правильной, оказывается, что в большинстве приложений DTO не только нужны, но и являются наиболее часто используемыми классами. Так что они совсем не антипаттерны, я бы вместо этого использовал слово «основные строительные блоки».
Аадам

8
Они могут быть анти-паттерном, если вы находитесь в строго ОО-среде. Для всего остального мира программирования наличие структур данных, представляющих собой простые неоднородные наборы полей, является явным преимуществом по сравнению с альтернативами, и даже поощряется в одной хорошо известной опоре OO .
Теластин

@Aadaam: Вы не поняли меня правильно. DTO не является антипаттерном. Иногда эти объекты прекрасно работают, если они DTO! А когда Glassfish не смотрит на геттеры и сеттеры, это означает, что Glassfish не очень хорошо написан (хотя в Java это сложно сделать без встроенных средств доступа). Этот код не мозговой мертвец, это полезный шаблон.
Сокол

4
Быстро, @Aadaam. Кто-то устанавливает поле в недопустимое значение, что приводит к хаосу, когда оно читается позже. Бросьте исключение, чтобы вы могли обнаружить виновника. В первый раз, когда вам нужно будет сделать что-то подобное для публичного поля, используемого в 1000 местах, вам понадобится сеттер. Публичные поля имеют свое место, но парадигма getter / setter популярна по уважительной причине.
Карл Билефельдт

@KarlBielefeldt: в одной версии Glassfish у меня было одно исключение в коде установщика в качестве теста (без условий), который никогда не выполнялся. У свойства была закрытая переменная и два открытых метода получения и установки. Контейнер просто обошел сеттер. Если что-то действительно имеет недопустимое значение, лично я предпочитаю классы типов вместо примитивных значений, но, возможно, это только я.
Аадам

9

Я бы назвал это structили recordпотому, что он используется для хранения данных, и это очень часто встречается в таких языках, Cкак вы можете видеть здесь: struct (язык программирования C) . Поэтому лично я предпочел бы использовать structвместо класса более подходящий и читаемый:

struct A
{
  public string something;
  public int a;
}

Обычно они используются как DTO (объект передачи данных), как и другие.


4
Проблема со структурой заключается в том, что во многих языках «структура» является ключевым словом. C #, например, рассматривает структуры как типы значений, которые имеют различную семантику. Это также верно для «записи» в некоторых языках (PL / SQL).
Сокол

5

Они известны как простые старые __- объекты (PO_O), где пробел - это Java, C или CIL, или любой другой язык, который вы используете.

Если они используются в качестве простых блоков данных для связи, то их можно назвать объектами передачи данных (DTO).

Если они представляют некоторые внешние данные, они могут быть известны как сущности .


6
Вы думаете о PODs - совсем другая идея. POJO явно включают «бизнес-логику», но исключают зависимости от конкретных структур.
Том Хотин - tackline

POD разрешено иметь методы, по крайней мере, в C ++. Они просто должны иметь только тривиальные конструкторы, деструктор, конструкторы копирования и конструкторы присваивания, только открытые члены данных, никаких базовых классов и никаких виртуальных функций. По сути, они просто должны быть совместимы со структурами Си.
Дирк Холсоппл

2

Я бы назвал такой класс изменчивым держателем данных, и иногда использовал общую форму:

class DataHolder<T>
{
   public T dat;
}

Обратите внимание, что перенос datв свойство снижает производительность и не дает никаких преимуществ, поскольку средство доступа к свойствам ничего не может сделать (кроме чтения / записи поля), что не нарушило бы некоторые реализации. Кроме того, может потребоваться использование Interlockedметодов с dat(или, если это структура, с их полями), но это было бы невозможно, если бы они datбыли заключены в свойство.

Обратите внимание, что, хотя держатели изменяемых данных могут быть полезны для типов (изменяемых или нет), которым необходимо хранить данные, их нельзя безопасно использовать для обмена данными так же, как и неизменяемые типы. Например, утверждение типа:

myData = myCollection.GetData(myKey);

будет иметь ясное значение, если будет GetDataвозвращен неизменный тип класса или структура («изменяемая» или нет), которая не содержит ссылок на изменяемые данные. Однако, если он вернул изменяемый объект класса, было бы неясно, будут ли какие-либо изменения в этом объекте последовательно игнорироваться базовой коллекцией, постоянно приводить к чистым обновлениям или вызывать какое-то утомительное или непредсказуемое поведение, не соответствующее ни одному описанию.

Если бы кто-то хотел, чтобы коллекция возвращала данные в изменяемом объекте, правильная парадигма часто была бы чем-то вроде:

var myData = new WhateverType();
myCollection.GetData(myKey, myData);
myData.ModifySomehow();
myCollection.StoreData(myKey, myData);

При использовании этого подхода есть явное следствие, GetDataкоторое приведет myDataк заполнению данными из коллекции, но myCollectionне следует ожидать , что она будет сохранять ссылку на нее после завершения функции и не будет использовать ее для каких-либо других целей. StoreDataбудет также копировать информацию myDataв свою внутреннюю структуру данных без сохранения ссылки. Обратите внимание, что одним из преимуществ этого подхода является то, что если клиентский код будет читать много элементов данных в цикле, он может безопасно создать один экземпляр myDataвне цикла, а затем повторно использовать тот же экземпляр каждый раз до конца. Аналогично, myCollectionможет быть возможность повторно использовать экземпляр объекта, связанный с ключом (копирование данных из переданного экземпляра), без необходимости создания нового экземпляра.


0

В зависимости от контекста я называю их сущностями. В моих скучных бизнес-приложениях они обычно отображают 1: 1 для моего DER.


0

Я бы назвал это Schema.

Это охватывает многократное использование, например представление таблицы базы данных, десериализованной записи, DTO и т. Д.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.