2015-01-28 25 views
6

mam te metody instancji w mojej implementacji Java Binary Tree i przeszukiwanie binarne drzewa: getSize(), getHeight(), getDepth(), getPreOrder(), getInOrder(), getPostOrder() i getLevelOrder(). Te metody używają głównego drzewa w innych metodach rekursywnych, które mają parametr Node. Która jest bardziej jest właściwa do wykorzystania z punktu widzenia OOP:drzewo binarne statyczne metody Java

  1. Stosując te metody rekurencyjne jak metody statyczne, ponieważ korzystają z obiektu (Node), które nie należą do rzeczywistej klasy, a oni nie „t używać żadnych atrybutów klasy,
  2. mogą być metodami instancji, ponieważ mogą one korzystać w poddrzewie tego drzewa i nie używać żadnych statycznych atrybutów
  3. lub mogą być w drugiej klasie statycznej jak UtilsTree()?
+0

'używają obiektu (węzła)' to mogą być niestatycznymi metodami 'węzła'? – njzk2

Odpowiedz

3

Z perspektywy OOP uważam, że podejście nr 2 jest drogą do zrobienia. (Statyka jest generalnie często marszczona w OOP.)

Jak rozumiem, metoda wykorzystuje this jako root, a następnie przemierza resztę drzewa bez wywoływania metod instancji? Nie jest tak źle, biorąc pod uwagę, że pozostałe węzły należą do tej samej klasy, co oznacza, że ​​kod jest już udostępniony wszystkim obiektom. (Metoda ta może uzyskać dostęp do prywatnych członków innych wypadkach itd.)

Biorąc to pod uwagę, myślę getSize, getHeight, getDepth, getPreOrder, getInOrder, getPostOrder i getLevelOrder mogą być realizowane jako właściwych metod rekurencyjnych instancji. (Popraw mnie, jeśli się mylę.)

Czwartą opcją, która nie jest taka zła, byłoby użycie wzorca gościa i interfejsu NodeVisitor.

+0

Dlatego w OOP, czy lepiej jest wykonywać metody rekursywne niż statyczne metody rekurencyjne? – RobinHood

+0

Twierdzę, że jest to lepsze. Chociaż myślę, że powodem tego jest raczej czytelność i zrozumienie, jak działa kod, a nie zasady orientacji obiektu. Mam na myśli przechodzenie przez poddrzewo w ramach metody obiektu root nie narusza hermetyzacji ani niczego. – aioobe

1

Niektóre z tych metod zdecydowanie powinny być niestatycznymi elementami, ponieważ odnoszą się bezpośrednio do określonej instancji.

tree.getSize() lub tree.getDepth() jest znacznie łatwiejszy do odczytania i zrozumienia niż BinaryTree.getDepth(tree).

Jednak można argumentować, że metody mogą być statyczne lub nawet w ich własnej klasie. Możesz myśleć o tym, jako o chodzeniu po drzewie jako StrategyPattern.

TraversalStrategy.PREORDER.walk (drzewo);

może być dobrym pomysłem zamiast dodawać więcej metod. W ten sposób, jeśli kiedykolwiek trzeba dodać różne sposoby chodzić do drzewa nie trzeba zachować dodanie metody BinaryTree (W związku z Open-Closed Principle)

+0

Myślę, że tree.getSize() jest lepszym sposobem na uzyskanie rozmiaru drzewa, ale metoda rekursywna, która jest wywoływana przez getSize() jako getSize (root), może używać węzła, który nie znajduje się w drzewie this tree.getSize (nodeOtherTree) i do tego mam pytanie o to, czy te metody mogą być statyczne czy nie ... – RobinHood

+0

możesz zrobić te statyczne, które nie muszą być publiczne. – dkatzel

0

class stanowi wzorzec dla zestawu Object s . A class może mieć static elementów i metod, to jest, class - właściwości i zdolności poziomu. Instancja klasy to Object, która ma swoje szczególne elementy i metody inne niż static. W twoim przypadku mówimy o grupie pobierających. Kluczowe pytanie brzmi:

, czy są to metody?

i odpowiedź brzmi: są to metody, czyli możliwości twojego TreeObject. Jeśli masz kilka modeli Tree s, inne Tree s nie mają nic wspólnego z rozmiarem i materiałem danego Tree. W rezultacie wszystkie wymienione metody powinny być public, metody na poziomie instancji, chyba że chcesz ich używać wewnętrznie, w takim przypadku metody powinny być protected, non-static metod.

+1

Odpowiedź jest poprawna, ale te metody użyj metod rekursywnych, które mają parametr Węzeł, który może być Węzłem innych drzew. Pytanie "czyją są te metody?" nie jest tak intuicyjny w tej sprawie. – RobinHood

+0

W rzeczywistości tak jest. Próbujesz znaleźć węzeł w drzewie, które przetwarzasz. Nie ma znaczenia, że ​​inne Drzewo faktycznie zawiera ten sam Węzeł. Twoje podejście powinno być agnostyczne, więc jeśli później spróbujesz przeszukać węzeł, który nie jest obecny w innym drzewie, twoje podejście byłoby logicznie wykonalne. Nigdy nie zakładaj, że twoja obecna sytuacja będzie obowiązywać na zawsze. –

+1

Tak, to prawda, ale nie jest intuicyjne, że można znaleźć węzeł innego drzewa instazy przy użyciu rzeczywistego drzewa instancji np. 'Drzewo BTree = nowe drzewo(); BTree AnotherTree = nowe drzewo(); Tree.createTree (węzeł); AnotherTree.createTree (NodeOfAnotherTree); Tree.getSize (NodeOfAnotherTree); ' – RobinHood