オブジェクト指向設計の説明

職場のやりとりの中で、オブジェクト指向を知らない上司にオブジェクト指向を説明する羽目になった。

たとえ話で説明したのだけど、なかなかうまくいったように思う。上司にも「わかりやすい!」と感謝してもらえ、かつマイmixi限定でやりとりを公開したら結構好評で、わたくしカナリゴキゲン(←アホ)なので、ここにもやり取りを残しておくことにする。うほ。

### やりとり

上司「なんで継承構造が複雑だと問題なの?」

自分「(継承を駆使した(※))オブジェクト指向設計のメリットは2つです。1つは、実作業者をある種のカタにはめられること。もう1つは、機能を共有できることです。」 (※: テンプレートメソッド的なイメージを持っていただければ。)

自分「たとえると、ビジネスフォームみたいなものです。たとえば、契約書とかで、本文には「甲が乙に・・・の義務を負う」みたいなヤツありますよね? 甲の部分を変えれば別の契約書になりますし、逆に言えば、ソコしか変えることが出来ないので、いわゆるカタにはめる格好になります。そして肝心の契約本文は共有できるので、契約を起こすたびに文面を考える必要はありません。継承を多用したオブジェクト指向設計っていうのは、こんな感じなんです。」

上司「ふーん、いいじゃない。」

自分「ですけど、問題点もあるんです。」

上司「何?」

自分「たいていの開発の場合、契約書テンプレートを作る人と、テンプレートを埋める人は別の人なんです。そして、継続してメンテナンスしないといけない。しかも、契約書の場合と異なり、両者は常に整合性をもっていないとイケないんです。 たとえば、法律の改正があって、契約書を修正しないといけないとしましょう。契約書の場合だと、テンプレートを修正して終わりですけど、ソフトウェア開発の場合だと、そうはいきません。現実の契約書テンプレートとは異なり、契約書テンプレートを修正すると、この契約書テンプレートを元にして作った契約書も全部修正されちゃうことになるんです。去年作った契約書も全部です。」

上司「あー」

自分「しかも、この(イケてない)協力会社がつくったソースの構造は複雑で、契約書にたとえると、契約書の本文に、「?の詳細については、・・・を参照」みたに契約書の構成が複雑で全貌を容易につかめないような感じなわけです。 これを将来的にメンテナンスしていくのは大変ですよ。」

上司「なるほどねー」

てな具合。

役にたたないXML Schema

私よりW3C XML Schemaが嫌いな人たち : 村田 真のチャンネル -北国tv

> 調べた人の話によると、Webに公開されているW3C XML Schemaスキーマのうち2/3には文法エラーがあり、何の役にも立たないのだそうな。

(笑)。

T字形ER 土曜勉強会

久しぶりに顔を出した。 しばらく休んでいたのに快く迎えてくれた皆さんに感謝!

### As-Is As-IsとTo-Beを区別することは必要だけど、あまりAs-Isにこだわりすぎるのはどうかと、ふと思った。

XML Schema問題の要約の要約

大ざっぱで当てにならないW3C XML Schema問題の要約

### 過剰な複雑さと基本構造のいびつさ > W3Cという組織は、自らがXML Schemaを勧告している関係上、建前としてスキーマをXML Schemaで書かねばなりません。その結果、W3Cで行われている多くの言語作成活動においてXML Schemaによるスキーマ作成が行われ、その結果として上手く書けない事例がいくつも発生しているとされています。

XMLのプロフェッショナルであるはずのW3Cに関与する人間すら、XML Schemaを使えていない現実!

### PSVI問題 Post Schema Validation Infoset問題。 同じXML文書でも、XML Schemaを通さなかった場合と、XML Schemaを通した場合でInfosetが変わってきてしまう問題(XML Schemaのデフォルト値の適用)

* 参考 : 『XMLにおける「ボヘミアンと貴族の階級闘争」を読み解く』を読み解いてみたら例示が欲しくなりました – XML & SOA

