オブジェクト指向でなぜつくるのか - 第4章
第4章 OOPは無駄を省いて整理整頓するプログラミング技術 を読んでの所感
この章では、OOPのより具体的な仕組みと、構造化プログラミングとの違いを書いています。OOPの「クラス」「ポリモーフィズム」「継承」の三つをさらにわかりやすく理解しやすいように説明をしています。
OOPへの理解が少ない状態だと、「ポリモーフィズム」も「継承」も「クラス」の仕組みの一部のような感じがしますが、そうではないようです。
また、よく説明されるのは「クラス」ではなく「カプセル化」らしく、僕も会社の元先輩からオブジェクト指向の説明を受けた際に、「カプセル化」というキーワードを聞きました。ただ、この本では、「カプセル化」の仕組みを提供する「クラス」の役割はそれだけではないので、今回は「クラス」と説明すると書いてありました。
少し脱線しましが、「カプセル化」とは、内部のふるまいを気にせずにメソッド名を書けば処理してくれることという認識だったのですが、少し調べたらフィールドとメソッドが呼び出し側から影響を受けないように保護することらしいです。
ずっとずれた認識でいました。本を読むことで、自分が何となくで認識していた知識がどんどん修正されていくのが良いですね
本書の感想に戻ります。
「クラス」には様々な仕組みがあり、端的に言うと「まとめて、隠して、たくさん作る」仕組みと説明しています。
確かに、フィールドとメソッドを一つのクラスに「まとめる」。フィールドとメソッドを外部から「隠す」。(これがカプセル化ですね)クラスからインスタンスを「たくさん作る」と説明できますね。クラスってなかなか説明しにくい概念というか仕組みのような気がするんですけど、こんな風に端的に説明できるのはすごいですね。さらに、少しOOPについて勉強している人はあ~と納得できる説明だと思います。
ポリモーフィズムと継承についても一言で説明していますが、割愛します。
C#を触っていると特に疑問を持たずに使用する、パッケージや例外処理。あと、メモリ管理を意識しなくてよいガベージコレクション。これらの機能もOOPで構造化プログラミングでの課題を解決するための進化した仕組みということを初めて知りました。
OOPを知るだけで、品質や保守性を高めるコードをかければいいのですが、なかなかそうはいきません。実際に今回かかわったプロジェクトからOOPを意識したコーディングを行っているんですが、慣れないうちは全然OOPの仕組みを利用できていなかったと思います。先輩にコードレビューをしてもらい、メソッドをModelに書いてもいいんだ!(今回はASP.net Core MVCを使用)と気づいてから、だいぶOOPぶったコーディングをできているような気がします。ただ、まだポリモーフィズムや例外、クラスの役割の単一化?とかがうまくできていません。早く仕組みを利用できるようになりたいと思っていますが、自分は一回で理解できるタイプではなく、5回10回試してみないと自然と使えるようにならないので、何度も何度もコードを書き直して、クラスの設計を考えて練習しています。
オブジェクト指向でなぜつくるのか - 第3章
第3章 OOPを理解する近道はプログラミング言語の歴西あり を読んでの所感
この章では、機械語からOOPが考案されるまでの歴史を書いています。
機械語→アセンブリ言語→高級言語→構造化プログラミング言語→OOPの流れですね。
自分の中での言語の構造?の分け方は「低級言語(機械語)←→ 高級言語(C#とか)」みたいな対立したイメージだったんですが、「低級言語(機械語、アセンブリ言語)←→ 高級言語(構造化プログラミング、OOP)」で、構造化プログラミングやOOPの中にC言語やJavaなどの言語が存在している感じなんですね。
構造化プログラミングの特徴である、①順次実行 ②条件分岐 ③繰り返しは、プログラミング言語自体の特徴という認識だったので、自分の認識違いに気づけて良かったです。
文中でサブルーチン、メインルーチンという個人的には慣れない言葉が出てきて、意味もプロシージャや関数の別名のようなので、メソッドって書いてくれた方がわかりやすいなーと思ったけど、メソッドはOOPの用語になるので、ここでは出ないのか!って当たり前のことを思いました。
機械語が考案されたのが1940年代(wikipedia参照)で、そこから現在までのプログラミング言語の歴史を知って、当たり前だけど、今使っているOOPが唐突に出てきたわけではなく、それまでの言語の課題を解決するために考案されて改善されてきているんだなと感じた。やっぱり今までの歴史を知ることで、今の技術に対する理解や関心が深まったと思います。
次世代のプログラミング言語は、HaskelやScalaなどの関数型言語が推されているらしいです。なかなかそこまで手を出す技量がないので試せないですが、自分が現役の間に、大きくプログラミングの環境が変わったりするのかと興味半分不安半分の気持ちです。
オブジェクト指向でなぜつくるのか - 第2章
第2章:オブジェクト指向と現実世界は似て非なるもの を読んでの所感
この章では、従来の「オブジェクト指向が現実世界をそのままソフトウェアに表現する技術である」という説明を考え直す章になります。
まずは、従来の流れでクラスやインスタンス、ポリモーフィズム、継承などのオブジェクト指向の説明を行い、その後、その説明に対して、筆者の考えを述べています。
筆者の考えとは、クラスやインスタンスが現実世界を表現している部分もあるが、「そのまま表現している」というのは語弊があるということだと思います。
クラスとインスタンスの関係性を例にとってみます。
クラスを犬、インスタンスをポチとした際に、オブジェクト指向では、ポチを生成するために犬というクラスが存在します。ただ、現実世界では、ポチが生まれるために犬が存在しているわけではなく、また、ポチが生まれる際も、2匹の交尾から生まれてくる。結果は同じようでもそれまでの過程が違うということを述べてるのかな。
正直、オブジェクト指向の認識が、従来だといった「現実世界をそのまあソフトウェアに表現する技術である」とまでは認識していなかったので、そこまでピンとこなかった。クラスとインスタンスだと、型とタイ焼き、ポリモーフィズムは勇者、戦士、僧侶的なイメージで考えていて、それが現実世界を映し出すとは思ってなかった。
章内では、オブジェクト指向は現実世界の仕組みと似て非なるものであり、プログラミングのための仕組みと割り切って理解することを推奨しています。
何気に章末のCOLUMNが面白いですね。
今回はバズワードに関して書いてます。
バズワードってどっかで聞いたことあるなーとは思ってましたが、技術トレンドを表す言葉を呼び方らしいですね。流行語大賞のようなものではないですが、ある程度目的をもって広まった用語がバズワードに該当するようです。
説明では、用語一つとっても、市場やニーズを作りだす役割があるらしく、具体的な技術だけじゃなくても興味関心をひかせることができることがあるんですね。
オブジェクト指向でなぜつくるのか - 第1章
第1章:オブジェクト指向はソフトウェア開発を楽にする技術 を読んでの所感
この章は「オブジェクト指向とはどのような存在なのか」ということを説明しています。本書では、オブジェクト指向を一言で表現すると「難しいソフトウェア開発を楽に行うための総合技術」と書いてあります。
確かに、オブジェクト指向をうまく使えば、ソフトウェア開発は楽に変更にも強くなる気がします。
個人的に読んでいて重要なのは見出しと以下の二点かなと思いました。
1. オブジェクト指向の影響範囲
2. オブジェクト指向の理解を阻害する要因
一つ目の「オブジェクト指向の影響範囲」は、オブジェクト指向がプログラミング言語だけにとどまらず、ソフトウェアを開発するための多くのことに影響を及ぼしていることになります。本書内では、オブジェクト指向の全体像を以下の6個の要素で説明しています。
②再利用部品群(クラスライブラリ、フレームワーク、コンポーネント)
④UML
自分のオブジェクト指向の認識は、クラス、ポリモーフィズム、継承などの技術があるみたいな認識だった。だが、上記の要素を見ると、それは①OOPに該当する内容で、オブジェクト指向とはもっと広い範囲で使われているものなんだと知った。
確かに、②③④の要素はOOPをベースにやれることを増やしたんだろうと思うので、それもオブジェクト指向と呼んでいいのかなと思った。
⑤⑥に関しては、自分がまだそこまで理解してないので、よくわからない。
とりあえず、オブジェクト指向は言語だけにとどまらないんだよ、それをベースにソフトウェアを開発する手法があるんだよという感じです。
二つ目に重要かなと思った「オブジェクト指向の理解を阻害する要因」は自分もオブジェクト指向を勉強した際に感じたことです。
阻害する要因は三つあり、「初めに説明される特殊用語が多い」「比喩が乱用されている」「すべてをオブジェクトであると説明される」と紹介しています。
その中で、自分が一番共感したのは、「初めに説明される特殊用語が多い」です。
だいたいどんなことでも、新しいことを学ぼうとすれば専門的な用語は多いものです。
それはしょうがないなと思いますが、確かにオブジェクト指向を学ぶ際はクラスから始まり、継承、インターフェース、コンストラクタ等々いろんな用語が出てきて、頭が混乱した覚えがあります。いろんなサイトを見て勉強したいたので、それよりも一つの本を読んで勉強した方が、用語の説明の統一性があるとは思いますが、それでもわからないことが多々あります。
阻害する要因一つ一つだけでもわかりづらいものですが、それが三つ合わさってくるので、さらにオブジェクト指向までの理解が遠のきます。
第二章では、「オブジェクト指向は現実世界をそのままソフトウェアに表現する技術である」という、説明を考え直す章になります。
「オブジェクト指向でなぜ作るのか」を読んでみて - 初めに
「オブジェクト指向でなぜ作るのか」第2版を読み始めました。
読み始めたきっかけは、C#を使って開発してるんですが、オブジェクト指向言語の強みを生かして開発できていないよなーと思ったからです。
今までの業務は過去プロジェクトの改修作業ばっかで、コーディングの仕方もそのプロジェクト内のやり方を真似してやってました。
改修作業中はコードの書き方とかは疑問に思ってなかったのですが、新規でASP.net Core MVCを使用してコーディングを行ってみてびっくりしました。
LinqやEntityFrameworkを使用しているだけなので、知っている人からしたら大したことないと思いますが「こんな便利な技術があるのか!!」と私は感動しました。(過去プロジェクトはListすら出てきていなかった気がする・・・)
それに加えて、クラスという考え方も過去プロジェクトでは全然上手に使っていなくて、言語の力を上手に使えば、バグの少ない上質なコードが書けるのではないかと思いました。
なにか勉強に役立つ本ないかなーと探しているときに、クラスとか継承って、オブジェクト指向言語の考え方だよなーと思い、この本を手に取りました。
結構読みやすそうな内容と情報量だったので、買ってみました。
アウトプットの練習ついでに1章ずつ感想と内容を投稿していきたいと思います。
ブログの目的
はじめまして
名古屋で働いているプログラマーです。
C#を使ってWebサービスの開発をメインで行っています。
業務によってはiPhoneやAndroidのアプリも作成していますが、swiftやjavaよりC#、xcodeやandroid studioよりvisual studioの方が好きです。
プログラマーになったのは就職してからなので、プログラマー歴は現在で1年半ぐらいです。
もともとプログラマーになる予定はなかったのですが、業務をしているうちにいつの間にかプログラマーの業務についていました。
大学時代に講義で少しだけC言語を触ったことがありますが、ほぼ素人なので現在いろいろ勉強中です。
このブログ目的は、勉強した内容のインプット用として更新していきたいと思います。
大体三日坊主で終わってしまうので、長く続けていきたいです。