継承とOverride

オブジェクト指向でのプログラミングと言えば、継承とオーバライドをいかに効率的に使うか。

そうなんだけれども、その言語体系、開発環境の基本コンセプトが理解できていないと、いま一つ使いきれない。

この辺、ちょっと各論の細かいところで松尾くんと意見調整が必要かも。
いやぁ、社員はたった一人とか、同じ会社だとか言いながら、もう20年もやっていて、「初めて」ではないけれども、プログラミングの細かいところでの打ち合わせが必要になってくるのは、しかも、自社で基本的に全ての方針を決定できる開発案件での連携は、実質的にこれが初めてかも知れない。

「わかりやすく、読みやすい」という意味ならば、松尾くんの考え方に賛成。
「理論的に、スマートに、かつ、ロジックがきれい」なアプローチは、僕が提案できて、雛形を提供できるならば、僕の意見を通したい。けれども、まだ雛形を提供できる程使い込んでいないから、彼の意見を通す形かも知れない。

実を言えば、既に売り出している「Pythonによるプログラミング」(オーム社)の執筆中に、共同執筆者の佐々木先生と意見が分かれた部分があった。

MVC(Model / View / Controller)によるメソッドの分類の部分。これは、Ruby on Railsなどでも、特定のメソッド(Method)を、Modelに組み込むか、Controllerに組み込むかで、考え方が異なってくる部分だと思う。
性質に属するもの、Modelに関連しているものは、全てModelに組み込み、それらを呼び出すもの、複数モデルにまたがるものだけを、Controllerに組み込む、というのが佐々木先生のお考えかな、と僕は理解した。

僕は、ORマッピングの考え方で、ObjectをデータベースRelationに落とし込む部分の、必要最小限のコントロール機能、いわばSQLに直結する機能はモデルに組み込むが、それ以外のデータを処理する部分は、全てControllerに組み込む、というアプローチで、最初この部分を執筆した。ただ、最終的に佐々木先生からご指摘があって、佐々木先生のお考えで、メソッドの分類部分を書き換えた。

この辺は「哲学論争」になる。どちらが正しいとか、主張し出しても、おそらく結論は出ない。なので、この本では佐々木先生のお考えで執筆。別に、どっちでも良いといういい加減な私。

後日、本になった後、現在開発中のシステムの設計に関連して、松尾くんに「小林さん、なんでこの機能がモデルにプログラムされてるんですか?」と、指摘された。僕は佐々木先生のお考えを紹介した。松尾くんに言われてしまった。「おかしいでしょ?モデルは、SQLになるものだけを書くんじゃないですか?」
う〜ん、やっぱり。現場で場数を踏んだ松尾くんは、たぶんそう感じる。現場のプログラマはそう考えるかも知れない。佐々木先生は、コンピュータの言語設計の方がご専門だから、この辺、言語設計の上で、もっと言ってしまえば、オブジェクト指向の考え方の根幹に関わる部分の解釈では、僕自身も佐々木先生のお考えが正しいと理解する。その一方で、実装屋の考え方で言えば、ORマッピングでのモデル=SQLドライバという考え方が、直感的に使いやすい。ってか、僕も松尾くんも、SQLに引きずられている。だからこうなっちゃうのかも知れないけれども。でも、やっぱり、使いやすい感覚はある。
考え方が分かれた。結局、自分では「本来のオブジェクト指向の考え方」に沿った形で教科書を出しておきながら、実装している自分のシステムでは、モデル=SQLドライバという感じで、実装した。

Djangoの場合には、MVCではなくて、Model / View / Templateだから、MVTと呼ぶべきなのかも知れないけれども、有限会社シグナリス的には、シグナリス的Django実装として、Model=SQLドライバ的な実装にすることにした。

「シグナリス的Django」も、松尾くんが今年になってよく口にする言葉で、言ってみれば、我が社(有限会社シグナリス)の、「必殺技」を開発しましょうというもの。初代ウルトラマンで言えば、スペシウム光線(古すぎて、通じない?)を、っていうか、ドラゴンボールで言えば、カメカメ波(もっと他に、知らんのか?)っていうか、これでも古いか、それじゃぁ、ワンピースで言えば、(・・・新しすぎて、私が全くわからん。学生が研究室に持ってきた単行本を、断片的に2冊分くらいは読んだか、っていう程度で・・・)あ、そうそう、必殺技って言えば、宇宙戦艦ヤマトの「波動砲」ね。(これが一番、知名度低くないか?)とにかく、「必殺技」。それを、我が社の切り札に育てましょうと、そういう修行の時だから、形には多少こだわってる。と言いつつ、繰り出しやすい技にしなければ、とも、思う。技に入る前に、呪文を5秒も唱えていたら、倒されてんじゃね?

で、冒頭の継承と、オーバライド。認証系の実装で、彼としばらく調整が必要になりそうだ。っていうか、今回もたぶん、松尾くんの意見を全面的に通すかなぁ。
システムを使うユーザのクラスに、抽象化された認証ユーザを継承させるか、それとも、一対一のリレーションを張って、継承クラスではない一般クラスとして実装するか。
5年後を考えたなら、このシステムをメンテナンスするのは、僕でも松尾くんでもない可能性が、ない訳じゃない。いや、無論、僕らのどちらかが、このシステムのメンテナンスを永遠に続ける、なんてことも考えられるけれど。
だとしたら、かなり初級レベルに近いプログラマでもメンテナンスできるようにしなければ、なんてことも、今、考えておくべきなのかなぁ、なんて思うと、必然的に答えは見えてくる。
なんてことを、こうして言葉にしてまとめてみて、やっと決心がついた。
自分対自分の、独り言の、別バージョンかなぁ。

Railsにしても、Djangoにしても、結構哲学的に深いものがありそうな気がする。というよりも、「オブジェクト指向」的な考え方は、実社会に投影しても、継承させて、オーバライドさせるのか、独立性をより高めるのか、案外そのまま「考え方」が通じてしまう側面がありそうな気がする。だとしたら、「オブジェクト指向的社会学」なんて、成り立ったりするかも知れない。ちょっと、面白そう。図書館から何冊か本を借りてきて、温泉宿か何かに篭って、一気に何か「本」みたいなのを書いてみようかなぁ・・・
なんて、この脱線は、完全に有限会社シグナリスにとって、無益かつ有害な脱線になりそうだ。

ちょっと何か考え始めると、すぐに脱線するんだもの。まだ、ワンピースを1巻から全部読んだ方が、ましかも。
(そんなこと、しません、てば。それどころの騒ぎじゃないだろ。今日中に、画面を3枚は動かさないと。)