Co nazywacie klasami bez metod?

10

Co nazywacie klasami bez metod?

Na przykład,

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

Powyżej jest klasa bez żadnych metod. Czy ten typ klasy ma specjalną nazwę?

użytkownik52343
źródło
1
Klasa bez metod?
ChaosPandion,
11
Termin techniczny to zapis lub struktura .
Kilian Foth,
4
„Torba na nieruchomości”
Martin York,
Kilian: Wolę „glorified struct” dla dodatkowej konotacji.
Jason

Odpowiedzi:

23

Przez większość czasu: anty-wzór.

Dlaczego? Ponieważ ułatwia programowanie proceduralne za pomocą klas i struktur danych „Operator”. Oddzielasz dane i zachowania, które nie są do końca dobrym OOP.

Często: A DTO (Data Transfer Object)

Struktury danych tylko do odczytu przeznaczone do wymiany danych, pochodzące z obiektu biznesowego / domeny.

Czasami: po prostu struktura danych.

Czasami trzeba mieć takie struktury do przechowywania danych, które są proste i proste i nie można na nich operować. Ale wtedy nie używałbym pól publicznych, ale akcesoriów (getterów i seterów).

Sokół
źródło
4
Odradzam wszystkim chodzenie na zajęcia tylko z publicznymi programami pobierającymi / ustawiającymi w java, jest to mózg beznadziejny, a niektóre pojemniki nawet nie uruchamiają kodu ustawiającego / pobierającego (patrząc na Glassfish ...), więc albo jest to ustawienie domyślne, albo masz pluskwa. Nie wierzę, że enkapsulacja OOP była słuszna, okazuje się, że w większości aplikacji DTO są nie tylko potrzebne, ale są najczęściej używanymi klasami. Więc są niczym innym niż antypatternami, zamiast tego użyłbym słowa „podstawowe elementy konstrukcyjne”.
Aadaam,
8
Mogą być anty-wzorcem, jeśli jesteś w środowisku OO. Dla całej reszty świata programowania posiadanie struktur danych, które są prostymi heterogenicznymi zbiorami pól, stanowi wyraźną korzyść w porównaniu z alternatywami, a nawet zachęca w jednym z dobrze znanych baz OO .
Telastyn
@Aadaam: Nie zrozumiałeś mnie dobrze. DTO nie jest antypatternem. Czasami te obiekty są całkowicie w porządku, jeśli są DTO! A gdy Glassfish nie patrzy na programy pobierające i ustawiające, oznacza to tylko, że glassfish nie jest dobrze napisany (chociaż w Javie jest trudno bez wbudowanych akcesoriów). Ten kod nie jest braindeadem, to przydatny szablon.
Falcon,
4
Szybko, @Aadaam. Ktoś ustawia pole na nieprawidłową wartość, siejąc spustoszenie, gdy zostanie odczytane później. Rzuć wyjątek, abyś mógł wykryć winowajcę. Za pierwszym razem, gdy musisz zrobić coś takiego na polu publicznym wykorzystywanym w 1000 miejscach, będziesz chciał setera. Pola publiczne mają swoje miejsce, ale paradygmat getter / setter jest popularny nie bez powodu.
Karl Bielefeldt,
@KarlBielefeldt: w jednej wersji Glassfish miałem jeden wyjątek w kodzie Settera jako test (bez warunków), który nigdy nie został wykonany. Właściwość miała zmienną prywatną i dwa publiczne obiekty pobierające i ustawiające. Pojemnik po prostu ominął setera. Jeśli coś faktycznie ma niepoprawną wartość, osobiście wolę klasy zamiast wartości pierwotnych, ale może to tylko ja.
Aadaam,
9

Nazwałbym to structlub recordponieważ jest on używany do przechowywania danych i jest to bardzo powszechne w takich językach, jak Cmożna tam zobaczyć: struct (język programowania C) . Więc osobiście wolałbym użyć structzamiast klasy, która jest bardziej odpowiednia i czytelna:

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

Zazwyczaj są one używane jako DTO (Data Transfer Object), jak powiedzieli inni.

