« 東京国際アニメフェア2010 | トップページ | 鳩山政権の現状整理 »

2010年4月21日 (水)

構造化設計とオブジェクト指向設計

 Twitterで清水愛さんがパトレイバーへの愛をひたすらつぶやいている。うちもパトレイバー世代だろうけど、当時はオタクじゃなかったんだよね。大学生になって見ました。パトレイバーって純粋に楽しめる押井アニメじゃないかなあ? 奇妙なことに、押井アニメって大惨事が起きているのに人が死んだりしないんだよね。押井さんの劇場アニメでは、犬と鳩と不死を見るという邪道なことをしています(笑)。

【ザ・スニーカー】春!ハルヒが帰ってきた!【6月号表紙絵】

 本当に驚愕が発売されるんだ・・・ちなみに、うちはまだ読めてないから関係なかったりする。アニメに合わせて読みすすめようと思ったら、アニメの進みが遅かったんだよね(笑)。

MF文庫『緋弾のアリア』TVアニメ化決定したけど これって面白いの?

 3巻から読んでないー。手元にあるのに積んでるよ。アニメ映えするラノベではあるけど、アリアはどう見ても釘宮さんですってキャラなんですよね。いわゆるツンデレキャラ。釘宮さんになるのか、それとも他のツンデレ声優か?! 楽しみに待とうと思います。「フルメタル・パニック」や「CANAAN」が好きな人は比較的ハマりやすいアニメになると予想しています。

UFOキャッチャーの景品の初音ミクが凄い件

 これはほしいんだけど、週末挑戦して取れませんでした(笑)。UFOキャッチャーとか下手だからなあ。いつか取ってみようと思います。かわいいから、かなりほしい(笑)。

『迷い猫オーバーラン!』は各話ごとに監督が異なることが判明

 えー?! そうなんだ・・・。無謀だと思うんだけど。各話のつながりって誰が調整しているのさ(笑)。シリーズ構成が原作者ということで、原作者がそういう役回りを担っているのかなあ? 面白いけど痛さのある試みですなあ。

非実在青少年読本

 こういう動きは支援しないとね。折角業界が動いたんだし。もっと出版業界やコンテンツ業界が動いてほしい。積極的に支援するつもりです。
 個人的には、「ゾーニング」「レーティング」という文言を入れて、「単純所持」を匂わす文言を取り除くのが落とし所だと考えています。そのために何をすべきか考え中です。動くなら5月かな?

◯構造化設計とオブジェクト指向設計

 「構造化設計」は知っているけど「オブジェクト指向設計」を理解できない人に向けて、今の思いを書いてみます。はっきり言って「オブジェクト指向」を理解しているかと言うと疑問ですが、違いはだいぶ理解できたかなあという感触なんですよね。「構造化設計」っぽいプログラムを見ると違和感を抱くようになってるし(笑)。
 何が違うのかを知れば、「オブジェクト指向」に対する理解が進むと考えています。オブジェクト指向を知っている人も知らない人も、「構造化設計」との違いを考えてみませんか?

☆分析
 構造化設計……データ構造、状態遷移、シーケンスを使用して分析を行う
 オブジェクト指向設計……ER図、状態遷移、シーケンスを使用して分析を行う

 オブジェクト指向において、この「オブジェクト指向分析」はかなり重要度が高いようです。正しく分析できていれば設計が簡単なので、大いに時間をかけるべきでしょう。
 構造化設計では「基本設計」にあたるんですかね? おそらく分析とは言ってないのではないかと思います。オブジェクト指向では、あくまでも分析なので多少あいまいでも成立します。オブジェクト指向が反復開発に向いている要因かもしれません。
 根本的に異なるのは、構造化設計ではデータと機能(処理)を別々に着目しているのに対して、オブジェクト指向設計ではオブジェクト(データ)の振る舞いに着目していることですね。構造化設計では機能(処理)が主体、オブジェクト指向設計ではオブジェクトが主体、と考えてもいいでしょう。
 ER図は、Entity(実体)とRelationship(関連)について示した図です。オブジェクト間の関連を捉えられるようになると、オブジェクト指向脳に一歩近づいていると言えます。
 構造化設計でも装置間のメッセージのやり取りを扱いますが、「装置=実体」「メッセージ=関連」とすれば、オブジェクト指向の考え方がイメージできるかもしれません。

☆機能の分割
 構造化設計……機能ごとにファイルを用意する
 オブジェクト指向設計……機能ごとにクラスを用意する

 構造化設計では機能ごとにファイルを用意して、その中に処理の関数を書いていくことが多いですが、オブジェクト指向設計では機能ごとにクラスを用意します。処理はクラスの中のメソッドに書きます。「ファイル→クラス」「関数→メソッド」だからわかりやすいですね。
 ただし、機能=クラスじゃないので注意が必要です。ほとんど構造体に近いデータ用のクラスもありますし、共通処理だけ取り出した処理用クラスもあります。
 構造化設計では機能分割に主眼が置かれますが、オブジェクト指向設計では機能分割+αで「+α」が重要なんですよね。クラスに汎用性がありすぎるのがオブジェクト指向の難しいところかもしれません。

