Open23

オブジェクト指向について考える

eatski(itski haga)eatski(itski haga)

背景

OOUI本を輪読する機会があり、その場にデザイナーさんもいた
デザイナーさんは非プログラマ(jsは少し書ける方もいた)なのでオブジェクト指向について全く知らない状態

eatski(itski haga)eatski(itski haga)

課題感

流石にOOについて多少知って頂こうという流れになったのかデザイナーさんがOOについて勉強しようとしてるところを見て思ったのは、
OOUIの文脈からするとOOの記事とかで必死に説明されてる「クラス」「継承」という概念はノイズでしかない。
デザイナーさんが知るべき情報に一発でアクセスできる記事って少ない(埋もれてる)ということ

eatski(itski haga)eatski(itski haga)

OOの学習が思うようにいかないのは

  • OOに関する情報が記事によってまちまちすぎる
  • OOについて厳密な定義がない
  • そもそもOOを使うことが強く支持されてるわけじゃないし、OOを使ってコードが綺麗にかけるかというとそうでもない

という理由があると思う
これらをなんとなく頭のなかでごちゃごちゃさせた結果

「オブジェクト指向なんてない。と考えた方がいいのでは」
っていう自分のなかで仮説ができてる

eatski(itski haga)eatski(itski haga)

例えば経験者が初学者に「OOを意識してコードを書いて」と言ったり、エンジニアの募集要項に「OOな設計ができること」みたいな記載があったりすると、
当然「OOとは何か」っていう問いが生まれる
「OOとは何か」ということをクイズ的に突き詰めすぎると、アランケイとかsmalltalkとかの原理主義に突き当たる。あるいは経験者からその手の知識でマウントをとられる。
本来重要なのはOOなコードを書くことではなく、高凝集・疎結合なコードを書くこと。
OOの定義に拘って、むしろ汚いコードを書くような失敗をじぶんはしてきたのでそれは本質的でないなーと

eatski(itski haga)eatski(itski haga)

結合度と凝集度に対する理解が甘いのに「オブジェクト指向」という「手段」に囚われてしまうのがだめ

eatski(itski haga)eatski(itski haga)

オブジェクト指向は

カプセル化によって「結合度」を低くする
データが処理まで持つことによって「凝集度」を高くする
ことが目的

まずは結合度と凝集度の概念を頭に叩き込んで、そこから有力な手法としてオブジェクト指向を学ぶ

eatski(itski haga)eatski(itski haga)

「初学者がオブジェクト指向を理解しようとすると絶対勘違いするからオブジェクト指向なんて無視してプログラミングした方がいいよ」っていうテーマありかな

eatski(itski haga)eatski(itski haga)

初学者がオブジェクト指向で躓いたり誤解したりする要因
品質特性 + 戦略 + 実装 が一緒くたに語られるから?

■獲得したい品質特性

  • 高凝集
  • 疎結合

■そのための戦略

  • オブジェクト指向
    • カプセル化

■そのための実装

  • Java
eatski(itski haga)eatski(itski haga)

オブジェクト指向に関する初学者向け記事を漁ってるけど、「こんなの初学者がわかるわけないだろ!」な記事か「で、これでソースコードは良くなるの?」な記事がほとんどかもしれん
泣きそう

eatski(itski haga)eatski(itski haga)

Javaはオブジェクト指向で実装しやすくしている言語には間違いないが、別にオブジェクト指向でJavaを実装したからといって売り上げが伸びる訳じゃないんやでという気持ち

eatski(itski haga)eatski(itski haga)

「継承」、「カブセル化」、「ポリモーフィズム」
って最悪なキャッチフレーズなんですよね

継承 = 言語の具体的実装機能
カプセル化 = 疎結合を実現するための戦術
ポリモーフィズム = モジュールが獲得すべき 品質特性

レイヤーが違う3つを並列に並べてるの本当に良くない。
これで1年は無駄にした気がする

eatski(itski haga)eatski(itski haga)

これが答え

オブジェクト指向プログラミングでは、データと動作がパッケージになっています。これにより、処理に必要なデータと動作を別々に管理したり呼び出す必要がなくなります。このパッケージを、オブジェクトと呼びます。オブジェクト指向のプログラムでは、たくさんの小さなオブジェクトの集まりによる相互作用によって、大きな構造体を動かしていきます。

ソシオメディア株式会社,上野 学,藤井 幸多. オブジェクト指向UIデザイン──使いやすいソフトウェアの原理 (WEB+DB PRESS plus) (Japanese Edition) (Kindle の位置No.2701-2704). Kindle 版.

eatski(itski haga)eatski(itski haga)

「オブジェクト指向」をわかりやすく説明するのは多分無理なので、
「オブジェクト指向とどのように関わるか」を説明するのが一番いいと思った

eatski(itski haga)eatski(itski haga)

アウトライン
テーマ「初学者がオブジェクト指向とどう関わる(関わらせる)べきかを考えてみた」

  • やってはいけない
    • 安易に「オブジェクト指向とは何か?」という問いを立てない
    • 安易なキャッチフレーズに飛びつかない
  • どのように導くか
    • 「オブジェクト指向」の前に獲得すべき品質特性を理解すべき
    • 品質特性と設計思想と実装のレイヤーを意識する
eatski(itski haga)eatski(itski haga)

オブジェクト指向って厳密な定義がない以上、
コンテキストやメリットを議論に組み込むしかない
そこを無視したオブジェクト指向は意味がない

eatski(itski haga)eatski(itski haga)

オブジェクト思考に関して、
「どこかの知らない誰かが正解を知っている」
という幻想を信じてしまってはだめで

信頼できる誰かが持つプラクティスからオブジェクト指向を抽出する。のが一番の近道かも

eatski(itski haga)eatski(itski haga)

オブジェクト指向を簡易的に学びたい
っていう欲求に対する打ち返しを考えたい