昨日の私は赤の他人。
『細かい変数の命名規則や、その意味、プログラムの細かいところまで、
イチイチ覚えちゃいないでしょ。
だけど、次の日も、もしかしたら1年くらい経ってから、
そのプログラムをいじらなければならないこともある。
さぁ、困った。一体、この変数の意味はなんだっけ?
あれ? この関数、うまく動かないぞ?
あぁ、そうか、グローバル変数を一つリセットしてから
呼ばなければならないんだった。
うーん、仕様書とか、ちゃんと残しておけば良かったなぁ。
はぁ、これなら、イチから書き直した方が早いかもなぁ………。』
『既にあるプログラムを使うって言ったって、
今まで書き散らしたゴチャゴチャしたプログラムなんか、
とてもとても「そのまま使う」気になんて、なれないよ。
後から使われることなんて、全然想定していなかったし。
どうやったら、プログラムを、後から使いやすいように書けるだろう。
それに、使いたいプログラムをどこにしまっておいたか、
どうやったら簡単に探し出せるだろう。
単に書き散らした一見有用な大量のサブルーチンも、
何をどう組み合わせて使えば機能を実現出来るのか………
そういえば、これらのサブルーチンって、
「どういうふうに使われるか」という想定があったと思うけど、
忘れてしまったし、仕様書にも残っていないや。』
目次
■オブジェクト指向を勉強すると、何がいいの?
昔書いたコードをまた書くな!
| 目次に戻る |
あなたは、とある箪笥(たんす)屋に入ってきました。
すると、箪笥屋の主人は、カタログを差し出して
商売上手な笑顔を浮かべて言いました。
「どんな箪笥を買いたいんだい?」
あなたは、カタログをざっと見渡しました。
なんだか良く分かりませんが、立派で、抽斗(ひきだし)が一杯付いている、
大きな箪笥を買いました。
「ほう、お客さん、お目が低いね。
じゃあ、今、この箪笥の設計図だけを渡すから。
なぁに、心配はいらない、隣の窓口でこの設計図を渡せば、
ホンモノの箪笥を、すぐに作ってくれるから。」
あなたは、箪笥の設計図をもらいました。
なんだか色々書いてあります。
その場で、設計図のお金を払いました。
そして、その設計図を持って、隣の窓口へ行きました。
「ほぅほぅ、『算数箪笥』をお求めで。
確かに抽斗は一杯あるけど、こいつぁ大したことは出来ないですよ。
まぁ、世の中には物好きもいるってもんだ。
あ、お代はここでは結構でさぁ、設計図代の中に含まれてますんで。」
窓口に立っていた職人さんは、
設計図をひったくるように持ち去ると、
奥で何やらトンテンカンと物づくりをして、
しばらくすると、立派な箪笥を軽々と運んできました。
「はいよっ!大事に使ってくれよっ!」
あなたは、設計図と、その設計図に従って作られた箪笥を持って、
家に帰りました。
設計図には、それぞれの抽斗の使い方も簡単に書かれていたので、
あなたは試しに、そこに書かれている通りの使い方をしてみることにしました。
まず、一番上の抽斗に、
「3」と書かれた紙を放り込んで、閉めてみました。
説明書によると、この抽斗を締めると、何か中で計算をして、
紙に書いた数の2倍の数字を代わりに入れて抽斗が開く、
というのです。
計算の複雑さによって、抽斗が開くまでの時間も変わるそうです。
抽斗は、ちょっと間があって、すぐにポコンと飛び出してきました。
すると、そこに「6」と書かれた紙が入っていました。
『なるほど』
あなたは納得しました。
この箪笥の中に小人(こびと)でもいるのか、
それとも、何やら高級な光学式文字読取装置(OCR)が入っていて、
プリンタも一緒にくっついているのか、
そんなことは分かりません。
しかし、とにかく、一番上の抽斗が、
そこに入れた紙に書かれている数を2倍にして返してくれるものだ、
ということは分かりました。
説明書によると、上から3番目の抽斗は、
そこに入れた自然数を、9倍して、その結果の数の各桁の数を全部足して、
それが1桁でなければ、またその各桁の数を全部足して………と、
ずっと1桁になるまで繰り返して、その数を返す、
という、とっても難しそうな計算をやってくれる、と書いてます。
ためしに、あなたは「385」と紙に書きました。
上から3番目の抽斗に入れる前に、あなたは、
自分でその計算をやってみることにしました。
「ええと、385×9=3465、
そして、各桁の数を足すと、3+4+6+5=18、
これはまだ1桁じゃないから、また各桁を足して、1+8=9、
つまり、答えは9のハズだ………」
あなたは、2回も検算をして、「385」と書いた紙を
抽斗に放り込みました。
この抽斗の計算は、ちょっとは時間がかかりそうだぞ、
そう思っていたら、
抽斗を閉めたと同時に、
すぐに「9」と書かれた紙と一緒に、抽斗が飛び出してきました。
他にも色々な抽斗があって、あなたは「こりゃ面白いわ」と、
色々な抽斗に、色々な数を入れて、遊んでいました。
ところが、2〜3時間も遊んでいると、
なんだかつまらなくなってきました。
あぁ、もっと面白い箪笥を買えばよかった………。
あなたは、また、箪笥のカタログを見に、再び箪笥屋に向かいました。
| 目次に戻る |
あなたは、いつの間にか、不思議な箪笥屋に弟子入りしていました。
職場は、奇しくもあなたが最初に買った「算数箪笥」の工場でした。
設計図に従って、箪笥を作るだけなら、随分手慣れてきました。
「よう、どうだい新入り、調子の方は。」
「えぇ、一つ一つの引きだしを作るのには、
そんなに苦労はしなくなったんですけど………」
「最近作ったのは、どんなだい?」
「はい、一番目の引きだしを開けて、何もしないで閉じると、
"箪笥の中に内緒で持っている数字"を、一つだけ増やします。
二番目の引き出しを、同じように開け閉めすると、
内緒の数字が、1以上の時には、一つ減らします。
一番目と二番目の引き出しには、
何も入れられないようにフタがしてあります。
だから、出来るのは開け閉めだけです。
で、三番目の引き出しを開くと、
内緒の数字を紙に書き写したものが出てくるようになってます。」
「ふふん………。"内緒の数字"ってのは、メンバのことだな。」
「そう呼ぶんですか?
じゃぁ、この箪笥は、1番目と2番目の抽斗で、
メンバをプラス1したり、マイナス1したりして、
3番目の抽斗を開けることで、メンバが、今、幾つなのかを
知ることが出来るようになっている、って感じですね。
他に、中の数字をゼロにリセットする抽斗、
一度にプラス、マイナス10ずつする抽斗
なんかもついています。
あと、何でか分からないんですけど、
ゼロ番目の抽斗があって、利用説明書には、
"この箪笥を利用する前に、一度この抽斗を開け閉めして下さい"
って書いてあるんですよ。」
「ほいほい、よく説明出来ました。
だけどな、オレはもう5年もここで働いてるんだ。
単に『カウンタ箪笥』って言ってくれりゃあわかるよ。」
「す、すいません。
でも、この、ゼロ番目の抽斗、何のためにあるんでしょう?
仕掛けを見ると、中にどんな数字の紙を入れようが、
それを無視して、リセット抽斗の仕掛けを
内部でこっそり動かすだけなんですよ。
リセット抽斗だけがあれば、十分ですよねぇ。
利用説明書にも、"この箪笥を利用する前に、
一度リセット抽斗を開け閉めして下さい。"
って書けば良いのに。
どっちみち、やることは、メンバをゼロにすることなんだし。」
「ウチの算数箪笥はな、どの箪笥も、使用前にゼロ番目の引き出しを
開け閉めするように、統一されてるんだよ。
その方が、一人でウチのいろんな箪笥を沢山買っていって下さる
お得意様が、混乱しなくて済むだろうが。」
「あ、なるほど。」
「ちなみに、ウチじゃあ、このゼロ番目の引き出しのことを、
"イニシャライズ抽斗"って呼んでいる。覚えとけ、新入り。」
「は、はい!」
あなたは、「お得意様」と言われて、ハッと思い出します。
「そ、それでですね、あの、先輩、
相談があるんですけれど……」
「なんだ?」
「さっきいらしたお得意様が、
『一度にプラス、マイナスする数字を抽斗に入れられるような
"カウンタ箪笥"は無いのか』、って注文してきたんです。
7を足したい時に、"プラス1抽斗"を7回も開け閉めするのが
面倒だからって……」
「それで?」
「"カウンタ箪笥"には、そんな機能は無いので、イチから作らなくっちゃ、
って思って……。で、1週間ほどお待ち下さいって言ったら、
怒るんですよ。明日までに作っておけ! って言い放って、
さっき帰ってったんですよ。
めんどくさいなぁ。今ある"カウンタ箪笥"で我慢してくれれば、
こんな苦労しなくて済むのに。今夜は徹夜だなぁ。」
「ばっきゃろい! おめぇは、客商売ってモノが分かってねぇな!
それに、なんだ、イチから作るだぁ?
なんで、今ある"カウンタ箪笥"を利用しないんだ!」
「え? だ、だって、勝手に引き出し増やしちゃって良いんですか?」
「それがお客様のニーズなんだろう?
いいか、"カウンタ箪笥"の設計図に、"好きなだけプラス引き出し"と、
おまけで"好きなだけマイナス引き出し"もつけたものをすぐに作れ。
そして、設計図のタイトルに、
"好きなだけカウンタ箪笥←カウンタ箪笥"って名前を書いて、
設計課に持っていけ。」
「は、はい! あ、あとですね、先輩!」
「なんだ、まだ何かあるのか」
「ゼロ番目の引き出し……」
「"イニシャライズ抽斗"だ!」
「す、すいません、イニシャライズ抽斗に、紙を入れたら、
箪笥の中の数字を、
その紙に書いた数字にセットしてくれ、とも言われたんですよ。
今は、単に"リセット抽斗"の仕掛けを呼び出して
ゼロにしてるじゃないですか。
勝手に、その仕掛けを作り直しちゃってもいいんでしょうか?」
「お客様は、"イニシャライズ抽斗"が、いつもゼロにリセットするよりも、
数字を指定できた方が良い、と仰っしゃったんだな?」
「はい。最初に"500"とか"1000"みたいな大きな数字を入れて
それからカウントを始めたい………とか言ってました。」
「よし、それならば、"好きなだけカウンタ箪笥"の
"イニシャライズ抽斗"は、入ってきた数字を内部の数字に写す、
ってように、設計書にきちんと書いておけ。」
「は、はい……でも、大もとの"カウンタ箪笥"の設計図の仕掛けを、
作り替えちゃっていいのかなぁ………」
「いいんだ! "イニシャライズ抽斗"は、
"その箪笥を使う前に一度開け閉めしてもらう"ためのものだ。
別に、メンバをゼロにする、って意味じゃないんだぜ。
その時に、どんな仕掛けが実際に動くのかは、
お客様のご注文を満足させるように作り変えるんだ!
さぁ、さっさと設計図を書いて、設計課へ持っていけ!」
「は、は、はいっ!」
あなたは、設計書を書きに仕事部屋に戻りつつ、
「結局、"イニシャライズ抽斗"は紙が入れられるように改造するだけ、
"好きなだけプラス/マイナス抽斗"を2つ追加、
これ以外は何もする必要が無いんだな」と思い、
これなら徹夜どころか、設計書さえ出来れば、
夕方までには出来ちゃうや、と、内心ホッとしていました。
とっとと設計図を書き上げ、設計課に持っていきました。
「おぉ、新人君、頑張ってるかね?」
「えぇ、なんとか。毎日叱られっぱなしですけれど。」
「ほほう、新しい設計図を持ってきたね? どれどれ……ほう、
"カウンタ箪笥"を利用して、新しい箪笥を設計したか。」
「おかげで早く出来ました。」
「前からある部分は、詳しく再検査する必要も無いしね。
うん、良く出来た設計図だ。立派だよ。
この"好きなだけカウンタ箪笥"は、
我が設計課の新しい財産だ。有り難く、もらっておくよ。」
「……は? はぁ……、どうも。」
ここに来て、はじめて褒められたので、かえって面食らってしまった。
ほんのちょっと設計図を書き替えただけなのに、褒められた……
いや、「ほんのちょっとしか書き替えなかった」から褒められたのか。
これが効率良く設計を進めるってことなのかぁ。
全体の箪笥の種類や機能の設計図さえ出来てしまえば、
細かい一つ一つの引き出しの仕掛けを書いたり、
本物の箪笥を組み立てる作業は、造作も無いことだ。
あなたは、思った通り、"好きなだけカウンタ箪笥"を、
夕方までに作り上げることができました。
◆ひとくちメモ
親クラスのメソッドをつぶしてはいけない ……それでは「何でもアリの世界」になる。 極端な話、親クラスのメソッドを全部からっぽのメソッドで オーバーロードして、新しいメソッドをバンバン追加すれば、 継承関係はまったく無意味になる。 もし、親クラスのメソッドを無効化する必要が生じたら、 本当にその親クラスは、今作ろうとしているクラスの 正しい抽象化になっているのか、再検討してみよう。 よく似ているが、実は違うものかもしれないし、 今ある親クラスよりもっと抽象的なスーパークラスが 必要になっていることの顕れかもしれない。 まずは、そのあたりを疑ってみよう。
| 目次に戻る |
あなたは、色々と箪笥を組み合わせて
複雑な仕事をさせることにも慣れてきました。
「ストップウォッチ箪笥」の作成を依頼された時は、
「カウンタ箪笥」「秒刻み箪笥」を、こっそり裏にはめこむことで、
簡単に仕上げることができました。
しかし、ある時、結構やっかいな依頼が舞い込んできました。
「先輩ぃ〜。」
「なんだ。お前がそうやって語尾を伸ばしてオレを呼ぶときは、
決まって何か困ったことが起きた時なんだ。」
「その通りなんですぅ。これが難しい依頼で………。
『小冊子を入れると、漢字の多い順にページを並べかえる
仕組みを作れ』
っていうんですよ………。」
「ふーむ。並べ替え要求ねぇ。
………で、どーやて対処するつもりだ?」
「"漢字/ひらがな識別箪笥"や、"カウンタ箪笥"なんかを使って、
"文字種別カウント箪笥"までは作ったんですよ。
1ページ分を"文字種別カウント箪笥"の"ページ抽斗"に入れます。
で、その後、たとえば"漢字個数抽斗"を開くと、
1ページ内の漢字の個数が出てくる、っていう仕掛けです。」
「ふむ、要するに、いろんな既存の箪笥を組み合わせて、
漢字の数を数え上げる箪笥までは作れた、と。」
「はい………。でも、冊子から一枚ずつ紙を取ってきて、
漢字の数に応じて多い順に並べていく、っていう部分が
面倒なんで………。」
「そこまで出来ているんだったら、『枠組み課』へ行って、
『並べ替え枠』を貰って来い。」
「へ? 『枠組み課』………ですか? そんなのありましたっけ?」
「あるんだよ。いいか、『並べ替え枠』だぞ。」
あなたは「枠組み課」にやって来ました。
「すんませーん、箪笥課の者ですがぁ。」
「ほいほい、来たね、新入り君。あんたの親方から、連絡は貰っているよ。」
「なんだ、先輩ったら、そんなに僕がヘマやるか心配なのかなぁ」
「ほれ、『並べ替え枠』だろ、もってけ。」
「ど、どわー! なんですか、この巨大な壁のようなものは!?」
「これが『枠組み』って奴さね。これは、その中でも一番シンプルな
『並べ替え枠』って奴。
ここに、箪笥が一つ裏向きにハマってるだろう?
これを抜いてみたまい。」
「うぅ、よいしょっと! これは………。
3つだけ抽斗がついてますね?」
「それは、『比較箪笥』と呼ばれておるな。
1番目と2番目の抽斗に何か入れてから、
3番目の抽斗を開けると、1番目と2番目に入れたものの
比較結果が入っている、というように設計されておるな。」
「はぁ………でも、これ、中身はからっぽですね。」
「そう。この『比較箪笥』を継承して、目的に応じた箪笥に仕立ててから、
抽斗を枠組みの方に向けて、
またココにハメ込んでくれれば良いのだよ。」
「なるほどぉ、僕は、『漢字個数比較箪笥←比較箪笥』を設計すればいいんだ。
もう"文字種別カウント箪笥"は作ったから、あれを利用すれば
あっという間だ!」
「で、この枠組みの一番左上に、冊子をドサッと入れれば、
この枠組みは中で、最も効率の良い並べ替えのやり方で、
中身のページを入れ替えてくれるよ。
その時に、枠組みは、中のほうで、あんたの作る『漢字個数比較箪笥』の抽斗を
何度も何度もガチャガチャ開け閉めして、
比較方法を確認するわけだ。こちら側からはその様子は見えないけどね。
しばらくすると、左下から、
お望みの順番で並べ替えられた冊子が出てくるよ。」
「すごい! これなら、あと数十分で、あのやっかいな依頼も
解決しちゃうや! ありがとうございます!」
「はっはっは。お礼なら、あんたの親方に言っとくれ。
この『比較箪笥』も『並べ替え枠』も、
あんたの親方が設計したものだからねぇ。」
「へぇ〜?」
あなたは、自分の職場に戻ってきました。
「先輩ぃ、『並べ替え枠』を工場の方に持っていって、
『漢字個数比較箪笥』をハメ込んだ奴を、今テスト工程に回してます。」
「おっ、仕事が早くなったじゃねーか!
もうテストに入ったか。」
「えぇ、先輩の『並べ替え枠』のお陰ですよ。
しかし、先輩は、枠組み課の仕事までしてるんですねぇ!」
「うーむ。ま、おめぇにはまだ無理かもしれねぇが………」
「は?」
「本来、俺ら箪笥職人は、箪笥をデザインしたら、
その"使われ方"も考えなくちゃイカン。
確かに、個々の箪笥をキチンと仕上げる能力が先ず大事だ。
けれど、それだけじゃ、まだ半分なんだよ。
『この箪笥は、こうやって使ってください。』とか
『これらの箪笥は、こういう風に組み合わせて使ってください。』
という思いが、その箪笥には篭められているはずだ。
これは分かるな?」
「そうですね………箪笥は使っていただくために設計しますけど、
こんな風に使って欲しい、というイメージはあります。」
「そのイメージを、イメージで終わらせてしまっている内は、
まだ半分なんだ。そのイメージまでもカタチにして、
実は本当の箪笥職人と言える。
もう少し複雑で多くの箪笥を協調させて
仕事をさせていく依頼を扱うようになると、
おめぇも実感するようになる。
幾つかの箪笥を設計した段階で、それらの使われ方の
普遍的な『枠組み』が、最初はボンヤリだが、
そのうちクッキリ見えてくるんだ。」
「はい………。先輩の仰っしゃること、なんとなく分かります。
箪笥が出来たら、あとは、それを組み合わせて利用するのは
お客様の勝手、というのではなくて、
使い方の決まりきった部分については、
そこも予め『枠組み』としてサンプルの説明書を示すか、
本当に普遍的な、固定的な『枠組み』があるならば、
それを設計図にして、ちゃんと『枠組み課』へ持っていけ、
ってことですね?」
「ほぅ、今日はやけに物分かりがいいな。」
「えぇ、『枠組み』があると助かるってことを、
今日は身をもって体験しましたから!
もっと色々な枠組みがあるんでしょうね?」
「おぅ、そりゃあ、もう何百とな。『並べ替え枠』は、
その中でも一番単純なものなんだ。
『任意書体文書版組用枠』なんぞはかなり巨大な方で、
"フォント箪笥"やら"文字種識別箪笥"なんかをフルにハメ込んで動かすと
なかなか壮観だぞ。
おめぇが使ってた"漢字/ひらがな識別箪笥"は、確か
"文字種識別箪笥"から継承されてたから、
『任意書体文書版組用枠』にハメ込むことが出来るはずだな。」
「あっ、本当だ、"漢字/ひらがな識別箪笥←文字種識別箪笥"
って設計図に書いてある。
うーん、先輩は、箪笥の継承構造を全部覚えてるんですねぇ?」
「あたぼうよ。職人ってのは、そーでなくちゃいけねぇ。
どの箪笥がどの枠組みにハメ込めるのかってのは、
覚えておく方がいいな。」
「はい、先は長そうですが、私も便利で普遍的な『枠組み』を考えて
設計図を枠組み課へ持っていけるように頑張ります!」
「なぁに、そこまでフンイキが掴めてりゃ、
そう先の話しでもないさ。」
◆ひとくちメモ
クラスの使われ方こそ、 クラス以上の再利用可能な財産だ!
一般に、フレームワークは、の3点セットからなる。 良いフレームワークは、その目的に対して柔軟に対応できなければならないが、 柔軟過ぎると、設計者が使い方に迷いを生じやすくなり 生産性向上に十分寄与できなくなるし、 またフレームワークの実装に凝ることで対応幅を増やすと 性能が落ちることもある。 どのような目的で使われるかを見極めて、 その範囲内で必要十分なフレームワークを設計することが大事である。 では、世の中にあるフレームワークを全てカタログ化して、 それを目的別に整理し、自由に使いまわせるようになるだろうか。 設計レベルではデザイン・パターンが、 分析レベルではアナリシス・パターンが、 それに部分的に応えている。 ビジネス用アプリケーション・システムにおいては、 ERP製品が主に中堅・中小企業向けの ソリューションの一部になっている。
- 再利用可能なプログラム構造の実装
- 説明ドキュメント
- サンプルコード
さて、将来、人類の多様な社会活動・企業活動が 全て階層的に整理され、 ソフトウェの全てのフレームワークも その中に位置付けられるようになる日が来るだろうか? もし、そのような壮大なクラス階層が作られたとしたら、 その最上位のスーパー・クラスには、何という名前が相応しいだろうか?
| 目次に戻る |
| 目次に戻る |