1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

読書メモ『コーディングを支える技術 成り立ちから学ぶプログラミング 作法』第11章 オブジェクトとクラス

Last updated at Posted at 2020-02-26

前置き

オブジェクト指向という言葉を正確に理解するために、『コーディングを支える技術 成り立ちから学ぶプログラミング 作法』(第11章 オブジェクトとクラス)が、かなり役立ったと思ったので、memoとして残します。:pray:
僕同様、オブジェクト指向の言葉で迷った人は、一度目を通されてみると、視点が増えて整理にいいかもです🙋‍♂️

オブジェクト指向とは何か

  • 言語によって、「オブジェクト指向」の言葉の意味が違う

C++ (Bjarne Stroustrup)

  • 型や継承にとても肯定的
    • classはユーザ定義型を作るための仕組み」
    • 「Stimulaの継承機構が問題解決の鍵」
    • オブジェクト指向プログラミング とは、ユーザ定義型と継承を使ったプログラミング のこと

Smaltalk (Alan Kay)

  • 型や継承に否定的な立場 (メッセージに着目)
    • 「型に反対なわけではないが、苦痛でない型システムを見たことがない」
    • 「Simulaの継承のやり方は好きではない」
    • 「オブジェクト指向とは『状態を持ったオブジェクトがメッセージを送り合うことでコミュニケーションする』というモデルでプログラムを表現すること」

オブジェクトは現実世界の模型

  • 現実世界の「モノ」(object)の「模型」(model)をコンピュータの中に作るにはどうすればいいか?

クラスとは

  • C++ (静的型付け言語)
    • 「クラスはユーザが定義できる型」のこと
  • Java
    • 「クラスという部品を定義して、それを組み立てることがプログラミング だ」という設計の言語

変数と関数を束ねて模型を作る方法

  • プログラマの目的は、「まとめて模型を作りたい」

方法1: モジュール、パッケージ

  • 関連性の強いものを「いくつかのまとまり」に分けたほうが理解が楽である。
    • 理解が楽なようにプログラムを設計すると、いくつかの「お互いに結びつきの強いグループ」ができる傾向がある。
  • モジュールとは、「まとめる方法」

方法2: 関数もハッシュに入れる

  • ファーストクラスの値
    • 「変数に代入する」「関数の引数として渡す」「関数の戻り値として返す」などが可能である値のこと。
      • JavaScriptでは、関数もファーストクラスの値である。

方法3: クロージャ

  • オブジェクト的なものを作るためのテクニック
  • 関数を関数の中で定義でき、ネストできる静的スコープがあり、関数を戻り値で返したり変数に代入したりできる言語では、単に関数をネストするだけで状態を持った関数を作ることができる

方法4: クラス

Hoareの考えたクラス
  • Hoareにとってクラスは分類
    • 「現実世界のモノ(objects)は、しばしば便宜上、いくつかの相互排除的な種類(classes)に分類される」
C++のクラス
  • クラスはタイプ(型)である
    • ユーザが型(type)を定義するために作られた
  • クラス(=型)は仕様の表明でもある
    • クラスは「オブジェクトがどういうメソッドを持っていて、どういうメソッドを持っていないか」という仕様を宣言する役割を持っていた。
Smalltalkのメソッド呼び出し
  • 「こういう名前のメソッドを実行してくれ」というメッセージをオブジェクトに送るこ
  • そのメッセージを受け取ったオブジェクトがどう振る舞うのかは、受けてオブジェクトが自由に決めることができる

(補)クラスとは結局何であるか

  • クラスとは、たかだか数十年前に、誰かが「こういう仕組みがあると便利じゃないかな?」と作ってみたものに過ぎない
  • 「そうかけたほうが楽だから」という理由で作られた約束事に過ぎない

クラスが持つ3つの役割

  1. まとまったものを作る生成器 (鯛焼きの型)
  2. どういう操作が可能かという仕様 (Javaのインターフェース)
    • 動的型付け言語では重視されない
  3. コードを再利用する単位 (継承)

感想

言語によって、オブジェクト指向が指しているものが違うという考えは、今までオブジェクト指向の言葉の理解を邪魔していたものを取り払ってくれたように感じる。:pray:
特に、C++では、クラスとは型であるという考えが新鮮だった。
Rubyでは、Smalltalkの影響を受けているため、Alan Kayの メッセージに着目する考え方が大事であると理解。
この章を読むことで、オブジェクト指向への自分のモヤが結構スッキリした気がする。🙋‍♂️

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?