《16》クラス(2)要求仕様〈Python 2.x 版〉

実録:はじめてのプログラミング記事一覧
《16》クラス(2)要求仕様

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
2009年2月4日(水)

今日の進捗

  • Tutorial: Errors and Exceptions
  • Python.use(better) -- セミナー研修テキスト
  • 逆ポーランド課題を「続・ひよ子のきもち」で公開
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〕は、次のステップへの助走(眼前の要求仕様の変更に応える準備)であり、フォロースルー(将来の要求仕様の変更に備える準備)です。素人である観客は、インパクトの瞬間、ボールが手を離れた瞬間に目を奪われがちですが、優れたコーチともなると「フォロースルーの乱れから、プレーヤーの好不調を見極める」とも言われます。リファクタリングを「いつ実践すべきか」という問いに唯一の正解はありません。私の場合は「新たな要求仕様の変更の依頼を受けたとき」を、その好機と考えています。また、アジャイル開発の原則に従うなら「早すぎるリファクタリングは徒労に終わる」のを、過去の経験から学んでいるからです。《ひよ子》

Last updated♪09/03/09