Una raccolta dovrebbe essere incapsulata in una classe se evito l'ossessione primitiva?

3

Vedi il codice qui sotto:

public class Customer
{
    private readonly IList<Order> _orders = new List<Order>();

    public FirstName FirstName { get; set; }
    public LastName LastName { get; set; }
    public Province Province { get; set; }
    public IEnumerable<Order> Orders 
    {
        get { foreach (var order in _orders) yield return order; }
    }

    internal void AddOrder(Order order)
    {
        _orders.Add(order);
    }
}  

Si noti che ho rimosso Obsession Primitive per FirstName; Cognome e Provincia. Si noti che ho anche un elenco di ordini, che viene restituito tramite un oggetto IEnumerable. Ho fatto questa domanda il mese scorso: Che cosa è il vantaggio di incapsulare una raccolta all'interno di una classe?

Ho deciso di non incapsulare l'elenco all'interno di un oggetto alla fine. Tuttavia, questo ha ancora l'odore dell'ossessione primitiva? Sto cercando di evitare l'ossessione primitiva in modo coerente.

Dovrei fare:

private readonly OrderList _orders = OrderList();

Invece di:

private readonly IList<Order> _orders = new List<Order>();
    
posta w0051977 26.01.2018 - 17:52
fonte

2 risposte

4

Una raccolta non ha bisogno di essere incapsulata all'interno di una classe per evitare l'ossessione primitiva. Il tuo esempio di codice evita già l'uso delle primitive.

Se avessi esposto una raccolta private IList<String> _emailAddresses = ... , allora forse dovresti prendere in considerazione la possibilità di creare una classe Email che sia stata eliminata usando il tipo String incorporato.

    
risposta data 26.01.2018 - 22:30
fonte
5

In primo luogo, capovolgiamo "evitando l'ossessione primitiva" da un negativo al positivo che stiamo cercando di ottenere, "Strong Typing".

Questo significa che non vogliamo assegnare accidentalmente una temperatura in Fahrenheit a una variabile che ha lo scopo di mantenere una temperatura Celsius.

Quindi, invece di

double temp = 23.2;
double temp2 = 75.7;

//... lots of code

temp2 = temp; //BUG!

Vogliamo

Celsius temp = new Celsius(23.2);
Fahrenheit temp2 = new Fahrenheit(75.7);

//... lots of code

temp2 = temp; // Won’t compile. No bug!

Ora pensiamo per un momento a come diciamo questa firma in inglese.

IEnumerable<Order>

Diciamo "IEnumerable of Order". Questo tipo è già strongmente digitato. Non possiamo assegnare un IEnumerable<Customer> alle variabili di tipo IEnumerable<Order> . Il tuo codice va bene così com'è.

    
risposta data 27.01.2018 - 13:01
fonte

Leggi altre domande sui tag