Avere i miei oggetti così consapevoli di ogni interconnessione è una cosa brutta?

2

Sto cercando di refactoring un design esistente; spostare un sacco di cose da un database e in memoria dove dovrebbe essere (ci sono molte ragioni per cui l'approcio del DB è pericoloso come lo è ora). Il mio primo atto è stato quello di prendere tutti gli oggetti esistenti e di espandere più stato per loro. Gli oggetti precedenti erano nuovi solo per i loro genitori, e così è stato. Dal bambino più piccolo si poteva camminare per trovare i genitori, ma non si poteva chiedere "quali sono i bordi su questo nodo".

Ho cambiato le cose per rendere lo stato più accessibile da ogni oggetto. Ora ogni oggetto conosce efficacemente il suo genitore e tutti i suoi figli. Ho pensato che fosse un'evidente semplificazione che avrebbe reso molto più semplice l'archiviazione delle cose in memoria. Il problema è che ho bisogno di essere in grado di costruire oggetti senza modificare il mio modello, fino a quando non viene chiamato addToModel, il che significa che devo essere in grado di costruire oggetti in uno stato, e quindi aggiornare alcuni dei loro stati per essere coerenti con lo stato del modello e rappresenta correttamente tutta l'interconnessione (il nodo deve essere informato quando viene aggiunto un bordo, il bordo deve sapere quali sono i percorsi ecc. ecc.)

Ciò si è dimostrato sorprendentemente complicato da mantenere coerente. Finisco con entrambi i problemi di incapsulamento (come supponendo che ogni oggetto sappia di non chiamare i metodi del pacchetto scope che cambiano la memoria da metodi pubblici che non dovrebbero essere in grado di cambiare stato), così come una preoccupazione sull'aliasing (cosa succede se qualcuno crea un nuovo Nodo A senza connessioni, quando il mio Modello dice che il nodo A deve essere collegato a B, C ed E?). Ho pensato a molti approcci che funzionano, ma nessuno si sente "pulito". È il problema che sto cercando di rendere i miei oggetti troppo consapevoli dello stato, e quindi mettendo troppo impegno sul mio modello per mantenere questo stato?

    
posta dsollen 29.04.2013 - 17:15
fonte

2 risposte

0

Questo è il motivo per cui le liste collegate non sono collegate in modo doppio. A prima vista sembra che il doppio collegamento sia più facile, ma in breve tempo ti rendi conto che l'effettiva implementazione di una singola lista concatenata è molto più semplice.

Quindi ti riferisci al modello in questo modo essendo una ovvia semplificazione; ma stanno arrivando a rendersi conto che in realtà non è così. Meno un dato oggetto sa, più semplice sarà l'implementazione e il mantenimento a lungo termine. Questo è il motivo per cui è meglio fare in modo che gli oggetti sappiano solo quanto è necessario, quindi aggiungere lo stato / memoizzazione solo quando le attività che lavorano con il modello diventano eccessivamente difficili. Pesate gli scenari di cui avete bisogno per conto di ogni pezzo di stato aggiungete a un oggetto rispetto all'implementazione necessaria per gestire senza quel bit di stato aggiunto all'oggetto.

Un altro modo per assicurare una manutenzione più semplice del tuo modello è quello di rendere immutabili tutti gli oggetti che non necessitano della necessaria mutabilità. Ciò riduce di nuovo la quantità di implementazione poiché quelle parti dei tuoi modelli non devono tenere conto degli scenari di aggiornamento.

    
risposta data 29.04.2013 - 17:27
fonte
0

Puoi esternare i bordi dai tuoi nodi e usare qualcos'altro per modificare / interrogare le connessioni. Per esempio guarda JUNG (java graph library) dove nodi e bordi possono essere qualsiasi cosa e tu dici al grafico che dovrebbe contenere nodi (s) e spigoli tra loro. E ci sono implementazioni multiple (build in sono IIRC densi e sparsi, ma puoi crearne di tuoi). Chiunque abbia accesso al grafico può interrogarlo e modificarlo, ma è possibile creare una vista grafico (qualcosa con solo metodi di interrogazione e passare solo all'esterno, non l'oggetto grafico stesso).

    
risposta data 29.04.2013 - 17:32
fonte

Leggi altre domande sui tag