エンジニアの考え方 外伝 - オブジェクト指向の中身を、実務の言葉で
本編#4で「地図に関係の名前を付けるとオブジェクト指向が始まる」ところまで来ました。外伝では一歩踏み込んで、クラス・カプセル化・ポリモーフィズムという中心概念を、実務で何が嬉しいのかという角度から解説します。今回は少しだけエンジニア寄りです。
この回は外伝です — 少しだけエンジニア寄りに
このシリーズは「エンジニアでない人が読んでも分かるように書く」と約束して始めました。#3で連想の地図を描き、#4で地図の線に is-a / has-a という名前を付けて、オブジェクト指向の入り口までたどり着きました。
ここから中に入ると、話はどうしてもエンジニア寄りになります。なので今回は外伝として、約束を一回だけ緩めます。オブジェクト指向の中心概念——クラス・カプセル化・ポリモーフィズム——を、文法書の順番ではなく「実務で何が嬉しいのか」という順番で歩く回です。比喩は引き続き使うので、エンジニアでない人も雰囲気は追えるはずです。
クラス —「扱いの約束」を1か所に書く場所
#4で、クラスとは「分類に付けた名前」だと書きました。実務での実体は、もう少し具体的です。その分類に属するもの全部の「データと扱いの約束」を、1か所にまとめて書いておく場所。
紙の世界でいえば、「請求書」フォルダを作るだけでなく、フォルダの表紙に「このフォルダの書類は、確認→支払→保管の順で処理する」という手順書を貼っておくイメージです。図にするとこうなります。
classDiagram
class 請求書 {
+金額
+支払期日
+確認する()
+支払う()
+保管する()
}
上半分が持っているデータ、下半分がその扱い方。教科書にある「データと、それに対する操作をひとまとめにする」という定義は、この「分類ごとに約束を1か所へ」の言い換えです。嬉しさは変更のときに出ます。処理のやり方が変わっても、直すのはこの1か所。約束が担当者それぞれのメモに散らばっていたら、変更のたびに全員のメモを直して回ることになります。
カプセル化 — 変更コストの正体は「影響調査」
ソフトウェアの変更で一番時間を食うのは、実はコードを書き換える作業ではありません。「ここを直すと、どこが壊れうるのか」を調べる作業です。全員がどこにでも触れる作りだと、この調査が毎回システム全域に及びます。
カプセル化は、これを構造で断ち切る仕組みです。外に見せる面(公開する操作)と、隠す中身(内部のデータや処理)を分けて、中身には外から触れないように壁を作る。宅配便で言えば、配達員は荷物の中身を知らなくていい、という「知らなくていいことの取り決め」を、コードの上で強制するものです。
壁があると、「外に見せる面を変えていないなら、外への影響はない」と構造が保証してくれるので、調査そのものが要らなくなります。電子レンジの中の回路を総入れ替えしても、ボタンの並びが同じなら使う人に連絡は不要——あれと同じことをコードでやっています。
ポリモーフィズム —「呼ぶ側が変わらない」が本領
#4の雨具のように、共通の形をくくり出すと何が起きるか。コンビニのレジ・自動販売機・ネット注文を「販売チャネル」とくくった例で、図にします。
classDiagram
class 販売チャネル {
<<interface>>
+今日の売上()
}
販売チャネル <|.. レジ
販売チャネル <|.. 自動販売機
販売チャネル <|.. ネット注文
売上を集計する側は、「すべての販売チャネルから、今日の売上を受け取る」と一言で書けます。レジはレジのやり方で、自販機は自販機のやり方で数字を出すけれど、集計側はその違いを知らなくていい。
本領は追加のときです。新しい販売チャネルが増えても、「今日の売上を答えられる」という約束さえ守っていれば、集計側のコードは1文字も変わりません。人間のチームでも、「各自のやり方でいいから金曜までに進捗を報告して」と言える上司は、メンバーが入れ替わっても自分のやり方を変えずに済みます。抽象に話しかけて、具体が各自のやり方で応える——この構図の名前がポリモーフィズムです。
三点セットで買っているもの
並べてみると、3つが同じ方向を向いていることが分かります。
- クラス — 扱いが変わっても、直す場所は1か所
- カプセル化 — 変更の影響が壁の内側で止まり、調査が要らない
- ポリモーフィズム — 種類が増えても、呼ぶ側は変わらない
#4で「オブジェクト指向が買っているのは変更に強さの一点」と書きましたが、その内訳がこの3つです。逆に言えば、一度動かして捨てるスクリプトに丁寧なクラス設計は要りません。道具には適用範囲があり、手段を目的にしないこと。ここはシリーズ第1回からずっと変わらないテーマです。
まとめ
- クラスは「データと扱いの約束を1か所に」。直す場所が散らばらない
- カプセル化は「知らなくていいこと」を壁で強制する。変更コストの正体である影響調査を消す
- ポリモーフィズムは「抽象に話しかけ、具体が各自応える」。追加しても呼ぶ側が変わらない
- 3つとも「変更に強い」に収束する。変更しないものには過剰
外伝はここまで。本編の次回は、シリーズ第1回から予告している「道具のパズル」——分解した課題に既製の道具をはめていく、アーキテクチャの話を書く予定です。
※ 本記事の内容は執筆時点の情報であり、正確性を保証するものではありません。ご利用の際は免責事項をご確認ください。
Series / 連載
エンジニアの考え方
- 01 エンジニアの考え方 #1 - 課題を「分解」するところから
- 02 エンジニアの考え方 #2 - 「要するに?」と「たとえば?」を往復する
- 03 エンジニアの考え方 #3 - 連想をノードでつないで、頭の中を地図にする
- 04 エンジニアの考え方 #4 - ノードの地図に関係の名前を付けると、オブジェクト指向が始まる
- 05 エンジニアの考え方 外伝 - オブジェクト指向の中身を、実務の言葉で(この記事)
Related / 関連記事
関連記事
エンジニアの考え方 #4 - ノードの地図に関係の名前を付けると、オブジェクト指向が始まる
連想の地図の線に「is-a(〜の一種)」「has-a(〜を持つ)」と名前を付けると、汎化やクラス設計の図になります。意味ネットワークなど知識表現の考え方をたどりながら、オブジェクト指向の入り口を整理します。
エンジニアの考え方 #3 - 連想をノードでつないで、頭の中を地図にする
思考シリーズ第3回は、考えを頭の外に出す道具の話。中心にテーマを置き、連想したものを枝でつないで放射状に広げていく——マインドマップと呼ばれるこの方法は、思考整理にも自己分析にも効いて、実はプログラミングの設計にまでつながっています。
エンジニアの考え方 #2 - 「要するに?」と「たとえば?」を往復する
思考シリーズ第2回は、分解とセットで効く「具体と抽象の行き来」。例え話のうまい人が頭の中でやっていること、抽象的な指示に手が止まる理由、認識合わせが速くなる2つの質問について。
Comments / コメント