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 struct
lub record
ponieważ jest on używany do przechowywania danych i jest to bardzo powszechne w takich językach, jak C
można tam zobaczyć: struct (język programowania C) . Więc osobiście wolałbym użyć struct
zamiast 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 dat
w 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 Interlocked
metod z dat
(lub, jeśli jest to struct, z ich polami), ale nie byłoby to możliwe, gdyby dat
został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 GetData
zwró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 GetData
spowoduje, że zostaną myData
wypełnione danymi z kolekcji, ale myCollection
nie oczekuje się , że będzie zawierać odniesienie do niej po zakończeniu funkcji, ani nie będzie używać jej w żadnym innym celu. StoreData
podobnie kopiowałby informacje myData
do 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 myData
poza pętlą, a następnie użyć tego samego wystąpienia za każdym razem. Podobnie myCollection
może być w stanie ponownie użyć instancji obiektu powiązanej z kluczem (kopiowanie danych z przekazanej instancji) bez konieczności tworzenia nowej instancji.