LoginSignup
0
1

More than 5 years have passed since last update.

備忘録:「オブジェクト指向でなぜつくるのか」 4章前半

Last updated at Posted at 2017-07-26

おはようございます。
今回は4章をまとめます。
4章は内容がいっぱいありました…

4章 OOPは無駄を省いて整理整頓するプログラミング技術

この章はオブジェクト指向プログラミング技術の諸々の仕組みを説明する章でした。
その仕組みを列挙すると、

  • クラス
  • ポリモーフィズム
  • 継承

です。前半ではこれらをまとめます。
さらにjavaやC#などで登場した進んだ仕組みとして

  • パッケージ
  • 例外
  • ガベージコレクション

の解説もなされていました。こちらは後半でまとめます。

クラス

クラスの効能は3つで、

  1. サブルーチン、変数を「まとめる」
  2. クラスの内部だけで使うサブルーチン、変数を「隠す」
  3. 1つのクラスからインスタンスを「たくさん作る」

とのことでした。
どれもオブジェクト指向を使ったことがある人にはおなじみの仕組みですね。

例えばゲームを作っている時に「一定のHPと攻撃力を持った敵」を作りたいとします。
そういうときはこのようにクラスを定義して

public class enemy{
    public int hp;
    public int offence;
}

変数をまとめることができます(「まとめる」)
あとはコードの好きな部分で

enemy1 = new enemy();
enemy2 = new enemy();

という風に書いてやれば何体でも敵を作れます。(「たくさん作る」)
また、攻撃を受けたときにHPを減らすときは

enemy1.hp -= 10;

と言う風にかけばenemy1のHPだけ減らせますし、関係ないところで

hp -= 10;

とやっちゃってまちがって敵の体力を減らしてしまうというバグも防げます。(「隠す」)
(ていうか2番目はhpというグローバル変数がない限りエラーになります。逆に言えば、hpをグローバル
変数にしていた場合はこのコードで減らせてしまうので、バグの原因になります。)
よって敵の体力がおかしいとなったときはenemyを作っているところだけ調べればいいわけです。
以上、クラスの効能です。

ポリモーフィズム、継承

本書の言葉を借りればポリモーフィズムは
「サブルーチンを呼び出す側のロジックを一本化し、『共通メインルーチン』を作る仕組み」
で、継承は
「似たクラスの共通点と相違点を整理する仕組み」
です。
こちらもコードを使って説明します。
例えば、テキストファイルの中身を読むクラスがあるとします。
※メソッドの中身の処理は全て省略します。

public class TextFileReader{
    public void open(String filePath){}
    public void close(){}
    public void read(){}
}

これに加えてネットワーク経由で送信された文字列を読み込みたいとします。
仕組みはほとんど同じですがロジックは微妙に変わりますよね。

public class NetWorkReader{
    public void open(){}
    public void close(){}
    public void read(){}
}

ファイルを読むわけではないため、open()メソッドの引数がファイルパスでは不自然です。
ポリモーフィズムを使う時はこういった呼び出される側のメソッドの引数、戻り値を統一する必要があります。
そこでopen()メソッドではなくコンストラクタにファイルパスを指定します。

public class TextFileReader{
        public TextFileReader(String filePath){}
    public void open(){}
    public void close(){}
    public void read(){}
}

ついでにテキストとネットワークの違いを意識させないためにもう一つクラスを作り、先の二つのクラスに継承させます。

public class TextReader{
    public void open(){}
    public void close(){}
    public void read(){}
}
public class TextFileReader extends TextReader{
    //中身は上述のものと同じ
}
public class NetWorkReader extends TextReader{
    //中身は上述のものと同じ
}

これにより、一本化しているTextReaderクラスと他の二つのクラスの共通点と相違点をまとめ、また共通している操作においてはその違いを意識せずに使用できます。

以上が二つの要素のまとめです。

まとめ

オブジェクト指向で登場した仕組みは全て「プログラマが楽をするための仕組み」です。
そのために制約を増やしているので覚えることは多くなりますが、覚えてしまえば楽できるようにできています。
デバッグのとき調べる場所が少なくなるのは非常に楽ですよね。

残りの

  • パッケージ
  • 例外
  • ガベージコレクション

については後半で説明します。

0
1
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
0
1