【デザインパターン with Python】1-2. オブジェクト指向プログラミングとは何か

記事タイトルとURLをコピーする

はじめに

こんにちは。孔子の80代目子孫兼アプリケーションサービス部の孔です。前回はデザインパターンとは何か、およびそのメリットについてみてみました。デザインパターンは「一般的に実装されるプログラムに対して繰り返し利用できるソリューション」でしたね。

今回はそのデザインパターンを理解するに必要な基礎知識となる、「オブジェクト指向プログラミング」とは何かについてみてみます。

オブジェクト指向プログラミングとは何か

「オブジェクト指向プログラミング」の言葉を分解してみましょう。「指向」とは「何かを目指して何かをやること」、「プログラミング」とは「プログラムを作ること」です。つまり、「オブジェクト的なものになるようにプログラムを作ること」が「オブジェクト指向プログラミング」となります。では、「オブジェクト」とはなんでしょう?

オブジェクトとは「物体」という意味を持っています。物体は大体の場合、多くの要素からなりますね。例えば、「車」を考えてみましょう。「車」をなす要素として、車輪、車体、ハンドル、シートベルトなど、たくさんの物理的な要素を持っています。さらに、「車」は前進する、後進する、止まるなど、いろいろな動作的な要素も含んでいます。このように物体(オブジェクト)には、その物体をなすためのいろいろな要素が含まれています。

ソフトウェアの世界では、何か物体をなす数ある要素の中で、「データ」と「処理」をまとめたものを「オブジェクト」といいます。例えば銀行の口座を取り扱うプログラムを作る時に、以下のように作るとしてみましょう。

# 田中さんの口座
account_number_tanaka = "1111-222"  # 口座番号データ
branch_tanaka = "shibuya"  # 支店データ
balance_tanaka = 10000  # 残高データ
def withdraw_tanaka(amount):
    # 引き落とし処理
 
def open_new_account():
    # 新規口座を作る処理
 
# 鈴木さんの口座
account_number_suzuki = "2222-333"
branch...

全ての銀行ユーザーに対して上記のコードを書くのは不可能ですし、いきなり新規口座を作る処理が混ざってて個人の口座に関するデータや処理がどこからどこまでなのかもよくわかりません。

このような時に、一つのオブジェクトに関連するデータと処理をまとめておけば、まず読みやすいし、そのオブジェクトを再利用できるように作れば、何回も何回も同じコードを書く必要はありません。Pythonではclassというキーワードを使えばオブジェクトを生成することができます。

# 関連するデータと処理をまとめる
# 個人の口座に関する処理
class IndividualAccount:
    def __init__(self, name, account_number, branch, balance):
        self.name = name
        self.account_number = account_number
        self.branch = branch
        self.balance = balance
 
    def withdraw(self, amount):
        # 引き落とし処理
 
# 口座の開設など、一般的な業務に関する処理
class HandlingAccount:
    def open_new_account(self):
        # 新規口座を作る処理

このように書くと、関連するデータと処理が集まっているので、まず読みやすくなります。さらに、オブジェクト(Class)からはインスタンスというものを生成することができ、一つのオブジェクトからインスタンスを生成することで何回もname, account_number... などを書かなくても、インスタンスごとにデータを持たせることができます。

# 上記のコードから続きます
# 田中さん、鈴木さんの口座インスタンスを、Classから作成する
tanaka_account = IndividualAccount("tanaka", "1111-222", "shibuya", 10000)
suzuki_account = IndividualAccount("suzuki", "2222-333", "akihabara", 30000)
 
# 各インスタンスごとにデータを管理しているので
# #「name = tanaka」や「acccount_number = "1111-222"」など
# 繰り返して発生する処理はClassだけに書いといてOK(再利用可能)
tanaka_account.name  # "tanaka"
suzuki_account.name  # "suzuki"
tanaka_account.balance  # 10000
suzuki_account.balance  # 30000

オブジェクト指向プログラミングには様々なメリットがありますが、ポイントは

  1. 関連する処理とデータをまとめることによって、人間が理解しやすい構造でプログラムを作ることができる
  2. オブジェクトからインスタンスを作成することによって、何回も発生するような処理を1回書くで済ませることができる

になります。他にもメリットはいっぱいありますが、最も基礎となるポイントは上記の2つになりますので、まずはこの2点を押さえておきましょう!オブジェクト指向でプログラムを作成した際のその他のメリットや特性に関しては記事が進む中でまた都度都度紹介していきます。

最後に

オブジェクト指向プログラミングがどのようなものか、オブジェクト指向でなぜ書くかが伝わりましたでしょうか?これからいろいろなオブジェクト指向に関する話や、実際オブジェクト指向が適用されるデザインパターンをいろいろみていただけると、より理解が深まるかと思います。

次回は、PythonのClassについて、もう少し具体的な解説をします。それでは、次回もよろしくお願いします!

シリーズ一覧

孔 允培 (執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス課

孔子の80代目子孫