大規模なシステム開発を行うときに必要となるのがクラス(class)。
Javaをはじめとしたオブジェクト指向型のプログラムでよく使われるので、ある程度大きなプロジェクトに関わるようになったら、プログラムを見やすくする意味でも操れるようになった方がいいものとなりますが…こう思ったことのある方も多いでしょう。
Pythonではdefキーワードで関数を作成することができるので
という声もあるでしょう。
でも少し待って。
わざわざクラス(class)を使うのには理由があります。
- クラス(class)の中にdefキーワードで作成した関数をカプセル化すると、オブジェクト指向に沿ったプログラムとなって分かりやすい
defキーワードで関数をつくるのも悪くないのですが、プログラムの分かりやすさとしてどうかというと、オブジェクト指向に沿ったプログラムを書く人から見ると、半減してしまいます。
また、複数人が関わるプロジェクトに関わると、分かりやすく、使ってもらいやすいプログラムが書けるかが重要になり、それが単価アップにもつながります。
では、どうしていくといいのか、順番に見ていきましょう。
【基礎】classとインスタンスについて知ろう
よく使われる例えとして
インスタンス=設計図に沿ってつくった物
というのがあります。
これを実際にプログラムで表現するとこんな形になります。
# class定義
class Test_data:
def __init__(self):
self.code = ''
self.name = ''
self.sugaku = 0
self.kagaku = 0
self.avg = 0.0
def Avg_cal(self):
self.avg = (self.sugaku + self.kagaku) / 2
# インスタンスをつくってclass内のメソッドを実行
test = Test_data()
test.code = '12345'
test.name = '翔平'
test.sugaku = 70
test.kagaku = 80
test.Avg_cal()
print(test.avg)
# 出力結果
75.0
必要なパラメータを設定してメソッドを実行すると、平均を算出してくれるわけですが、この計算式がいわゆる家をつくる設計図(公式)となるわけです。
オブジェクト指向に精通した人からすると、この形でプログラミングされている方が分かりやすい(視認性が上がる)ので、defではなくクラス(class)にしましょうと言われているわけです。
では、どれだけ違うのか。
試しにdef関数で上記のプログラムを書き替えてみます。
def Avg_cal(sugaku,kagaku):
return (sugaku + kagaku) / 2
# class定義
class Test_data:
def __init__(self):
self.code = ''
self.name = ''
self.sugaku = 0
self.kagaku = 0
self.avg = 0.0
# インスタンスをつくってclass内のメソッドを実行
test = Test_data()
test.code = '12345'
test.name = '翔平'
test.sugaku = 70
test.kagaku = 80
test.avg = Avg_cal(test.sugaku, test.kagaku)
print(test.avg)
# 出力結果
75.0
classでやっていることがコンストラクタの設定のみとなってしまいました。
これはこれで悪くないのですが、計算メソッドが外に出てしまい、メソッドを呼び出す際にパラメータを設定しなければならなくなりました。
また、若干シンプルさが落ちてしまったようにも感じられます。
せっかくclass定義しているわけですから、カプセル化すると見やすくなりますね。
【基礎】コンストラクタとは
ちなみに、先ほどコンストラクタという単語が出てきましたが、これはインスタンスを生成したタイミングで必ず走る処理のことをさしており、上記のプログラムでいうところの【__init__(self)】関数のことを指しています。
トレーニングする!と思ったらトレーニングウェアに着替えるかところからはじまりますが、その準備までの流れがコンストラクタと思ってもらえれば分かりやすいでしょう。
視認性以外の違いってなに?
ここまで見てきて、プログラムの視認性に違いがあることは分かりました。
では、他に違うところはないのかを見てみると、もう1点あるのがメモリ消費量です。
つくられるオブジェクトの数によって差が出るメモリ消費
def関数とクラス(class)では、つくられるオブジェクトの数に差があります。
パラメータを記憶出来るかどうかという点になるのですが、def関数の場合は1つ、クラス(class)の場合はインスタンスをつくった分の数のオブジェクトがつくられるので、メモリ消費量としてはクラス(class)の方が多くなりやすいです。
def関数の場合は、1つのオブジェクトで同じ処理を何回も出来るということと、関数をいきなり定義しただけで使えるメリットはありますが、データを記憶する機能がない(別の変数に入れれば記憶は可能)部分をどう考えるかという点を考慮する必要があります。
defがいいかclassがいいかは処理速度と消費メモリ次第
プログラムの規模が大きくなってくると、処理速度と消費メモリがどうなのかという点は考慮する必要があります。
オブジェクト指向に沿ったプログラミングに従って視認性を上げることも大切ではありますが、データを記憶する必要がないといった状況に合わせてdef関数を併用するのも検討する必要があるでしょう。
学びを進めるにあたって
今回のような学びを独学でやっていくのが難しい…
その場合につよい味方となるのが、プログラミングスクールです。
スクールによっては無料体験プランもありますので、気軽に試してみるとよいでしょう。
SAMURAI TERAKOYA
- 低価格のサブスクリプション型で学べる
- 現役エンジニアに質問して悩みを解決出来る
- 何を学ぶといいか無料でサポートしてくれる
- 目的に合わせてコースを選べる
Tech Academy
- エンジニアとして転職出来るよう徹底サポート
- 受講料の最大70%が支給される制度に認定されたコースあり
- 転職サポートなしのコースで受講することも可能
- 学べるジャンルが豊富