Come si chiamano le classi senza metodi?


10

Come si chiamano le classi senza metodi?

Per esempio,

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

Sopra è una classe senza alcun metodo. Questo tipo di classe ha un nome speciale?


1
Una classe senza metodi?
ChaosPandion,

11
Il termine tecnico è record o struct .
Kilian Foth,

4
Una "borsa della proprietà"
Martin York,

Kilian: Preferisco la "struttura glorificata" per la connotazione aggiunta.
Jason

Risposte:


23

Il più delle volte: un modello anti.

Perché? Perché facilita la programmazione procedurale con classi e strutture di dati "Operatore". Separare dati e comportamenti che non sono esattamente buoni OOP.

Spesso: un DTO (Data Transfer Object)

Strutture di sola lettura intese allo scambio di dati, derivati ​​da un oggetto business / dominio.

A volte: solo struttura dei dati.

Beh, a volte, devi solo avere quelle strutture per contenere dati che sono semplicemente chiari e semplici e senza operazioni su di essi. Ma poi non userei campi pubblici ma accessori (getter e setter).


4
Scoraggio a tutti di fare lezioni con solo getter / setter pubblici in java, è cerebralmente morto e alcuni container non eseguiranno nemmeno il codice setter / getter (guardando Glassfish ...), quindi o è l'impostazione predefinita o hai un bug. Non credo che l'incapsulamento di OOP fosse giusto, si scopre, il più delle volte, nella maggior parte delle applicazioni, i DTO non sono solo necessari, ma sono le classi più utilizzate. Quindi sono tutt'altro che antipattern, userei invece la parola "blocchi di base".
Aadaam,

8
Sono forse un anti-pattern se ti trovi in ​​un ambiente rigorosamente OO. Per tutto il resto del mondo della programmazione, avere strutture di dati che sono semplici raccolte eterogenee di campi è un chiaro vantaggio rispetto alle alternative e persino incoraggiate in un noto pilastro OO .
Telastyn,

@Aadaam: non mi hai capito bene. Un DTO non è un antipattern. A volte quegli oggetti vanno benissimo se sono DTO! E quando Glassfish non guarda getter e setter, ciò significa solo che glassfish non è ben scritto (anche se è difficile in Java senza gli accessi integrati). Questo codice non è Braindead, è utile come boilerplate.
Falcon,

4
Veloce, @Aadaam. Qualcuno sta impostando un campo su un valore non valido, causando il caos quando viene letto in seguito. Lancia un'eccezione in modo da poter rilevare il colpevole. La prima volta che devi fare una cosa del genere per un campo pubblico utilizzato in 1.000 posti, vorrai un setter. I campi pubblici hanno il loro posto, ma il paradigma getter / setter è popolare per una buona ragione.
Karl Bielefeldt,

@KarlBielefeldt: in una versione glassfish, ho avuto una sola eccezione in un codice setter come test (senza condizioni), che non è mai stato eseguito. La proprietà aveva una variabile privata e due getter-e-setter pubblici. Il container ha semplicemente eluso il setter. Se qualcosa in realtà ha un valore non valido, personalmente preferisco le classi di tipi anziché i valori primitivi, ma forse sono solo io.
Aadaam,

9

Lo chiamerei structo recordperché è usato per l'archiviazione dei dati e questo è molto comune per linguaggi come Cpuoi vedere lì: struct (linguaggio di programmazione C) . Quindi personalmente preferirei usare structuna classe anziché una classe più adatta e leggibile:

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

Di solito sono usati come DTO (Data Transfer Object) come hanno detto gli altri.


4
Il problema con struct è che "struct" è una parola chiave in molte lingue. C # ad esempio tratta le strutture come tipi di valore con semantica diversa. Questo vale anche per "record" in alcune lingue (PL / SQL).
Falcon,

5

Questi sono conosciuti come Plain Old __ Objects (PO_Os) in cui lo spazio vuoto è Java o C o CIL, o qualunque linguaggio tu stia usando.

Se vengono utilizzati come semplici blocchi di dati per la comunicazione, possono essere conosciuti come Data Transfer Objects (DTO).

Se rappresentano alcuni dati forniti esternamente, possono essere conosciuti come Entità .


6
Stai pensando ai POD - un'idea molto diversa. I POJO includono esplicitamente la "logica aziendale", ma escludono dipendenze da determinati quadri.
Tom Hawtin - tackline

I POD possono avere metodi, almeno in C ++. Devono solo avere costruttori banali, distruttori, costruttori di copie e costruttori di assegnazioni, solo membri di dati pubblici, nessuna classe di base e nessuna funzione virtuale. Fondamentalmente, devono solo essere compatibili con le strutture C.
Dirk Holsopple,

2

Definirei tale classe un titolare di dati mutevole e talvolta ho usato un modulo generico:

class DataHolder<T>
{
   public T dat;
}

Si noti che il wrapping datall'interno di una proprietà peggiorerà le prestazioni e non offrirà alcun vantaggio, dal momento che non c'è nulla che un programma di accesso alla proprietà possa fare (tranne leggere / scrivere il campo) che non interrompa alcune implementazioni. Inoltre, potrebbe essere necessario utilizzare Interlockedmetodi con dat(o, se si tratta di una struttura, con i relativi campi), ma ciò non sarebbe possibile se datfossero racchiusi in una proprietà.

Si noti che mentre i titolari di dati mutabili possono essere utili per i tipi (mutabili o meno) che necessitano di conservare i dati, non possono essere tranquillamente utilizzati per lo scambio di dati nello stesso modo dei tipi immutabili. Ad esempio, un'istruzione come:

myData = myCollection.GetData(myKey);

avrebbe un chiaro significato se GetDatarestituito un tipo di classe immutabile o una struttura ("mutabile" o no) che non conteneva riferimenti a dati mutabili. Se restituisse un oggetto di classe mutabile, tuttavia, non sarebbe chiaro se eventuali modifiche a tale oggetto sarebbero costantemente ignorate dalla raccolta sottostante, comporterebbe costantemente aggiornamenti puliti o causerebbe un comportamento fastidioso o imprevedibile che non soddisfa nessuna descrizione.

Se si volesse che una raccolta restituisse i dati in un oggetto mutabile, il paradigma corretto sarebbe spesso qualcosa del tipo:

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

Usando questo approccio, esiste una chiara implicazione che GetDatacauserà il myDatapopolamento dei dati della raccolta, ma myCollectionnon ci si aspetterebbe che mantenga un riferimento ad esso una volta completata la funzione, né lo userebbe per nessun altro scopo. StoreDataallo stesso modo copiare le informazioni myDatanella propria struttura di dati interna senza mantenere un riferimento. Si noti che un vantaggio di questo approccio è che se il codice client leggerà molti elementi di dati all'interno di un ciclo, potrebbe tranquillamente creare un'istanza myDataall'esterno del ciclo e riutilizzarla ogni volta. Allo stesso modo, myCollectionpotrebbe essere in grado di riutilizzare l'istanza dell'oggetto associata alla chiave (copiando i dati dall'istanza passata) senza dover creare una nuova istanza.


0

A seconda del contesto, li chiamo Entità. Sulle mie noiose applicazioni aziendali, di solito mappano 1: 1 sul mio DER.


0

Lo chiamerei a Schema.

Questo riguarda molteplici usi come rappresentare una tabella di database, un record deserializzato, un DTO, ecc

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.