Implementazione di un albero modificabile pubblicamente in cui ogni nodo deve contenere dati di implementazione privati

0

Sto cercando di implementare una struttura dati ad albero che i chiamanti del mio codice pubblicano per farmi operare. L'idea è che il chiamante possa tenere un riferimento ai nodi dall'albero e modificare i loro dati (sia attributi che figli), il che innesca un evento che richiede al mio codice di aggiornare un rendering visivo dell'albero.

Il problema che ho è che ogni nodo deve anche contenere alcuni dati privati (un riferimento all'elemento visivo corrispondente) che non voglio avere l'inquinamento dell'interfaccia pubblica dell'oggetto nodo . I dati privati devono essere accessibili dalla classe principale che gestisce l'oggetto tree.

I potrebbe decidere di attaccare i dati privati alla mia interfaccia pubblica in questo modo:

class Node
{
    public int NodeData;
    public List<Node> ChildNodes;

    public object PrivateVisualizationData;
}

class TreeControl
{
    public Node RootNode;

    // Use "PrivateVisualizationData" fields on node objects
}

Tuttavia, questo presenta due problemi mentre lo vedo:

  1. Ogni consumatore di Node vedrà il campo PrivateVisualizationData , che potrebbe confondere
  2. Il codice esterno potrebbe modificare i miei dati privati, interrompendo il codice che ne ha bisogno

Come potrei progettare questa struttura in modo che ogni nodo abbia dati personalizzati associati ad esso, ma i dati non sono accessibili esternamente? Vorrei evitare il costo di gestione di una tabella di ricerca separata, se possibile, ma potrebbe essere quello che finisco per fare.

    
posta Wasabi Fan 18.08.2016 - 11:57
fonte

2 risposte

1

Potresti provare qualcosa di simile a questo:

    class Node
    {
        public int NodeData;
        public List<Node> ChildNodes;
    }

    class TreeControlNode extends Node
    {
        public object PrivateVisualizationData;
    }

    class TreeControl
    {
        private TreeControlNode RootNode;
        public Node GetRootNode()
        {
            return (Node)RootNode;
        }

        // Use "PrivateVisualizationData" fields on node objects
    }

L'ereditarietà della classe Node consente di utilizzare tutti i membri e i metodi del nodo mentre si aggiungono ancora i dati speciali. Restituendo il tuo "RootNode" come classe Node, l'utente deve solo noi membri e metodi del nodo.

    
risposta data 18.08.2016 - 14:44
fonte
0

La tua scommessa migliore è probabilmente quella di fornire alcuni metadati aggiuntivi per i membri che non vuoi mostrare:

class Node
{
    public int NodeData;
    public List<Node> ChildNodes;

    [Hide]
    public object PrivateVisualizationData;
}

Il tuo codice UI può quindi verificare la presenza dell'attributo [Hide] e inibire la visualizzazione.

Se la tua interfaccia utente è sull'altro oggetto, allora questo non è in realtà diverso dalla solita separazione delle preoccupazioni che accompagna, ad esempio, un progetto MVVM. La tua classe che rappresenta l'oggetto UI è il ViewModel; semplicemente copi quegli elementi che si applicano dal tuo oggetto di dominio (TreeControl) nel tuo ViewModel, e solo quei campi vengono visualizzati.

    
risposta data 18.08.2016 - 17:33
fonte

Leggi altre domande sui tag