- No brackets for high precedence operator.
- No brackets for root node.
+ * 7 2 3 = "2*3+7" * + 7 2 3 = "(2+3)*7" / * / 2 3 6 2 = "2*3/6/2"This is bad design as the flag is used only in low precedence operator class.
// bad design inode: text(putbrackets) dataNode: inode data text(putbrackets = true): if data == null: throw return data.tostring() operatorHighPrecedenceNode: inode inode leftOperand inode rightOperand operator text(putbrackets = true): if leftOperand == null || rightOperand == null || operator == null: throw return leftOperand.text() + operator + rightOperand.text() operatorLowPrecedenceNode: operatorHighPrecedenceNode text(putbrackets = true): return putbrackets ? "(" + base.text() + ")" : base.text() string stringify(inode n): if n == null: return "" return n.text(false)Instead put the behavior in a class and let the impl' classes call the desired behavior so there are no "ifs" in the design logic.
// good design bracketBehavior: string excludeBrackets(operatorNode n): if n == null || n.left == null || n.operator == null || n.right == null: throw return textInner(n) string includeBrackets(operatorNode n): if n == null || n.left == null || n.operator == null || n.right == null: throw return "(" + textInner(n) + ")" string textInner(operatorNode n): return n.left.text() + n.operator + n.right.text() inode: string text(): dataNode: inode data string text(): if data == null: throw return data.toString() abstract operatorNode: inode string operator inode left inode right bracketBehavior abstract string text(): operatorHighPNode: operatorNode string text(): return bracketBehavior.excludeBrackets(this) operatorLowPNode: operatorNode string text(): return bracketBehavior.includeBrackets(this) rootNode: operatorNode string text(): return bracketBehavior.excludeBrackets(this) string stringify(inode n): if n == null: return "" return n.text()[Hat tip to LW]
No comments:
Post a Comment