Як ви називаєте заняття без методів?


10

Як ви називаєте заняття без методів?

Наприклад,

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

Вище - клас без жодних методів. Чи має цей тип класу спеціальну назву?


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

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

4
«Сумка з майном»
Мартін Йорк

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

Відповіді:


23

Більшість часу: анти-візерунок.

Чому? Тому що це сприяє процедурному програмуванню з класами та структурами даних "Оператор". Ви розділяєте дані та поведінку, що не зовсім добре OOP.

Часто: DTO (Об'єкт передачі даних)

Читати лише структури даних, призначені для обміну даними, отриманими від об'єкта бізнес / домен.

Іноді: Просто структура даних.

Ну іноді, ви просто повинні мати ті структури, щоб зберігати дані, які є просто і просто, і не має операцій над ним. Але тоді я б не використовував публічні поля, а лише аксесуари (геттери та сетери).


4
Я заважаю всім робити заняття лише з громадськими геттерами / сетерами в java, це мертвий мозок, а деякі контейнери навіть не запускають код сеттера / геттера (дивлячись на Glassfish ...), так що або це за замовчуванням, або у вас є помилка. Я не вірю, що OOP-капсуляція була правильною, виявляється, більшу частину часу в більшості додатків DTO не тільки потрібні, але вони є найбільш часто використовуваними класами. Тож вони є не що інше, як анти малюнок, замість цього я б використав слово "базові будівельні блоки".
Аадаам

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

@Aadaam: Ви мене не зрозуміли правильно. DTO не є антипатерном. Іноді ці об'єкти ідеально прекрасні, якщо вони є ЗНО! А коли Glassfish не дивиться на геттерів та сетерів, це означає лише, що про склографах не так добре написано (хоча в Java важко без вбудованих аксесуарів). Цей код не є мозком, це корисна табличка.
Сокіл

4
Швидкий, @Aadaam. Хтось встановив поле недійсному значенню, спричинивши хаос, коли воно буде прочитане пізніше. Киньте виняток, щоб ви могли виявити винуватця. Перший раз, коли вам доведеться зробити щось подібне для публічного поля, яке використовується в 1000 місцях, ви захочете встановити сетер. Загальнодоступні поля мають своє місце, але парадигма геттера / сетера популярна з поважних причин.
Карл Білефельдт

@KarlBielefeldt: в одній версії скловолокна я мав єдиний виняток у коді сеттера як тест (без умов), який ніколи не виконувався. У власність була приватна змінна та два громадські дільниці. Контейнер просто обійшов сетер. Якщо щось насправді має недійсне значення, я особисто віддаю перевагу класам типу замість примітивних значень, але, можливо, це лише я.
Аадаам

9

Я б назвав це structабо recordтому, що він використовується для зберігання даних, і це дуже часто для таких мов, як, Cяк ви бачите там: struct (мова програмування на C) . Тож особисто я вважаю за краще використовувати structзамість класу, який є більш підходящим і читабельним:

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

Зазвичай вони використовуються як DTO (Object Transfer Data), як говорили інші.


4
Проблема Struu полягає в тому, що "struct" - це ключове слово у багатьох мовах. Наприклад, C # трактує структури як типи значень, які мають різну семантику. Це справедливо і для "запису" на деяких мовах (PL / SQL).
Сокіл

5

Вони відомі як Plain Old __ Objects (PO_Os), де порожнім є Java або C або CIL, або будь-якою мовою ви користуєтеся.

Якщо вони використовуються як прості блоки даних для зв'язку, то вони можуть називатися об'єктами передачі даних (DTO).

Якщо вони представляють деякі надані зовні дані, вони можуть бути відомими як Суб'єкти .


6
Ви думаєте про ПОД - зовсім інша ідея. POJO явно включають "бізнес-логіку", але виключають залежності від конкретних рамок.
Том Хотін - тайклін

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 до мого ПЕР.


0

Я б назвав це Schema.

Це охоплює багаторазове використання, таке як представлення таблиці баз даних, або десеріалізованої записи, або DTO тощо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.