### 特定される単一のスキーマ > XML Schemaは、1つの名前空間に対応するスキーマが1つ存在するという前提を取るアーキテクチャであると言われています。

たしかに1つの文書に複数のスキーマを割り当てたいケースもあるかも。 データと妥当性を分離した、妥当かどうかもContextに依存させるような疎結合なアーキテクチャを実現したいケースもありそう。

### 貴族とボヘミアンの対立問題 > XML Schemaは、全てのXML文書に対応するスキーマが存在し、読み込む際には必ず検証を行うアーキテクチャを前提としていると言われます。つまり、検証しない使用法を全て認めないことを理想としていると考えられます。

> ここで注意すべき点は、ボヘミアンの立場がスキーマ不要論ではないことです。スキーマには、使うべき時と、使わない方が良い時がある、という立場です。

現場では、柔軟にXMLを使用したいはず。

### W3Cの権威 > 世界におけるISOにせよ、日本国内におけるJISにせよ、その権威は本来W3Cより高いものであるにも関わらず、WWWの世界ではW3Cが最も権威を持つかのような錯覚が一部にあって、それが盲目的なXML Schema支持につながっている面があります。

W3Cが論理的で理性的な判断を下せない理由は何か?

【匠に聞く】モデリングが「道具」になるには専門領域に特化しなければならない──Executable UMLの考案者Stephen J. Mellor氏 : IT Pro ニュース

【匠に聞く】モデリングが「道具」になるには専門領域に特化しなければならない──Executable UMLの考案者Stephen J. Mellor氏 : IT Pro ニュース

via Stephen J. Mellor氏のインタビュー記事 | 日々精進 – スパークスシステムズ ジャパン代表のBlog

> ──UMLは,用途ごとの言語仕様を定義するために「プロファイル」という枠組みを用意している。UMLをベースにしたDSLは,プロファイルとして作られていくことになるのか。 > > 私個人は,そうならないことを望んでいる。UMLのプロファイルは,あくまでもUMLの範囲内で定義されるものだ。これでは,その業界に存在する独自の記号を利用できない。その業界で長年積み上げられてきた資産が切り捨てられてしまう。これはとてもばかげた話だ。その業界に適した記号を使った表記法にすべきだ。

Mellor氏はDSL派のようだ。

Russian Doll と Salami Slice

スキーマ設計とクラス図 | ノート

なるほど。興味深い。

同じことを書くのに、ちょっと自由度があるのがイヤンなかんじもするな。

リアルタイム・システムの構造化分析 リアルタイム・システムの仕様書作成手法

* リアルタイム・システムの構造化分析 リアルタイム・システムの仕様書作成手法 – 電脳書房在庫目録

昔から読んでみたく思っていたのだけど、いまさら・・・・って感じだな。高いし。

なぜ読みたいと思っていたのか?というと、分析のためのツールキットはたくさん持っていたほうがよいと考えるから。 コンサルタントが経営分析などのテンプレートをたくさん用意しているように、 設計者・分析者はソフトウェアの分析のためのある程度のツールキットを用意すべきと考えるから。

構造化分析・プログラミング – ひがやすを blog

構造化分析・プログラミング – ひがやすを blog

先に取り上げた、いがぴょんさんのエントリに対する ひがさんのコメントと、実装スタンス。

> OCPを守るために、くーすでどうしているかというとロジック(メソッド)は常にインターフェース経由で呼び出すようにします。あるロジックが別のロジックを呼び出す必要があった場合、DIコンテナによってロジックオブジェクトをDIしてもらい、それを利用するのです。

文章だけだと、やっぱりわからない部分が残る。しょうがない。

ただ、外から見ていると、なんとなく、立ち位置や価値観が違うところもあれば、単に表現上の問題でミスマッチがおきているところもあるように感じられる。 もちろん、これは単なる勘だけど。

### 感謝したい。 あらためて思うのだけど、こういうやり取りを直接読めること、そのものに感謝したい。

