よろずプログラマーのためのPython導入ガイド (2)
小泉ひよ子とタマゴ倶楽部 [著] 2007/10/16 14:00

サンプルファイル 2.58 KB
1 2 3 →

前回のあらすじ

 Java/Pythonの融合は、Jythonという新たな選択肢を生み出しました。Javaで構築された既存のリソースを再利用できるだけでなく、Javaにはないプログラミングの可能性を拡げます。初心者にプログラムの本質を学ぶ環境を提供するだけでなく、洗練された見通しの良いコードを記述できるとともに、Javaの近未来を予見させます。

 前編で、先に示したコードの断片はみな、単純なコードを羅列した一枚岩とでも言うべきものでした。ここからは、役割分担したクラスを導入して、コードの断片が相互に協調しながら複雑な処理を遂行します。全体の世界を把握できるように俯瞰図を示します。

 俯瞰図を見ると、アプリケーションに固有の問題領域を表現するモデル(model)、アプリケーションとは独立して再利用可能な部品を提供するコンポーネント(component)群、そして、アプリケーションごとに選択可能な表示系を提供するビュー(view)が、三位一体となって、ひとつのアプリケーションを構成している様を概観できます。

サンプルアプリケーションの俯瞰図
サンプルアプリケーションの俯瞰図

世界の中心でモデルを叫ぶ

 最初に、アブリケーションの中核となるモデルを規定します。ここでは、サイクロイドを表現することが目的なので、そのために必要な情報を管理するクラスCycloidを規定します。

from math import *

class Cycloid:
    def __init__(self, radius, cycle, step):
        self.path = self._path(radius, cycle, step)
        self.context = radius, cycle, step
    def _path(self, radius, cycle, step):
        s = []
        for i in range(step+1):
            t = i*cycle/step
            x = radius*(t-sin(t))
            y = radius*(1-cos(t))
            s.append((x, y))
        return s
    def __getitem__(self, index):
        return self.path[index]
    def xpoints(self):
        radius, cycle, step = self.context
        return [radius*i*cycle/step for i in range(step+1)]

 __init__(self,radius,cycle,step)では、生成したばかりのインスタンスを初期設定します。半径radiusの円が、周期cycleで移動する様子を、分割数stepの精度で再現します。stepの値が大きくなるにつれて、より滑らかなサイクロイド曲線を描きます。radius=2*piとすると、ちょうど一回転します。step=60とすると、円周上を60分割した距離だけ移動するごとに、円周上の定点の軌跡を描きます。

 _path(self,radius,cycle,step)では、補助関数として、インスタンス変数pathを初期設定します。与えられた引数radius/cycle/stepを使って、円周上の定点が描く軌跡の座標を列挙したリストを生成します。ここでは、組み込み関数sin/cosを使うので、モジュールmathimportしておく必要があります。

 __getitem__(self,index)では、演算子[]の処理を規定します。index番目の座標値を参照します。Javaの禁じ手、演算子のオーバーロードが可能になります。

 xpoints(self)では、円周上の定点が描く軌跡のx座標だけを列挙したリストを生成します。

コンテナ(には愛テム)がなくちゃね

 キャンバス内に描く図形要素(コンポーネント)を保持するためには、コンテナが必要です。そこで、任意の図形要素を管理するクラスContainerを規定します。

class Container:
    def __init__(self):
        self.items = []
    def add(self, geometry):
        self.items.append(geometry)
    def paint(self, g):
        for e in self.items:
            e.paint(g)
    def clear(self):
        self.items = []

 __init__(self)では、任意の図形要素を保持するコンテナitemsの初期値として、空リスト[]を設定します。

 add(self,geometry)では、図形要素geometryをコンテナに追加します。

 paint(self,g)では、gを仲介して参照される情報を使って、コンテナ内の図形要素をキャンバスに描きます。

 clear(self)では、コンテナに保持された図形要素を、すべて削除します。


1 2 3
→
INDEX
Java meets Python - 第0回 Jythonはじめました(後編)
Page1
前回のあらすじ
世界の中心でモデルを叫ぶ
世界の中心でコンポーネントを叫ぶ
世界の中心でビューを叫ぶ
世界の中心で何を叫ぶ?
Java/C#の常識はOOPの非常識《予告編》
プロフィール
小泉ひよ子とタマゴ倶楽部 コイズミヒヨコトタマゴクラブ

http://tamago-club.cocolog-nifty.com/

「楽しくなければ仕事じゃない」が私たちのモットー。99%の苦悩の連続も、1%の成功に報われます。だからこそ、この仕事が楽しくて仕方がないのです。楽をするための努力なら惜しみません。何もせず楽をしているのと、努力をしたから楽ができるのと、一見しただけでは区別がつかないかもしれませんね。※イラスト協力:前タカヲ


注目の求人情報
コンサルタント/少数精鋭のWeb戦略コンサルティングファーム
ユーザビリティーコンサルタント: 論理的な観点からサイトや製品のコンセプト設計~詳細な画面・製品...
コンサルタント/高度な技術力が強みの戦略ファーム
・クライアントにインタビューを行いながら、対象業務を分析して、ビジネス上の課題と解決策を立案する...
コンサルタント/ITコンサルティングファーム
公官庁を中心とした業務改善、内部統制などを行う。

(最新日付順)
名前(ゲストの方もコメントをどうぞ):*
アイコン:
なし

内容(テキストのみ1200文字まで):*

投稿規定に同意して

スポンサーサイト

この記事のトラックバックURL: