diff --git a/06-vyrazy/objektove.py b/06-vyrazy/objektove.py index 8418157883e1e960f8d750e3d4803bde42fa625d..90b0d458a9cc3f7719d76956bd76baa96b88048b 100755 --- a/06-vyrazy/objektove.py +++ b/06-vyrazy/objektove.py @@ -1,4 +1,12 @@ #!/usr/bin/python3 +# +# V elementárním řešení bylo nešikovné, že implementace operátorů byla +# roztroušená po celém programu, takže přidat nový operátor vyžadovalo +# projít celý program. +# +# Zde ukazujeme, jak oddělit implementaci operátorů do samostatných tříd +# (odvozených od nějaké společné třídy Node). +# class Node: diff --git a/06-vyrazy/objektove2.py b/06-vyrazy/objektove2.py index e8622377b00c655e86e7044abd1d525ec0278fc9..1a4de578bb76ce0a24fc7f05442466907f37b12d 100755 --- a/06-vyrazy/objektove2.py +++ b/06-vyrazy/objektove2.py @@ -1,4 +1,14 @@ #!/usr/bin/python3 +# +# Naše objektové řešení obsahovalo spoustu duplicitního kódu: speciálně +# všechny binární operátory měly identické metody __init__ a velmi podobné +# metody __str__ a eval. +# +# Zde se duplicit zbavíme tím, že je přesuneme do společného předka: +# třídy BinaryNode, která popisuje chování obecného binárního operátoru. +# Každý konkrétní operátor si pak pouze dodefinuje, jak se jmenuje a jaké +# funkci odpovídá. +# class Node: @@ -27,37 +37,40 @@ class BinaryNode(Node): def __str__(self): return '(' + str(self.left) + self.op_name + str(self.right) + ')' + def eval(self): + return self.eval_op(self.left.eval(), self.right.eval()) + class AddNode(BinaryNode): op_name = '+' - def eval(self): - return self.left.eval() + self.right.eval() + def eval_op(self, x, y): + return x + y class SubNode(BinaryNode): op_name = '-' - def eval(self): - return self.left.eval() - self.right.eval() + def eval_op(self, x, y): + return x - y class MulNode(BinaryNode): op_name = '*' - def eval(self): - return self.left.eval() * self.right.eval() + def eval_op(self, x, y): + return x * y class DivNode(BinaryNode): op_name = '/' - def eval(self): - return self.left.eval() // self.right.eval() + def eval_op(self, x, y): + return x // y x = AddNode(MulNode(NumNode(3), NumNode(4)), SubNode(NumNode(5), NumNode(6))) diff --git a/06-vyrazy/strom-vyrazu.py b/06-vyrazy/strom-vyrazu.py index d51cf03891a7e2c0faf4ee5277d72863370fa265..e2cab566445d8e789c7a2b57d606781706daf49d 100755 --- a/06-vyrazy/strom-vyrazu.py +++ b/06-vyrazy/strom-vyrazu.py @@ -39,14 +39,6 @@ class Node: x = Node('+', Node('*', Node(3), Node(4)), Node('-', Node(5), Node(6))) -print(x) -# x.print_tree() -# print(x.eval()) - -# Další úkoly: -# - doplnit unární operátory (třeba 'N' pro negaci) -# - počítání hloubky stromu -# - výpis stromu v postfixovém tvaru -# - převod postfixového tvaru na strom -# - výpis stromu v infixovém tvaru bez zbytečných závorek -# - prevod infixového tvaru na strom (*) +# print(x) +x.print_tree() +print(x.eval())