visitor pattern
inに関する特定の質問に進む前に、以下の (例) コードを検討してくださいpython
。
class Node:
def __init__(self):
self.children = []
def add(self, node):
self.children.append(node)
def check(self):
print("Node")
return True
def accept(self, visitor):
visitor.visit(self)
class NodeA(Node):
def check(self):
print("NodeA")
return True
class NodeB(Node):
def check(self):
print("NodeB")
return True
class NodeA_A(NodeA):
def check(self):
print("NodeA_A")
return True
class NodeA_B(NodeA):
def check(self):
print("NodeA_B")
return True
class NodeA_A_A(NodeA_A):
def check(self):
print("NodeA_A_A")
return False
class NodeRunner:
def visit(self, node):
node.check()
if len(node.children) > 0:
for child in node.children:
child.accept(self)
if __name__ == "__main__":
n = Node()
n1 = NodeA()
n2 = NodeB()
n11 = NodeA_A()
n12 = NodeA_B()
n111 = NodeA_A_A()
n.add(n1)
n.add(n2)
n1.add(n11)
n1.add(n12)
n11.add(n111)
v = NodeRunner()
v.visit(n)
実行すると、すべてのノードクラスを繰り返しトラバースし、次を返します。
Node
NodeA
NodeA_A
NodeA_A_A
NodeA_B
NodeB
これで問題ありませんが、私の質問に移ります。check
各-method がブール値を返すことに気付いたかもしれません(これは実際には複雑なメソッドであるとしましょう)。
上記の例では、クラスcheck
内のすべての -method はexcept を返します。すべての基本クラスを失敗させることができるように、訪問中にこれを何らかの形で保存したいと思います。Node
True
NodeA_A_A
これを説明するのは難しいです。
- が
NodeA_A_A
返さFalse
れた場合は、失敗したいと思いNodeA_A, NodeA and Node
ます。これらのクラスが何を返すかに関係なく。 - が
NodeB
返さFalse
れた場合は、失敗したいと思いNode
ます。他のクラスが何を返すかに関係なく。
したがって、 achild-class
がどこかで失敗している場合 (check method returns False
)、すべての基本クラスを失敗させたいと考えています。
誰にもアイデアはありますか?