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