《16》クラス(2)要求仕様〈Python 2.x 版〉
実録:はじめてのプログラミング《記事一覧》
《16》クラス(2)要求仕様
関連記事
- 実録《16》クラス(2)要求仕様《Python3.1》 - 続・ひよ子のきもち《Python3.0》
今日の進捗
Comment | |
---|---|
本人:野中 | 今月の課題「逆ポーランド記法」のソース(java版)を見せてもらったのでこれを参考にします。 |
担当:本間 | JavaからPythonに置き換えるだけでなく、OOPの特徴を活かしてJava版より洗練されたコードを書けるようにトライしてみてね。楽しみにしてます。(^^) |
参考文献 | note |
---|---|
珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造
|
「逆ポーランド記法」について参考に |
逆ポーランド記法(RPN)とは - IT用語辞典 e-Words | 「逆ポーランド記法」の要点を分かりやすく解説 |
逆ポーランド課題(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 >>> 3 4 + 5 * 8 - 9 / 3
逆ポーランド記法で記述された式(文字列)を評価 eval すると、値が得られます。ただし「記述された式は正しい」と仮定して、エラー処理は省略しています。
逆ポーランド課題の仕様を確認したので、これから、クラス Polish が完成するまでの過程を紹介します。
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〕は、次のステップへの助走(眼前の要求仕様の変更に応える準備)であり、フォロースルー(将来の要求仕様の変更に備える準備)です。素人である観客は、インパクトの瞬間、ボールが手を離れた瞬間に目を奪われがちですが、優れたコーチともなると「フォロースルーの乱れから、プレーヤーの好不調を見極める」とも言われます。リファクタリングを「いつ実践すべきか」という問いに唯一の正解はありません。私の場合は「新たな要求仕様の変更の依頼を受けたとき」を、その好機と考えています。また、アジャイル開発の原則に従うなら「早すぎるリファクタリングは徒労に終わる」のを、過去の経験から学んでいるからです。《ひよ子》