この記事の内容
この記事は〇〇アドベントカレンダー17日目、とかでもなんでもありません。
(そういう時期だったので。。)
@k-okina さんからこんなツイートを頂いたので、返信をしようかと思ったのですが、返信を考えていたらtwitterで返信するにはちょっと文字数が長くなってしまったので、Qiitaの記事に対するコメントならQiitaの記事にして返信してしまおう。といった発端で書いています。
@hirodragon112 discordにも貼りましたが、もしよければアドバイスや意見頂けたらと思います\(^o^)/ (明日のDDDのアドカレは今から書きます
— k-okina (@kahirokunn) 2018年12月16日
該当記事はこちらとなります。
自分用メモ: そもそものオブジェクト指向とは
読んでみた感想
きれいにまとまっていて参考リンクも豊富で凄く勉強になりました。
と、それだけだとせっかく声をかけて頂いたのにもったいないので、一読者の感想としてもう少し詳細に感想を記載しつつ、せっかくなので『オブジェクト指向』という言葉にフォーカスをあててみたいと思います。
コンテキストによるオブジェクト指向が指す対象の違い
該当記事にて使用されている『オブジェクト指向』もしくは『OOP』という言葉が分節によっていくつか意味合いが変化しているように感じました。
『オブジェクト指向』と一言で表しても文脈により指している主眼が違ったりする事があると思います。
- オブジェクト指向パラダイム(object oriented paradigm)
- オブジェクト指向分析設計(object-oriented analysis and design)
- オブジェクト指向分析(object oriented analysis)
- オブジェクト指向設計(object-oriented design)
- オブジェクト指向プログラミング(object oriented programming)
そういった観点で記事を読むと、
『構造化プログラミング』の章でのOOPとは「オブジェクト指向設計」、『オブジェクト指向では』の章では「オブジェクト指向プログラミング」、『つまり』の章でのオブジェクト指向は「オブジェクト指向パラダイム」を観点に記述されているような気がします。
パッケージ、モジュール、オブジェクト
パッケージもモジュールも何もかもがオブジェクトみたいなことを書いていますが、これは言語の実装によりけりです。
記事でも記載されている通り、ここは言語仕様によるのかと思います。
例えば、私がメインで使用しているPHPで『パッケージ』が何を指すか、と言われると、オブジェクトというよりは(パッケージ構造を表現している)ディレクトリの方がイメージが近いかもしれません。
感想まとめ
オブジェクト指向を整理用の記事という事で、網羅的にかつ、具体的な手法以外の観点で整理されていたので凄く勉強になりました。
私自信もこういった観点からも自分なりに考えを整理しまとめてみたいと思います!
ありがとうございました。
感想以外の事
せっかくQiitaの記事としたので記事の感想だけだともったいないので、これからオブジェクト指向を学ぶ方の参考になればと思い、
ついでに上記のオブジェクト指向○○についての補足的な事を少し書きたいと思います。
上記の感想の中でも書きましたが、ひとえに『オブジェクト指向』と言っても、コンテキストにより対象としている領域が様々です。
特に気をつけたいのが、設計に関する知識とプログラミングに関する知識は別要素として捉えた方が学習時に混乱がなくて良いかと思います。
一般的に『オブジェクト指向設計』が対象とする範囲はいわゆる設計だけにとどまらず、モデリングや補助設計や詳細設計、時には要件定義の工程まで絡んでくる場合があります。
(RDRA, ICONIX手法 等)
これらは概念的な色合いが強い為、ライフサイクルの長い考え方だと捉える事ができるかと思います。
※ 詳細については当記事の対象ではないため割愛します
対象に『オブジェクト指向プログラミング』が対象とする範囲はまさにプログラミング領域です。
オブジェクト指向パラダイムにのっとった、具体的な最善の実装表現方法を考察する意味合いとなるかと思います。
デザインパターン等はここに含まれるかと思います。
こちらはソフトウェアを取り巻く物理的な環境や言語の変遷により流行り廃りがある、 = ライフサイクルは設計よりは長くないかもしれません。
また、『オブジェクト指向言語』を使用しているから = オブジェクト指向プログラミングができている
という訳でもないので注意が必要です。(これはフレームワークについても同様の事が言えると思います)
上記の違いを念頭に入れて、オブジェクト指向を学ぼう!と思った際に、具体的に自分が知りたい領域がどこにあるかを整理してから学ぶと、より効率よく吸収されるかもしれないと思います。
あくまで個人的にな見解としてはオブジェクト指向の本質に近いのは設計だと思っています。
と言うのも、オブジェクト指向とは単なる手段の1つでしかなく、その手段により叶えたい『目的』とは柔軟なソフトウェアを作成する(変更容易性)、という事だと思っています。
ですが、これも本当の目的ではありません。あくまで開発者目線での目的です。
ソフトウェアに変更容易性を確保し、運用や改修等、ソフトウェアと通じてユーザーが叶えたい真の『目的』を実現する事がソフトウェア開発の本当の目的だと思います。
それを達成する為にはやはり『設計』が重要だと思います(プログラミングももちろん重要な要素ですがあえて比較するならです)
オブジェクト指向設計というプロセスをせっかく採用するのであれば、そのような観点からソフトウェア開発と付き合ってみるとまた新たな楽しさが見えてくるような気がします。