🚘

書籍「オブジェクト指向でなぜつくるのか第2版」を読んだので"超ざっくり"でまとめてみた

2021/06/06に公開

購入リンク
会社の上司が貸してくれたので、ありがたく読ませていただいて、自分のためにまとめることにする
第3版が出てるということなので余裕があればまた読むことにする

第1章

オブジェクト指向言語が難しいと言われる理由

  1. 用語の洪水
  2. 比喩の乱用
  3. なんでもオブジェクト症候群

第2章

オブジェクト指向言語の三大要素

カプセル化(クラス、インスタンス、メソッド)

クラスはインスタンスをつくるための仕組み
クラスの中に書かれている関数がメソッド
インスタンスにメソッドを指定することでそのメソッドが発火する

継承

あるクラスを継承し、同じメソッドをもった新しいクラスを作成すること
継承された側はスーパークラスと呼ばれる

ポリモーフィズム

継承前のクラスのメソッドを指定することで、それを継承したクラスなら実行できるような命令が書けること

第3章

プログラミング言語の歴史

機械語(2進数や16進数など)でコンピュータに命令する時代から始まる
アセンブリ言語が登場、コンパイルするアセンブラと呼ばれる別のプログラムを読み込ませて機械語に翻訳する
高級言語が登場、今のような人間が理解しやすい言語となった

ソフトウェア危機

世界総人口がプログラマになっても、ソフトウェアへの需要に追いつけなくなること

基本三構造

これに対応するため、構造化プログラミングと呼ばれるものが誕生し、基本三構造という考え方が広まる

  1. 順次進行
  2. 条件分岐
  3. 繰り返し

サブルーチン(関数)

プログラムの複数に現れる同じ処理を、一箇所にまとめてプログラム作成の手間を減らすもの
サブルーチンの独立性を高めることで保守性が高まる👉グローバル変数が独立性を低めてた要因
上記を実現するためにローカル変数と引数の値渡しが考案される
ローカル変数・・・サブルーチンを入るときに作られて、抜けるときに消える
引数の値渡し・・・参照変数を直接使わず、コピーしてサブルーチンに渡し、参照変数に影響を与えずにすむ

第4章

オブジェクト指向言語の三大要素-2

  • クラス
    • メソッド(サブルーチン)とインスタンス変数をまとめる
    • メソッドとインスタンス変数を他のクラスから隠すことができ、クラス内部だけで使うことが設定できる
    • 型として扱うことができる
  • 継承
    • スーパークラスの共通メソッドやインスタンス変数を別クラスにまとめる
    • コードの重複を防ぐ
  • ポリモーフィズム
    • 共通メインルーチンの作成ができる

インスタンス変数・・・同じクラス内のメソッドからのみアクセス可能と指定できる、仲間内だけのグローバル変数のようなものであり、長持ちするローカル変数のようなものである

進化したオブジェクト指向言語の三大要素

パッケージ

クラスをただまとめることができる
パッケージをパッケージでまとめることもできる

例外処理

戻り値とは違う形式で、メソッドからエラーが帰ってくる際に、どういう処理を行うかを記述できる

ガベージコレクション

5章で説明

第5章

プログラムの実行方式

コンパイラ方式

C,COBOL,GOなど
メリット・・・機械語を直接読み込む、実行速度が速い
デメリット・・・コンパイルが必要、実行するまでの記述などの時間がかかる

インタプリタ方式

PHP,Rubyなど
メリット・・・プログラムを書いてからすぐ実行でき、異なるOSで動かすことができる
デメリット・・・実行速度が遅い

中間コード方式

Java
コンパイラを使って、ソースコードを中間コードに変換し、専用のインタプリタで解釈する
👉異なるOSで、実行速度が速いコードをかける

CPU処理の仕組み

スレッド・・・プログラムの実行単位
プロセス・・・スレッドが集まったもの、コンピュータの中で動く人まとまりの実行単位
マルチスレッド機能・・・スレッドを複数同時に実行できる環境、全く同時というわけではなく、全て少しずつ並行して処理が行われる

メモリ領域

  • 静的領域・・・アプリケーション開始時に確保し、グローバル変数とコード情報を格納する
  • ヒープ領域・・・プログラム実行時に一定領域を確保し、都度アプリケーションが必要とすれば割り当てる
  • スタック領域・・・スレッドごとに用意され、サブルーチンの引数やローカル変数を格納する

クラスとメモリ

1クラスにつき1つだけメモリの静的領域に読み込まれる
読み込まれるタイミングは2種類

  1. 事前に全てのクラス情報を一括して読み込む
  2. 必要な時点で逐次読み込む

