From 97d5a67e6682b3015b79401a0674f0f74c79c708 Mon Sep 17 00:00:00 2001 From: Martin Mares <mj@ucw.cz> Date: Wed, 8 Apr 2020 11:10:41 +0200 Subject: [PATCH] =?UTF-8?q?V=C3=BDrazy:=20U=C4=8Des=C3=A1n=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 06-vyrazy/objektove.py | 8 ++++++++ 06-vyrazy/objektove2.py | 29 +++++++++++++++++++++-------- 06-vyrazy/strom-vyrazu.py | 14 +++----------- 3 files changed, 32 insertions(+), 19 deletions(-) diff --git a/06-vyrazy/objektove.py b/06-vyrazy/objektove.py index 8418157..90b0d45 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 e862237..1a4de57 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 d51cf03..e2cab56 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()) -- GitLab