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ę?
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ę?
Odpowiedzi:
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).
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.
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 .
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.