インスタンスとメモリ

作成したインスタンスは全てヒープ領域に配置される
変数には、インスタンスのポインタを格納する
変数をいじっても、ヒープ領域にあるインスタンスそのものに影響はない

メソッドテーブルと継承

静的領域内にある、各クラスに定義されたメソッドが展開されている場所を、順番に格納したものをメソッドテーブルという
継承したメソッドはメソッドテーブルに格納し、インスタンス変数は、ヒープ領域にあるサブクラスの全てのインスタンスにコピーされる

ガベージコレクション

ガベージコレクタが行う処理で、どこからも参照されていない孤立したインスタンスの削除を行う

第6章

再利用部品群

クラスライブラリ

汎用的な機能を持つクラスをたくさん集めたもの

  • ライブラリ中のクラスからインスタンスを作成できる
  • ポリモーフィズムの利用できる
  • メソッドや変数を追加定義して新しいクラスを作成し、継承を利用できる

フレームワーク

特定の目的を果たすためのアプリケーションの半完成品のこと
ハリウッドの原則
👉アプリケーションの処理はポリモーフィズムを使って必要な時に呼び出す仕組み

コンポーネント

実際の定義は曖昧
クラスよりも粒度が大きく、機能の独立性が高く、内部の詳細を知らなくても利用できるもの

デザインパターン

設計パターンのことで、共通する設計のアイデアを形にして再利用したもの
プログラミング言語以外にも、様々な場面で繰り返し使われるクラス構造のこと
代表的なデザインパターン:GoFのデザインパターン

第7章

上流工程で使われるオブジェクト指向

集合論

1つのクラスから実行時にたくさんのインスタンスを作る仕組み

役割分担

インスタンスを指定してそのクラスのメソッドを呼び出す
特定の役割を持つもの同士が決められた方法で連絡し合う

第8章

UML(統一モデリング言語)

13種類の設計図の書き方
UML入門

第9章

コンピュータの得意技

「決まり切った仕事」と「覚える仕事」が得意技

モデリング(設計)3ステップ

  1. 業務分析・・・まず現実世界での仕事の進め方を整理する
  2. 要件定義・・・コンピューターの得意技を考慮して、コンピュータに任せる範囲を決める
  3. 設計・・・ハードウエアの能力、OSやミドルウエアの特性、プログラミング言語の表現能力などを考慮して、ソフトウエアをどう作るのかという構造を決める

ビジネスアプリケーション

ビジネス活動に利用するソフトウェア
ステップ通りに業務分析・要件定義・設計を行う

第10章

オブジェクト指向設計の目標

重複を排除する

機能が重複すると、規模が大きくなって修正漏れが起こる
設計の段階で重複が発生しないようにする

部品の独立性を高める

保守性や再利用性を高めるには独立性を高める必要がある

  1. 凝集度・・・どれだけ機能がまとまってるか、強いほどいい
  2. 結合度・・・機能間の結びつき、弱いほどいい

上記達成するコツ

  • 一言で表現する名前をつける
  • プライベートメソッドなどたくさん作る
  • 小さく作る

依存関係を循環させない

パッケージやクラスの依存関係を循環させないことが重要
AはBに依存して、BはCに依存して、CはAに依存しているという状況を作らない

第11章

アジャイル開発

書籍「More Effective Agile」を読んだので"超ざっくり"でまとめてみた
書籍「チームジャーニー」を読んだので"超ざっくり"でまとめてみた
アジャイルについて書かれている

XP(eXtreme Programming)
アジャイル開発の1つ
4つの価値と12のプラクティスを定義
「管理者の視点」から、XPは「開発メンバーの視点」へ

アジャイル代表的プロセス

  1. TDD・・・テスト駆動開発のこと、テストコードを先に書いてから本体コードを開発
  2. リファクタリング・・・完成したプログラムを後から安全に改造する
  3. CI・・・継続的インテグレーションのこと、コンパイル、ビルド、単体テストを定常的に自動実行する

第12章

オブジェクト指向プログラミングは手段として使おう目的になることもあるので注意
使わなくていいところで使ってしまうと、本末転倒な結果に...

第13章

おまけ
関数型言語について書かれていたが、今すぐ自分にとって必要でないので、まとめはしない
というかまとめなくても素晴らしい記事が↓↓↓
関数型プログラミングはまず考え方から理解しよう
「関数型プログラミング」と「オブジェクト指向」ってなんやねんPython編

GitHubで編集を提案

Discussion