SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

よろずプログラマーのためのPython導入ガイド

Java meets Python - 第7回 ハリウッドの原則

よろずプログラマーのためのPython導入ガイド (9)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ソフトウェア開発における輪廻転生

ソフトウェア開発のライフサイクル
ソフトウェア開発のライフサイクル

 ハリウッドの原則に沿ってフレームワークを構築すると共に、今度はオブジェクト指向の立場からソフトウェア開発のライフサイクルを再考します。上図を縦方向に見ると、クラス間の関係(特殊化/抽象化)が変化する様子が見えてきます。横方向に見ると、インスタンス間の関係(合成/分解)が変化する様子が見えてきます。

 そのライフサイクルは、伝統的なウォーターフォール型ではなく、スパイラル型のモデルによって説明されます。つまり「特殊化→合成→抽象化→分解」の過程を経て、成長を繰り返します。この過程はアプリケーション開発だけではなく、クラスライブラリー/フレームワークの開発にも見られます。生物が絶えず進化するのと同様に、クラスも進化/分化を繰り返します。このような観点から、先の連載で記述したコードには、どのような意義があるかを再考します。

部品を特殊化する

 新しいクラスを定義する際に、その親クラスを選定は重要です。

部品の特殊化
部品の特殊化

 既存のクラスが提供する特性を活用すると共に、不足する特性を追加/改良できることから、新しいクラスを導入する作業は、部品を「特殊化」する過程と見なせます。共通なものから固有なものを導出する様子は、クラス間の「継承」によって説明できます。親子関係で結ばれるクラスは「汎化/特化」構造を実現します。

Java の事情

 Javaでは、クラス定義から始めます。

public class Tile { ... }

 親クラスを省略すると、次のようにObjectを指定したものと見なされます。

public class Tile extends Object { ... }

事例:オブジェクトに固有の文字列表現

 クラスTile/Lifeを、GameItemの傘下に置きます。すると、共通する特性を再利用すると共に、その違いだけを記述すればよくなります(差分プログラミング)。

差分プログラミング
差分プログラミング
#------ after --------------------------------
class GameItem(Shape):
    def __str__(self):
        return repr(self)
    def __repr__(self):
        return "(%i,%i)"%(self.x, self.y)
class Tile(GameItem):
    def __repr__(self):
        return "%r%s"%(`self.value`, GameItem.__repr__(self))
class Life(GameItem):
    def __repr__(self): ...
class Stone(GameItem):
    def __repr__(self):
        ...
        return "(%s,%s)"%(GameItem.__repr__(self), s)

 メソッド__repr__は、組み込み関数reprの操作を規定して、オブジェクトに固有の「公式な」文字列表現が得られるようにします。可能であれば、「同じオブジェクトを生成するために有効なコード」を表わす文字列が得られるようにします。また、メソッド__str__が未定義なら、オブジェクトに固有の「非公式な」文字列表現を得るためにも__repr__が利用され、組み込み関数strの操作を規定します。

 親クラスGameItemにおけるメソッド__str__は、その原理を説明するのためにあえて記述しましたが、通常は冗長なので省略できます。子孫クラスTile/Life/Stoneでは、親クラスで定義したメソッドGameItem.__repr__を再利用しています。

【付記】
 Smalltalkには「printOn:/storeOn:で規定して、printString/storeStringで利用する」という暗黙の了解があります。JavaのtoString()も事情は同じです。

次のページ
部品を合成する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
よろずプログラマーのためのPython導入ガイド連載記事一覧

もっと読む

この記事の著者

小泉ひよ子とタマゴ倶楽部(コイズミヒヨコトタマゴクラブ)

http://tamago-club.cocolog-nifty.com/「楽しくなければ仕事じゃない」が私たちのモットー。99%の苦悩の連続も、1%の成功に報われます。だからこそ、この仕事が楽しくて仕方がないのです。楽をするための努力なら惜しみません。何もせず楽をしているのと、努力をしたから楽ができるのと...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

伊藤うさぎ(イトウ ウサギ)

ペンネームの「由来は」と言うと。苗字の方は、セミナー研修で同じチームになった、3人の合体ユニット名 [I:石塚, T:田川, O:尾沢] から来ています。名前の方は、同じ干支(卯:1987 年生)に因んだものです。既に2人は卒業して、残る1人がその名跡を継承しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2253 2008/06/17 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング