以前、軽くオブジェクト指向についてまとめたことがあったけど、
オブジェクト指向の考え方をしっかりとまとめてみるのも必要かと思って今回はまとめてみる。
少しだけオブジェクト指向に触れた記事▼
背景
オブジェクト指向の考え方が誕生した背景にはプログラムのコードが肥大化してきたことにある。
システムが巨大になればそれに伴ってコードは大きくなる。コードの大きな大規模プログラムは一か所変更したら他のところで動かなくなる可能性もある。
それに伴って、ソフトウェアの再利用、部品化、メンテナンスのしやすさ、拡張性のようなことが取り入れられることが意識されて、その流れの中でオブジェクト指向な考え方が重宝されていくようになっていったらしい。
手続き型(普通のプログラム)とオブジェクト指向
一般的な(?)プログラムは手続き型と呼ばれるプログラムになる。これは上から下に1行ずつプログラムを実行するイメージの一般的なプログラム。
もちろん構造化や関数などでループ処理を単位化する事や、プログラムを分割するような書き方もできるけど、それ以上のモジュール性(部品的な機能)がない。
オブジェクト指向では「オブジェクト」という概念がある。
確かにクラス(説明は後述)でも1行ずつ処理を書いていくけど「オブジェクト」という概念があるからより抽象的になる。
ちなみにpythonでおなじみのNumpyやPandasやMatplotlibなどもオブジェクトの集合。
オブジェクト指向なコードを書く時の思考
手続き型のプログラムを書くときは上からどんどん書いていくけど、オブジェクト指向のプログラムは「オブジェクト」をどう設計して、「オブジェクト」をどう組み合わせるかという事を考えながらコードを書いていく。
よく例えられることとしてオブジェクトをロボットとして例える。そしてクラスをそのロボットを作るための設計図として例えられる。
ロボットを作る際はまず設計図を作成するのと同じように、まずクラスを作成する。
クラス(設計図)を作ってしまえばロボットを量産することできる。
クラスについて
上記で登場してきたクラスについて触れます。
上記でも書いたようにクラスは「オブジェクト」の設計図にあたります。
このクラスにはロボットの「属性」(後述)や「動作」を記述していきます。
とりあえずクラス(設計図)を書いてみる
今回はRobotというクラスを書いてみます。
以下コードです。
class Robot:
# コンストラクタ▼
def __init__(self, name, battery):
self.name = name
self.battery = battery
# 名前を伝えるメソッド▼
def tellName(self):
print('ワタシノナマエハ' + self.name + 'デス')
my_robot = Robot('robot01', '100')
my_robot.tellName()
出力結果は以下です。
ワタシノナマエハrobot01デス
コンストラクタ(constructor)部分
def __init__(self, name, battery):
self.name = name
self.battery = battery
「self.name」とか「self.battery」とかはロボットの属性。
属性は例えるならロボットの名前や、充電量や、馬力などを設定するもの。
そして、属性=クラスの変数。
ここではnameとbatteryというのが属性で、属性を書くときは上記のように「self.name」とか「self.battery」とかのように属性の前に「self」を付けないといけない。
メソッド(method)部分
def tellName(self):
print('ワタシノナマエハ' + self.name + 'デス')
メソッドはロボットの実行できること(=クラスができる処理のこと)
要はクラスの中で定義された関数。
メソッドをシグネチャー(signature)ということもあるらしい。紛らわしい。
メソッドの定義時にも第一引数には必ずselfを設定してあげる必要がある。
インスタンス(instance)
インスタンス化しているコード部分は以下
my_robot = Robot('robot01', '100')
Robotというクラス(設計図)から実際にロボットを作るための記述(作ると言ってもコンピュータのメモリ上に生成されるということ)。
Robotのコンストラクタでnameとbatteryを設定しているが、今回はname=robot01、battery=100として設定した。
メソッドの呼び出し
インスタンスになったオブジェクトは、そのオブジェクトのメソッドを使用することが可能になる。
メソッドを呼び出しているコード部分は以下。
my_robot.tellName()
「.」(ドット)を使って記述。
設計図(クラス)が1つでもインスタンスがいくらでも作ることが可能。
ここでのポイントは以下の2つ
- 設計図を作る人と設計図を利用する人を分けることができる
- ロボットの設計ができない人でも設計図があればロボットを作れるということ
これは大規模なソフトウェア開発の中でオブジェクト単位で責任の分離ができるようになります。
これによりオブジェクト単位の品質保証、メンテナンス、テストができるようになります。
まとめ
今回は、オブジェクト指向な考え方のプログラムとはどういうものかをpythonを書きながらまとめました。
僕自身、勉強になりました。
最後まで読んでいただきありがとうございます。