Python.use(better)
《前の記事|記事一覧|次の記事》
Python.use(better)
実録:はじめてのプログラミング《16》クラス(2)要求仕様
《関連記事》-
逆ポーランド課題(0)要求仕様
《step 1》スタックを利用して、逆ポーランド記法で記述された式を評価します。
逆ポーランド課題を作成しながら、クラスについて学びます。
def ex(): expressions = [ "3 4 +", "3 4 5 + *", "3 4 5 + * 6 - 7 /", "3 4 + 5 * 8 - 9 /", ] p = Polish() for e in expressions: print(">>>",e) print(p.eval(e)) >>> ex() >>> 3 4 + 7 >>> 3 4 5 + * 27 >>> 3 4 5 + * 6 - 7 / 3.0 >>> 3 4 + 5 * 8 - 9 / 3.0
逆ポーランド記法で記述された式(文字列)を評価 eval すると、値が得られます。ただし「記述された式は正しい」と仮定して、エラー処理は省略しています。
仕様を確認したので、これから、課題が完成するまでの過程を追跡します。
class Polish(object): # ver.1 def eval(self, expression): stack = Stack() for e in expression.split(): if e in "+-*/": op2 = stack.pop() op1 = stack.pop() stack.push(eval("%s %s %s"%(op1, e, op2))) else: stack.push(e) return stack.pop()
前の〈課題〉で作成したクラス Stack とそのメソッド push/pop を再利用します。与えられた式 expression からメソッド str.split を使って(空白文字で区切られた)各トークン e を抽出します。
そのトークンが、四則演算子(を表わす文字列)なら、スタック stack から2つの非演算子 op1/op2 を降ろして、それを式として評価 eval するとともに、得られた値をスタック stack に積みます。そのトークンが、数値(を表わす文字列)なら、そのままスタック stack に積みます。最後に、式の値をスタック stack から降ろします。
何が問題か
逆ポーランド記法で記述された(正しい)式を評価するだけなら、ここで終わりです。しかし「真の」課題は、ここから始まります。実際のシステム開発でも通用する術を身に付けるには、これだけで満足してもいられません。そこで、リファクタリングを実践して、より洗練されたコードとなるように再考します。
Tips:リファクタリングを「いつ実践すべきか」
リファクタリング〔refactoring〕は、次のステップへの助走(眼前の要求仕様の変更に応える準備)であり、フォロースルー(将来の要求仕様の変更に備える準備)です。素人である観客は、インパクトの瞬間、ボールが手を離れた瞬間に目を奪われがちですが、優れたコーチともなると「フォロースルーの乱れから、プレーヤーの好不調を見極める」とも言われます。リファクタリングを「いつ実践すべきか」という問いに唯一の正解はありません。私の場合は「新たな要求仕様の変更の依頼を受けたとき」を、その好機と考えています。また、アジャイル開発の原則に従うなら「早すぎるリファクタリングは徒労に終わる」のを、過去の経験から学んでいるからです。