少し前は、第一線で活躍する一流デベロッパの意見を聞くことは非常にむずかしかった。 イマイチ信用してよいのかどうかわからない専業ライターさんと、何をたくらんでいるのかわからないエバンジェリストもしくは社長さんぐらいからしか、情報を得ることができなかった。

われわれは幸せな時代にすんでいる。 第一線で活躍する一流デベロッパのソースを読み、開発に対する考えを聞くことができるのだから。

2005/05/09 日記: オブジェクト指向レス開発

2005/05/09 日記: オブジェクト指向レス開発

> 「良くない設計」や「良くない実装」をしてしまわないための一番の近道は、「構造化分析手法」の適用だと考えています。基本的に規模が大きければ大きいほど、携わる人間が多ければ多いほど、そして仕様変更が入る確率が高ければ高いほど、構造化分析および構造化プログラミングがなされていないと手詰まりになります。「失敗オブジェクト指向」にしてしまわない近道の一つは、「構造化」の導入であると私は確信しています。というか、そもそもオブジェクト指向においても「構造化」にまつわる概念は存在しているのですが、多くの文献や記事においては 「構造化手法」の側面は かなり薄っぺらくしか扱われていないように考えます。その実例として Java言語のパッケージ構造についての現実的な利用についての話題を ほとんど書籍や雑誌で見かけないことから現れています。(現実的な現場の多くでは適切に運用されているのですけれども…) > > そして もう一つ重要なポイントなのですが、オブジェクト指向やデザインパターンのなかの多くの技は「構造化」という観点からは リレーショナルデータベースにおける「逆正規化」に相当しているのだという点です。残念なことに、多くの人に、この点もあまり理解されていません。オブジェクト指向は ほんとうに注意深く導入しない限り、プログラムの理解を妨げ、試験をしづらくし、生産性を下げ、保守性を下げます。オブジェクト指向は間違いなく「逆正規化」に相当します。そもそもオブジェクト指向やデザインパターン適用について、これらが生産性や保守性に与える効果についての統計的な情報にほとんど出会わないことについても、これは悲しい現実であると受け止めています。

興味深い。いがぴょんさんの考え方・設計、(フレームワークより上位のアプリケーションレイヤにおいて)デザインパターンなどを駆使したいわゆるオブジェクト小僧の設計のどちらが100%間違っていて、どちらが100%正しいという問題ではないと理解している。どちらも、厳密な意味での論理性をもたない。

ただ、いがぴょんさんのおっしゃられていることは、皮膚感覚として理解できるし、 概念的なレベルでは納得ができる。 (段階的詳細化の考えに裏付けれた意味での)構造化技法は、数ある構造化の仕組みの中でもっともシンプルでパワフルである。ツリー構造+概要→詳細方向の段階的詳細化。 (継承、包含、利用、抽象型などの考えに裏付けられた意味での)構造化技法であるオブジェクト指向技法は、パワフルであるがシンプルではない。複雑である。

シンプルなパラダイムは表現力が少なく、すくなからず制約を持つが、形式的に扱いやすい。人間によって理解がしやすく、文脈的な影響も排除できる。 リレーショナルモデルも同様。

### 逆正規化

個人的には、

> オブジェクト指向は間違いなく「逆正規化」に相当します。

の論理的な説明が聞きたいなぁ。

ところで、いがぴょんさんの日記って、トラックバック打てるのかなぁ?

PoEAAとか

ロイホにしけこみ読書。

Essential XML・・・うーむどうなんだろう。ちょっと必要以上にわかりにくく書いてないか?この本。 訳が良くないというのもあるけど・・・(シリアライズを「順序化」って、あーた・・・。せめて「直列化」で頼む。) インフォセットの語りもなんだか抽象的でよーわからんし、SAX、DOMのあたりも構成が練れていない感じ。

PoEAA読書会に向けて、2部のパターン、O-Rマッピングあたりをさらりと読む。