Omar
źródło
4
Problem ze strukturą polega na tym, że „struct” to słowo kluczowe w wielu językach. Na przykład C # traktuje struktury jako typy wartości, które mają różne semantyki. Dotyczy to również „nagrywania” w niektórych językach (PL / SQL).
Falcon,
5

Są one znane jako Plain Old __ Objects (PO_Os), gdzie puste to Java, C lub CIL, lub inny używany język.

Jeśli są one używane jako proste bloki danych do komunikacji, można je nazwać obiektami przesyłania danych (DTO).

Jeśli reprezentują niektóre dane dostarczone zewnętrznie, mogą być znane jako Encje .

Telastyn
źródło
6
Myślisz o POD - zupełnie innym pomyśle. POJO wyraźnie obejmują „logikę biznesową”, ale wykluczają zależności od konkretnych platform.
Tom Hawtin - tackline
POD mogą mieć metody, przynajmniej w C ++. Muszą mieć tylko trywialne konstruktory, destruktor, konstruktory kopiujące i konstruktory przypisań, tylko publiczne elementy danych, bez klas podstawowych i bez funkcji wirtualnych. Zasadniczo muszą po prostu być kompatybilne ze strukturami C.
Dirk Holsopple,
2

Nazwałbym taką klasę zmiennym posiadaczem danych i czasami użyłem formy ogólnej:

class DataHolder<T>
{
   public T dat;
}

Zauważ, że zawijanie datw obrębie właściwości obniży wydajność i nie przyniesie żadnych korzyści, ponieważ dostęp do właściwości nie może zrobić (poza odczytem / zapisem pola), co nie złamałoby niektórych implementacji. Ponadto może być konieczne użycie Interlockedmetod z dat(lub, jeśli jest to struct, z ich polami), ale nie byłoby to możliwe, gdyby datzostały opakowane we właściwość.

Należy zauważyć, że chociaż zmienne uchwyty danych mogą być przydatne dla typów (zmiennych lub nie), które muszą przechowywać dane, nie można ich bezpiecznie używać do wymiany danych w taki sam sposób, jak w przypadku typów niezmiennych. Na przykład zdanie takie jak:

myData = myCollection.GetData(myKey);

miałoby jasne znaczenie, gdyby GetDatazwrócił niezmienny typ klasy lub strukturę („zmienną” lub nie), która nie zawierała odwołań do zmiennych danych. Jeśli jednak zwróci zmienny obiekt klasy, nie będzie jasne, czy jakiekolwiek zmiany w tym obiekcie będą konsekwentnie ignorowane przez kolekcję podstawową, konsekwentnie skutkują czystymi aktualizacjami tego obiektu, czy też spowodują jakieś nieprzyjemne lub nieprzewidywalne zachowanie niespełniające żadnego opisu.

Jeśli ktoś chciałby mieć kolekcję zwracającą dane w zmiennym obiekcie, poprawny paradygmat często byłby podobny do:

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

Stosując to podejście, istnieje wyraźna implikacja, która GetDataspowoduje, że zostaną myDatawypełnione danymi z kolekcji, ale myCollectionnie oczekuje się , że będzie zawierać odniesienie do niej po zakończeniu funkcji, ani nie będzie używać jej w żadnym innym celu. StoreDatapodobnie kopiowałby informacje myDatado swojej wewnętrznej struktury danych bez zachowania odniesienia. Należy zauważyć, że jedną z zalet tego podejścia jest to, że jeśli kod klienta będzie odczytywał wiele elementów danych w pętli, może bezpiecznie utworzyć jedno wystąpienie myDatapoza pętlą, a następnie użyć tego samego wystąpienia za każdym razem. Podobnie myCollectionmoże być w stanie ponownie użyć instancji obiektu powiązanej z kluczem (kopiowanie danych z przekazanej instancji) bez konieczności tworzenia nowej instancji.

supercat
źródło
0

W zależności od kontekstu nazywam je bytami. W moich nudnych aplikacjach biznesowych zwykle mapują one 1: 1 do mojego DER.

Machado
źródło
0

Nazwałbym to Schema.

Obejmuje to wiele zastosowań, takich jak reprezentowanie tabeli bazy danych, zdezrializowanego rekordu lub DTO itp

userSteve
źródło