Python.use(better)

前の記事記事一覧次の記事
Python.use(better)


実録:はじめてのプログラミング《16》

■ 概要

OOP を学習するための題材として、逆ポーランド課題を作成します。

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

Last updated♪09/06/17