2015-01-28 30 views
6

Ho questi metodi di istanza nella mia implementazione Java di albero binario e Ricerca albero binario: getSize(), getHeight(), getDepth(), getPreOrder(), getInOrder(), getPostOrder() e getLevelOrder(). Questi metodi utilizzano la radice dell'albero in altri metodi ricorsivi che hanno un parametro Node. Che è più appropriata da utilizzare dal punto di vista della OOP:albero binario metodi statici in Java

  1. Usando questi metodi ricorsivi come metodi statici, perché utilizzano un oggetto (Node) che non appartiene alla classe effettiva, e don 't utilizzare tutti gli attributi di classe,
  2. possono essere metodi di istanza perché possono utilizzare in una struttura secondaria di questo albero e non usano alcun attributi statici,
  3. o possono essere in altra classe statico come UtilsTree()?
+0

'usano un oggetto (Nodo)' quindi possono essere metodi non statici di 'Nodo'? – njzk2

risposta

3

Da una prospettiva OOP credo che l'approccio numero 2 sia la strada da percorrere. (Statica sono, in generale, spesso malvista in OOP.)

Da quanto ho capito, il metodo utilizza this come root, e poi attraversa il resto della struttura senza chiamare alcun metodi di istanza? Questo non è male considerando che gli altri nodi sono della stessa classe, il che significa che il codice è già condiviso tra tutti gli oggetti. (Il metodo può accedere ai membri privati ​​di altri casi e così via.)

Detto questo, credo getSize, getHeight, getDepth, getPreOrder, getInOrder, getPostOrder e getLevelOrder possono tutti essere implementati come adeguati metodi di istanza ricorsivi. (Correggetemi se ho torto.)

Una quarta opzione che non è male sarebbe utilizzare un modello di visitatore e avere un'interfaccia NodeVisitor.

+0

Pertanto, in OOP, è meglio eseguire metodi ricorsivi di istanza rispetto ai metodi ricorsivi statici? – RobinHood

+0

Direi che è preferibile. Anche se penso che le ragioni siano più sulla leggibilità e sulla comprensione del funzionamento del codice piuttosto che sui principi di orientamento agli oggetti. Intendo dire che attraversare la sottostruttura all'interno del metodo dell'oggetto radice non viola l'incapsulamento o altro. – aioobe

1

Alcuni di questi metodi dovrebbero sicuramente essere membri non statici poiché si riferiscono direttamente a un'istanza specifica.

tree.getSize() o tree.getDepth() è molto più facile da leggere e da leggere rispetto a BinaryTree.getDepth(tree).

Tuttavia si potrebbe sostenere che i metodi getPreOrder(), getInOrder(), getPostOrder() possono essere statici o addirittura nella propria classe. Puoi pensare a questo come a StrategyPattern per come camminare sull'albero.

TraversalStrategy.PREORDER.walk (albero);

potrebbe essere una buona idea invece di aggiungere altri metodi. In questo modo, se mai bisogno di aggiungere diversi modi per raggiungere a piedi l'albero che non c'è bisogno di continuare ad aggiungere metodi per BinaryTree (seguendo il principio aperto-chiuso)

+0

Penso che tree.getSize() sia il modo migliore per ottenere la dimensione dell'albero, ma il metodo ricorsivo, che è chiamato da getSize() come getSize (root), potrebbe usare un nodo che non è nell'albero come this tree.getSize (nodeOtherTree) e per questo ho la domanda se questi metodi potrebbero essere statici o no ... – RobinHood

+0

puoi rendere statici che non devono essere pubblici anche se – dkatzel

0

Un class rappresenta un modello per una serie di Object s . Un class può avere membri e metodi static, ovvero class proprietà e capacità di livello. Un'istanza di una classe è Object, che ha i suoi membri e metodi specifici non static. Nel tuo caso, stiamo parlando di un gruppo di getter. La domanda chiave è:

quali sono quei metodi?

e la risposta è: si tratta di metodi, cioè, le abilità del vostro TreeObject. Se si dispone di più Tree s, gli altri Tree s non hanno nulla a che fare con le dimensioni e gli elementi di un determinato Tree. Di conseguenza, tutti i metodi citati dovrebbero essere public, i metodi a livello di istanza, a meno che non si desideri utilizzarli internamente, nel qual caso i metodi interessati dovrebbero essere i metodi protected, non static.

+1

La risposta è corretta, ma questi metodi usa un metodo ricorsivo che ha un parametro Node che può essere il Nodo degli altri alberi. La domanda "di chi sono quei metodi?" non è così intuitivo per questo caso. – RobinHood

+0

Infatti, lo è. Stai cercando di trovare un nodo nell'albero che stai elaborando. Non è rilevante che un altro Albero contenga effettivamente lo stesso Nodo. Il tuo approccio dovrebbe essere agnostico, quindi, se in seguito tenterai di cercare un Nodo che non è presente in un altro Albero, il tuo approccio sarebbe comunque logicamente vitale. Non assumere mai che la tua situazione attuale sarà applicabile per sempre. –

+1

Sì, è giusto, ma non è intuitivo che tu possa trovare un Nodo di un altro albero istace usando l'albero delle istanze attuale, ad es. 'Albero BTree = new Tree(); BTree AnotherTree = new Tree(); Tree.createTree (Node); AnotherTree.createTree (NodeOfAnotherTree); Tree.getSize (NodeOfAnotherTree); ' – RobinHood