第22回「思考を変えろ!!数学的から国語的思考へ」
更新日:
こんにちは。森川です。
今月は出張3回に各種資料作りに追われていたため、書く時間がありませんでしたと言い訳してみる。
今回はプログラミングの順番ですね。
オブジェクト指向の続きを書きます。
前回までは、
- 1. オブジェクト指向について書いてみたい
- 2. オブジェクト指向(OO オーオー)とはなんぞや??(前編)
- 3. オブジェクト指向(OO オーオー)とはなんぞや??(後編)
- 4. 偉大な先人達に学べ。デザインパターンの重要性。
- 5. たかが文法されど文法。
の流れで説明してきた。
第6回目の今回は、GoFを習得するために「思考を変えろ!!数学から国語的思考へ」というお題で書いていきたい。
数学的 or 国語的とは??
私は構造化プログラミングを「数学」、OO(オブジェクト指向)を「国語」だと思っています。
どういうことかと言うと、構造化プログラミングの書き方は、こんなイメージ
(他サイトより適当に拝借していますmOm)
それに対してOO(オーオー)の考え方で書かれたコードは、こんなイメージ
・ピザの生地のソースを塗ります。
・ピザの上に野菜をちりばめます。
・更にベーコンをのせます。
・そして最後にチーズをのせます。
・オーブンで10分間やきあげます。
・その結果、ピザが完成!!
前者は数式にようにコードを書く。
それに対して後者は数式ではなく文章のようにコードを書く。
文章であるからOO(オーオー)で書いたコードにストーリーが存在し文章として読むことができる。
登場人物が誰誰で、その登場人物がこう動くから、その結果〇〇になりました、みたいに。
前者が数学的、後者が国語的というのはそういう意味です。
国語的思考法で考えろ!
OO(オーオー)を理解するには、国語的思考を取り入れないといけない。
数学的な思考でプログミングされたコードをみるとクラスを定義していても文章のように読むことができない。
名前の付け方を見ても、わかりやすい名前にはしてあって、共通化できる部分はまとめてあって、きれいに整理しているのだけど、コードが文章として読めない。
たぶんそれは、y=2x+1の世界で考えているから。
以下は某サイトより適当に拝借したコードです。
(他サイトより適当に拝借していますmOm)
上記を英語の文章として読もうしたら読めるでしょ。
英語のS V Oみたいな感じになってるよね。
名前の付け方もメソッドは英語のV(動詞)のような名前の付け方をするし、クラス名はS(主語)のような名前の付け方をするよね。
そうやってお話しを作るようにコードを書いていく。
オブジェクト指向ってよく現実の世界に例えられるけれど、それってまさにこういうことだと思う。
OO(オーオー)を解説しているサイトをみると、「動物クラスを作って犬オブジェクトを生成して、吠えるメソッドを実行する」みたいな説明をよくみる。
昔、これを見てなんでこんなわけわからない説明をするのだと思っていた。
なんだよ犬って、関係ないじゃん!!
そうではなくて、OO(オーオー)ではそういう考え方、書き方をするのです。数学的ではなく国語的だから。
以前、クラスを定義できる人がOO(オーオー)を理解しているわけではないということを書いたけど、
数学的思考でクラスを定義すると、この切り口はないでしょうというクラス定義になる場合がある。
鳥&人間&車クラスとか、ありえないようなクラス定義になったりする。
算数的思考であればコードにストーリー展開など考えないからそうなってもおかしくないし、そうなるってことはまだ数学的思考で考えているってこと。
GoFには国語的思考方法が必須
この国語的思考方法がGoFを理解する上で非常に大切なのです。
数学的思考ではGoFは理解できない。
数学的思考の人が、GoFを学ぼうとしたときにどうしようとするかというと、「コードを暗記」しようとする。
昔、数学の〇〇の公式とか〇〇の定理を暗記したのを思い出す。
数学の公式を覚えるのと同じ感覚よね。
私も経験あるからわかるけど、これではGoFは使いこなせない。
数学的思考でGoFをみるとパズルゲームにしか見えないから何をしようとしているのか理解できない。
だから完全に暗記したとしてもいつどこで使えばいいのかわからないはず。
国語的思考の人がGoFを学ぼうとしたときにどうするかというと、登場人物が誰々で、その登場人物がどのように相互作用して働くのかを覚えようとするのよ。
コードではなくストーリーの流れを覚えようとする。
そのストーリーをコードに落とせばいいだけだからコードを暗記する必要はない。
だから、実際に実装するときは、GoFの教本と同じようにはならない場合もあると思う。それでいいのよ。
登場人物が誰々で、彼らが相互作用してどう働くのか、これをまとめているのが、システムの世界では、クラス図でありシークエンス図というようなUML図だよね。
私は、GoFのコードは覚えていないし暗記しようとしていないです。
コードではなくクラス図とシークエンス図を覚えています。それをコードに落とし込めばいいだけ。
このようにGoFは国語的思考法で考えると、どういうところで使えばよいのか見えてくるよ。
簡単にいうと国語的コードには、ストーリーが存在するからそのストーリー展開が当てはまるところよ。
最後に、OO(オーオー)で書くと全部、国語的になるかというとそうではないよ。
当然、数学的にゴネゴネした部分も必要になる。
ただし、それはなるべく表には出てこないように見えないところに隠蔽、局所化して触らないでいいようにする。
フレームワークなんか使ったらよくわかるよね。
データベースからデータとってくるのにわざわざゴネゴネしたsql書かないよ。
〇〇.findByName(xxxx)みたいにしてゴネゴネしたsqlって隠蔽化されてるよね。
フレームワークって単なる便利な道具ではなくて、OO(オーオー)勉強する良い教材ですよ。
そのへんはおいおいと。
今日は以上、ではでは。
今日の独り言
この季節に街を歩くと、まだスーツが様になっていない明らかに新入社員です、みたいなお兄さんやお姉さんをよく目にする。
それを見ると自分が新入社員だったあの頃を思い出し懐かしく思う。
まぁ、本当によく怒られたですわ。
会社入って2~3年は毎日会社で先輩や上司に怒られてた気がする。
怒られ過ぎて先輩に話かけるのも怖かったし、わしは無理じゃ、ついていけん、辞めたいっていつも思ってた(笑)。
学生あがりのあまちゃんだったのだと思う。
でもこうやって会社を出たらよくわかるけど、20~30歳のあの頃に厳しく育ててもらったというのは本当に自分の財産になっていると感じる。
結果的には辞めることになったけれど10年以上お世話になった前会社には今も感謝している。
20~30歳って人間形成でとても重要な時代だと思う。
そのときにどう過ごすかで人生変わると言っても過言ではない。
だから、がんばれがんばれ新入社員達!!