OOP(オブジェクト指向プログラミング)について理解しよう!
スポンサーリンク

複雑なコードと手続き型プログラミングについて

コーディングの手を休めて自分の書いたコードを振り返った時、「私のコードは一体どうなっているんだろう」と混乱し始めることがあります。

より複雑なアプリを作ろうとするとそれに合わせてコードがより複雑になり、沢山の変数やFunctionが登場します。

そして、コードが複雑になればなるほどコードの中で何が起こっているのかを理解したり、覚えたりすることがとても難しくなってきているのです。

古くからあるプログラミングの手法に「手続き型プログラミング(procedural programming)」というものがあります。

あるコード処理が別のコードを導き、全体を通してコンピュータは上から下へとコードを実行していき、必要に応じて関数にジャンプする方法です。

FortranやCOBOLのような古い言語の時代には、この手続き型プログラミングにほぼ全面的に依存していたようです。

しかし、コードが複雑になってくると、管理しなければならない関係性の数が増えてきて、排水溝にたまった髪の毛のように複雑に絡み合ってきます。

これを理解するのはとても大変で混乱します。

OOP(オブジェクト指向型プログラミングの登場)

では、どうすればより複雑なプロジェクトを書きながら、コードの中でシンプルな関係を維持できるのでしょうか?

そこで、OOP(オブジェクト指向プログラミング、Object Oriented Programming)の出番です。

例えば、自動車を組み立てるとき、様々なモジュール(部品)を作って組み合わせていきます。モジュールを作る専門のチームがあり、それぞれが自身のモジュールを作ることに専念します。これによりチームの専門性もあがります。

どこかのモジュールがうまく機能しないときは、そのモジュールを取り換えればいいのです。また自動車用のモジュールをバイクに応用したり、モジュールは再利用も可能になります。

1人でレストランを経営すると、受付・注文・料理・配膳・会計などをすべて1人でやらなくてはいけずとても大変なことになります。しかし、受付係・コック・配膳係とその役割に専念する人がいればそれぞれの作業は単純化され、スキルの向上も早く多くのお客さんを受け入れることが出来ます。

OOPはこのような現実世界の分業をモデルにしています。

オブジェクト指向プログラミングという名前は、現実世界のオブジェクトをモデル化しようとしているとこから来ています。

例えば工場で作業している作業員の仕事をモデル化してみます。

作業員は軍手を付けて、担当するレーンを持っています。また作業員は段ボールに問題がないか確認をしています。作業員が「持っているもの」と「するべきもの」があります。

この持っているものを 属性(attributes) と呼び、するべきことを メソッド(methods)といいます。

属性(attributes)とメソッド(methods)

なぜ、変数(variables)ではなく属性(attributes)なのか?そして機能(functions)ではなくメソッド(methods)なのか?

コードを見てみると同じであることが分かると思いますが、オブジェクトを構成するものはあくまでも属性(attributes)とメソッド(methods)なのです。

属性(attributes)とは特定のオブジェクトに関連付けられた変数(variables)をさします。この意味で変数(variables)と属性(attributes)はことなります。

レーン1を担当するのは作業員の仕事で、経営者など他の人の仕事ではありません。

機能(functions)に関しても同様です。check_cardbord() は作業員に関連付けられています。この場合は機能(functions)ではなくメソッド(methods)ということになります。

クラスとオブジェクト

作業員の太郎さんと次郎さんは同じ作業部で働いていても少し違う業務をしています。そんなとき、オブジェクトを太郎さん用と次郎さん用とカスタマイズして使用できれば便利です。

OOPでは実際この様なことをします。同じオブジェクトの複数のバージョンを作ることが出来るのです。

OOPでこの大元になる設計図のことを「クラス(class)」と呼びます。そしてこのクラスから生成される個別のオブジェクトを「オブジェクト(Object)」と呼びます。

クラスをインポートしてオブジェクトとして使用する

PythonでTurtleライブラリを使用して、オブジェクト、クラス、メソッドを利用してみます。

# turtleライブラリからTurtleとScreenのクラスをimport
from turtle import Turtle, Screen

# Turtleクラスをオブジェクトへ
timmy = Turtle()
print(timmy)
# timmyオブジェクトからshapeメソッドを使用
timmy.shape("turtle")
# timmyオブジェクトのカラーメソッドを使用
timmy.color("black", "green")

# Screenオブジェクトをmy_screenへ
my_screen = Screen()
print(my_screen.canvheight)
# my_screenオブジェクトからexitonclickメソッドを使用
my_screen.exitonclick()

無事に読み込むことができると以下の様に表示されます。

クラスを呼び出すときはクラス名の左に C と書かれています。

オブジェクト内の属性を呼び出すには、オブジェクト名に続いて属性を書きます。

属性同様に、メソッドを呼び出す場合もオブジェクトに続いてメソッドを書きます。

ぜひ参考にしてください!また!