Progettazione di proprietà ListClass nidificate in una classe

0

Sono attualmente nella fase di modellazione di classe del mio progetto.

Scenario della vita reale: Diciamo che ho un progetto composto da componenti principali e ogni componente principale è composto da componenti secondari e ciascuno dei componenti secondari utilizza più materiali.

Ho creato una classe basata sulle entità:

public class Project
{
    public List<MainComponent> MainComponents {get; set;}
    // other properties..
}

public class MainComponent
{
    public List<SubComponent> SubComponents {get;set;}
    //other properties..
}

public class SubComponents
{
    public List<Material> Materials {get;set;}
    //other properties..
}

public class Material
{
    //properties..
}

Tuttavia avrò difficoltà ad accedere a un materiale perché dovrò passare attraverso un ciclo foreach annidato

Diciamo che projectAlpha è un'istanza esistente di una classe Project

foreach(MainComponent mainComponent in projectAlpha.MainComponents)
{
    foreach(SubComponent subComponent in mainComponent)
    {
        foreach(Material material in subComponent.Materials)
        {
            //do something with material here..
        }
    }
}

Quali sono i modi efficaci per progettare una classe basata su entità progettate in questo modo? (Evita loop annidati).

    
posta Blues 27.08.2014 - 06:34
fonte

2 risposte

1

Non penso che il tuo design sia cattivo o debba essere sostituito. Quello che hai è simile al Pattern di componenti . Tuttavia, potresti prendere in considerazione l'introduzione di alcune generalizzazioni dal modello (a seconda del tuo caso d'uso reale!).

Se l'accesso a tutti i materiali da un progetto è un modello di utilizzo comune di un progetto, piuttosto che implementare i cicli nidificati in ogni luogo, è necessario effettuare il recupero del materiale un'operazione su Progetto, ad esempio Project.AllMaterials . Questo potrebbe essere implementato utilizzando un ciclo e la delega a MainComponent.AllMaterials , che, a sua volta, viene implementato da un ciclo e una delega a SubComponent.Materials . I loop nidificati vengono quindi distribuiti sulle classi e nessun client deve preoccuparsi delle proprie strutture dati interne. Più importante, non è necessario reimplementare questi loop mai più!

Spero che questo aiuti!

    
risposta data 27.08.2014 - 08:12
fonte
0

Potresti mantenere una mappa cancellata dall'ID materiale.

Ogni voce potrebbe essere un elenco collegato di mainComponent e subComponent che utilizza il materiale e forse un riferimento all'oggetto materiale stesso.

Devo aggiungere che dovresti fare attenzione a cancellare la voce dell'indice se elimini l'oggetto "materiale". La garbage collection non elimina alcun oggetto che abbia un riferimento valido.

    
risposta data 27.08.2014 - 06:51
fonte

Leggi altre domande sui tag