1部の概論はイマイチしっくり来なかったが、2部はまぁまぁな気がする。 各パターンの説明の中で、未説明のパターンに言及するあたりがなんだかなーだけど、 各パターンの概要が頭に入ってきてパターン間の関係を頭の中で整理することができると、 比較的すんなり読めた。 ただ、ファウラーのコメントが散文的で踏み込みが甘いので、若干フラストレーションがたまるなぁ。 もう少し、具体的なコメントがほしいところではある。 現在は様々なフレームワークが出回っているわけだから、それらに触れるような切り口もありなのでは?と思ったりした。

### EOFとPoEAA ###

パターンの本来的な役割は、共通の語彙・概念の形成であると理解している。 というわけで、PoEAAの語彙・概念を利用してEOFを表現する。(乱文すぎるので、たぶん、あとで書き直す)

### ドメインロジックパターン ### ドメインロジック(=ビジネスロジック) の割り当ての方針は、基本的に「ドメインモデルパターン」が推奨される。 もちろん、画面にビジネスロジックを埋め込むような実装・設計も可能ではあるけれども。

物理的にも、「ドメインモデル」を実装したオブジェクト群をパッケージ化・フレームワーク化して、様々なアプリケーション形態(WOFと呼ばれるリッチなWebアプリケーションフレームワークを使用したWebアプリケーション、DirectToWebと呼ばれるルールベースのUI定義ベースのWebアプリケーション、Javaクライアントなどなど)で、それらを共用することが(それなりに)一般的であるようだ。

### データソースのアーキテクチャに関するパターン データソースとオブジェクトの変換は、オブジェクトグラフとリレーショナルモデルの変換という形で実行される。 であるので、「データマッパーパターン」になるのかな? オブジェクトとリレーショナルの対応は、物理的には*.eomodelファイル群、論理的にはEOModelGroup、EOModelなどのメタモデルクラス群で管理される。(「メタデータマッピングパターン」に相当)

### オブジェクトリレーショナル振る舞いパターン ### 基本的に、「ユニット・オブ・ワーク パターン」。 EOEditingContextと呼ばれる、オブジェクトグラフの編集用ブール、SandBox的なオブジェクトが存在しており、これがオブジェクトグラフの編集状態を管理する。編集をコミットしたタイミングで、オブジェクトの編集処理が、SQLクエリに変換される(「データ・マッパー パターン」)。この際、デフォルトでオプティミスティックロック戦略が使用される・・・ことになっている。(苦笑&謎めき)

EOEditingContextの寿命とWeb層のSessionの寿命がシンクしている点がなかなかいい感じではある。 (超私見)

#### 一意マッピング #### 異なる2つの世界、RDBMSとオブジェクトの中で、一意性をどのように、どのレベルで確保するか?という戦略。

EOFは一意性に関しては、2種類の一意性管理をもつ。 「ユニット・オブ・ワーク」単位の一意性と、データベース群レベルの一意性であり、EOGlobalIDなるクラスを用いることで一意性管理を実行する。EOGlobalIDは「データソース×テーブル×プライマリキーの組み合わせ」と考えてよい。文字通り、複数データソース内で、グローバルに一意である。

1つの編集用領域(EOEditingContext)には、同じEOGlobalIDのオブジェクトは1つしか読み込まれない。 ただし、複数ユーザーが編集中である場合など、複数の編集用領域が存在する場合、同じEOGlobaIDのオブジェクトが複数存在する。(当たり前!) ただし、下位のデータ管理レイヤがそれぞれのオブジェクトをトラッキングしており、あるオブジェクトが編集された場合、同じEOGlobalIDを持つ別のオブジェクトに変更を伝播させたり、しなかったりする。

#### レイジーロード #### レイジーロードはfaultingと呼ばれる機構でサポートされる。 関連の先にぶら下がっているオブジェクトは、必要に応じてRDBMSから読み込まれる。 […]