Design di classe e riferimenti a oggetti

0

Ecco un esempio molto semplice di ciò che sto cercando di fare. Nella realtà ci sono più relazioni ma non qualcosa di estremo o di memoria pesante.

public class ClassA : ISomething
{
    public double property { get; set; }
    ...
    public ClassB classb { get; set; }
}

public class ClassB : ISomething2
{
    public double Length { get; set; }
    ...
}

public class MyProject : BaseProject
{
    public IEnumerable<ISomething> ISomethings { get; set; }
    ...
    public IEnumerable<ISomething2> ISomethings2 { get; set; }
    ...
}

Il problema qui è che devo mantenere un elenco di MyProject . ISomethings2 e poi classb proprietà di ClassA per fare riferimento solo a un elemento esistente in MyProject . ISomethings2 list. La cosa difficile qui è che:

  • La rimozione di un elemento da ISomething2 dovrebbe rimuovere tutti i riferimenti (proprietà classb delle istanze ClassA da impostare su null)
  • Impedisci agli altri sviluppatori di impostare la proprietà classb su un oggetto non esistente nell'elenco o su un nuovo oggetto creato dall'utente.
  • Gli oggetti in MyProject . ISomethings2 potrebbero essere aggiunti senza dover fare riferimento da altrove.

Queste classi vengono utilizzate per la descrizione del progetto non per il database . Come quando apri un file di progetto per un'applicazione. Pertanto, la modifica di una proprietà in ClassB dovrebbe essere visibile a tutti poiché è lo stesso riferimento a un oggetto. Esiste uno schema per ottenere ciò che voglio senza molto accoppiamento? Anche progetti / approcci alternativi sono ben accetti.

    
posta GorillaApe 06.03.2015 - 15:32
fonte

2 risposte

1

Is there a pattern to achieve what I want without much coupling?

Non proprio, dal momento che ciò che si vuole fare "quando X accade, voglio fare Y su queste altre cose" è accoppiato per definizione. Il che rende anche questo un progetto piuttosto indesiderato per il problema in questione.

Se dovessi lavorare con questo, inizierei cercando di rendere le classi immutabili (almeno pubblicamente) e controllate dal progetto. Se non puoi impostare la proprietà classb sull'oggetto, non c'è modo di impostarla come non valida. Invece la classe del progetto può farlo (insieme a regole di validazione e possibili ottimizzazioni come il conteggio dei riferimenti, forse).

Ma sinceramente, mi impegnerei molto per non lavorare con questo. Il progetto qui è un gestore degli altri oggetti. Costringere le istanze di classe in una raccolta esterna è lordo e non corretto. Occasionalmente è un po 'necessario (i giochi lo fanno specialmente), ma dovrebbe essere evitato dove possibile e usato con cura altrimenti. Senza saperne di più sul problema che stai cercando di risolvere, non posso dire con certezza in quale contesto cada.

    
risposta data 06.03.2015 - 16:22
fonte
0

Nota: presumo che la lingua sia C #. Se è Java, dovrebbero esistere meccanismi simili.

  • Se desideri tenere traccia delle modifiche alle proprietà di ClassA , puoi utilizzare INotifyPropertyChanged .

  • Se desideri tenere traccia delle modifiche alla sequenza ISomethings2 , anziché IEnumerable<T> , utilizza ObservableCollection<T> .

  • Se hai solo bisogno di mantenere la sequenza ISomethings2 sincronizzata con ISomethings , riscrivi la proprietà come:

    public IEnumerable<ISomething2> ISomethings2
    {
        get
        {
            return this.ISomethings.Select(c => c.classb);
        }
    }
    

Se questo non ti dà una risposta, considera la possibilità di modificare la tua domanda. La sua forma attuale è molto poco chiara a causa della mancanza di terminologia corretta e nomi criptici del tuo esempio. Nota inoltre che al momento non puoi rimuovere nulla da ISomethings2 , dato il suo tipo.

    
risposta data 06.03.2015 - 16:18
fonte

Leggi altre domande sui tag