☆処理の作成
 構造化設計……ジャンプテーブルを使用して、状態と入力内容ごとに関数を作成する。関数内で共通関数を使用する。大きな関数は小さな関数に分割する。
 オブジェクト指向設計……入力内容ごとにメソッドを作成する。メソッド内で処理用クラスを使用する。状態は派生クラスで対応する。

 ジャンプテーブルを使用すると構造化設計でもオブジェクト指向設計っぽくなります。状態遷移を扱うときはジャンプテーブルの方が使いやすいかもしれません。
 ジャンプテーブルはメッセージや状態という動的なデータ(データの流れ)に着目していますが、オブジェクト指向設計ではオブジェクトという静的なデータに着目するので、思想は大きく異なっています。したがって、結果的に似ているというだけだろうと思います。
 オブジェクト指向では、ボタンなどの入力情報を処理するクラスが優位です。それを継承した派生クラスで状態を表現します。このとき、派生クラスを生成するためのクラスを用意することもあります。このクラスがいわばジャンプテーブルの代わりですね。

☆入出力と処理の関係
 構造化設計……入力に応じて処理を作成して実装する。入力と処理が接近している。
 オブジェクト指向設計……処理用クラスを組み合わせて実装する。入力と処理が分離している。

 構造化設計は現場主義ですが、オブジェクト指向設計はオフィスから現場に指示を出すだけで実際の処理は現場の処理用クラス(ビジネスロジックって言うのかな?)に任せます。
 そのため、オブジェクト指向では上下関係が厳しくなります。指示を与えるクラスとデータを処理して報告するクラスという感じですね。なるべく指示系統が一方通行になるようにクラスを分割すると、わかりやすい構造になるみたいです。

☆共通処理
 構造化設計……共通関数を作成する
 オブジェクト指向設計……多くのクラスで使用される場合(タイマやDB操作など)は独立したクラスを作成する。一部のクラスだけで使用される場合は基底クラスとして用意する。

 構造化設計の感覚で共通クラスをつくると、オブジェクト指向のスパゲティ構造になってしまいます。オブジェクト指向設計では、なるべく基底クラスに共通処理を置いた方が良いと思います。ほとんど機能と言える場合に、共通クラスをつくりましょう。

 ざっとこんな感じですが、いかがでしょうか?
 構造化設計でもデータは構造体で分かれているんですよね。でも、入出力とデータ処理が分かれていない。オブジェクト指向では意識して分けるように設計すると綺麗になるんじゃないかなあと思っています。

※正直分かりにくいので『ソフトウェアの設計モデル』にまとめと+αを書きました。参考にしてみてください。

(追記)
 今ならもう少しわかりやすく書けそう。

★構造化設計だと縦に分割する
funcX()
{
if (xxx == A) {
funcA();
}
else if (xxx == B) {
funcB();
}
else if (xxx == C) {
funcC();
}
else {
}
}

★オブジェクト指向だと横(クラス)に分割する
 ※classA、classB、classCは同じ基底クラスやインターフェイスを継承すること

classA
{
funcX()
{
// funcA()の処理
}
}

classB
{
funcX()
{
// funcB()の処理
}
}

classC
{
funcX()
{
// funcC()の処理
}
}

◯経済って熱力学にならない?2

 以前取り上げたネタですが、ちょっと考えが進みました。
 まず、PV=nRT=NkTなんですね。こんなことでkTの意味がはっきりわかったわ(笑)。統計力学でkTが良く出てくるはずだわ。
 次に、PVを表す記号なないようなんですよね。1原子分子だとU=(3/2)nRTだったりするからU=PVではないし、Q=PVではないですよね。H=U+PVだったり、F=U-TSだったり、G=H-TSだったりするけど、PV=H-UとかPV=G+TS-Uでしか表せないんだよなあ。

 そんな感じで熱力学の理解を深めていくに、GDP=内需×GDP/内需として、「内需(D)」をVと対応させて「GDP/内需(R)」をPと対応させると良さそうかなあと思っています。輸出>輸入だと圧力が高く、輸出<輸入だと圧力が低いって感じです。
 nRTよりもNkTを採用してNを人口とすると、「1人あたりのGDP(g)」がkTに対応できそうなんですよね。
 これらの考察より、結果的に「RD=Ng」って数式になります。このとき、「R:GDP/内需」「D:内需」「N:人口」「g:1人あたりのGDP」です。

 熱力学では「定圧変化」「定積変化」「定温変化」「断熱変化」があります。これを「RD=Ng」に当てはめてみます。
 定圧変化ではR一定なので輸出と輸入の割合は変わりません。これはおそらく為替変動を示しているんじゃないかなあ?と考えています。
 定積変化ではD一定なので内需一定です。これは輸出や輸入が行われたときの変化だろうと思います。
 定温変化ではg一定なのですが……GDPが一定で内需が変化するというのがありえないのは?と考えています。
 熱量はおそらく貨幣流通量(M)に対応するのでしょう。断熱変化はM一定なのですが、定圧変化や定積変化の間に起こる変化ではないかなあと考えています。

 熱力学だとカルノーサイクルとか逆カルノーサイクルとかありますけど、経済の場合って同じ状態に戻らないですよね。サイクルではなく螺旋状になりそうです。
 例えば、輸入(D一定でR減少)→内需拡大(M一定でD増加)→輸出(D一定でR増加)→内需拡大(M一定でD増加)のように、元に戻らないまま経済成長していくのかなあとか予想しています。
 ただし、M一定のときの動きがあまりわかっていません。漠然とした予想ですが、「輸出>輸入」の国と「輸出<輸入」の国では、成長モデル(螺旋モデル)が異なっているように思えます。

|

« 東京国際アニメフェア2010 | トップページ | 鳩山政権の現状整理 »

「アニメ・コミック」カテゴリの記事

「日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« 東京国際アニメフェア2010 | トップページ | 鳩山政権の現状整理 »