我在二叉树和搜索二进制树的Java实现中有这些实例方法:getSize()
,getHeight()
,getDepth()
,getPreOrder()
,getInOrder()
, getPostOrder()
和getLevelOrder()
。这些方法在其他具有参数Node
的递归方法中使用树的根。从OOP的角度来看,哪个更适合使用:
Node
)不属于实际类,并且它们不使用任何类属性,UtilsTree()
?答案 0 :(得分:3)
从OOP的角度来看,我认为方法2是要走的路。 (在OOP中,静态通常是不受欢迎的。)
据我了解,该方法使用this
作为root,然后遍历树的其余部分而不调用任何实例方法?考虑到其他节点属于同一类,这并不是太糟糕,这意味着代码已经在所有对象之间共享。 (该方法可以访问其他实例的私有成员,等等。)
话虽如此,我认为getSize
,getHeight
,getDepth
,getPreOrder
,getInOrder
,getPostOrder
和getLevelOrder
都可以实现为正确的递归实例方法。 (如果我错了,请纠正我。)
第四个选项并不太糟糕,那就是使用访问者模式并拥有NodeVisitor
界面。
答案 1 :(得分:1)
其中一些方法肯定应该是非静态成员,因为它们直接与特定实例相关。
tree.getSize()
或tree.getDepth()
比BinaryTree.getDepth(tree)
更容易阅读和理解。
然而有人可能认为方法getPreOrder()
,getInOrder()
,getPostOrder()
可以是静态的,甚至可以在他们自己的类中。您可以将其视为StrategyPattern
如何走树。
TraversalStrategy.PREORDER.walk(树);
可能是一个好主意,而不是添加更多方法。这样,如果您需要添加不同的方式来走到树,您不必继续向BinaryTree
添加方法(遵循开放原则)
答案 2 :(得分:0)
class
表示一组Object
s的模式。 class
可以拥有static
个成员和方法,即class
级别的属性和权限。类的实例是Object
,它具有特定的非static
成员和方法。在你的情况下,我们谈论的是一堆吸气剂。关键问题是:
这些方法是什么?
答案是:它们是方法,即Tree
Object
的能力。如果您有多个Tree
s,则其他Tree
与给定Tree
的大小和内容无关。因此,所有提到的方法都应该是public
,实例级方法,除非您想在内部使用它们,在这种情况下,受影响的方法应该是protected
,非static
方法