主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

プログラミングでクラスを使う

                
tags: python
 最近のポピュラーなプログラミング言語に手を出そうとすると、たいていクラスという概念に突き当たる。このクラスとはなんなのさというのにとっかかるための話。極端に言えばクラスがなくてもプログラムは書ける。だけどクラスを理解して使えるようになると便利なものだ。

 初めて直面するものごとを学ぶとき、理解しやすくするための一つの方法は既知のものとの差異を学びとることだと思う。

 たとえば動物園で犬を知らない子供にカメラを渡し、犬の写真を撮ってくるように頼む。子供は犬ってどんなものかって聞き返してくる。「四つ足で歩いていて鼻が尖っている。体の大きさは今の君と同じくらい」と大人が犬を思い浮かべて答える。これで子供はなにを撮ってくるだろう。犬を撮ってくる子供はそれなりにいるだろうが、それと同じくらいに狼や狐を撮ってくる子供もいるだろう。下手をすれば狸を撮ってくる子供だって考えられる。説明した犬と同じ特徴を持っているのだから。犬を確実に表現したければ、狼や狐との差異を考えねばならない。

 クラスを理解するためにはどうすればいいかというと、クラスなしで書いたプログラムと、クラスを使って書いたプログラムを比較すればいい。Pythonでやってみる。題材は名前と誕生日と星座を管理するもの。まずはクラスなしから。
def get_star_sign(birthday):
star_sign = False
if 101 <= birthday <= 131:
star_sign = "Yagi"
elif 201 <= birthday <= 231:
star_sign = "Mizugame"
elif 301 <= birthday <= 331:
star_sign = "Uo"
elif 401 <= birthday <= 431:
star_sign = "Hitsuji"
elif 501 <= birthday <= 531:
star_sign = "Ushi"
elif 601 <= birthday <= 631:
star_sign = "Futago"
elif 701 <= birthday <= 731:
star_sign = "Kani"
elif 801 <= birthday <= 831:
star_sign = "Shishi"
elif 901 <= birthday <= 931:
star_sign = "Otome"
elif 1001 <= birthday <= 1031:
star_sign = "Tenbin"
elif 1101 <= birthday <= 1131:
star_sign = "Sasori"
elif 1201 <= birthday <= 1231:
star_sign = "Ite"

return star_sign


hitorime = {"name":"Ichiro", "birthday":1231, "star_sign":get_star_sign(1231)}
futarime = {"name":"Jiro", "birthday":613, "star_sign":get_star_sign(613)}
sanninme = {"name":"Saburo", "birthday":1010, "star_sign":get_star_sign(1010)}


hitorime["birthday"] = 1031
hitorime["birthday"] = get_star_sign(1031)

print hitorime["name"], hitorime["birthday"], hitorime["star_sign"]


クラスなしで情報を統合管理するものを書くとすると、辞書型を使うことになるだろう。そして登録情報が間違っていると、スクリプト末尾二行のように間違えた値にアクセスして直さなければならない。でなきゃ更新用の関数を書く。そういうことをしていると、スクリプトが膨張してきてメンテナンスが面倒になる。

 クラスを使って書いてみる。とりあえず、クラスの宣言は飛ばして、そのあとのクラスを使った個人情報を管理するオブジェクトを作っているところが肝となる。
class PersonalData():
def __init__(self, name, birthday):
self.name = name
self.birthday = birthday
self.star_sign = self.get_star_sign(birthday)

def get_star_sign(self, birthday):
star_sign = False
if 101 <= birthday <= 131:
star_sign = "Yagi"
elif 201 <= birthday <= 231:
star_sign = "Mizugame"
elif 301 <= birthday <= 331:
star_sign = "Uo"
elif 401 <= birthday <= 431:
star_sign = "Hitsuji"
elif 501 <= birthday <= 531:
star_sign = "Ushi"
elif 601 <= birthday <= 631:
star_sign = "Futago"
elif 701 <= birthday <= 731:
star_sign = "Kani"
elif 801 <= birthday <= 831:
star_sign = "Shishi"
elif 901 <= birthday <= 931:
star_sign = "Otome"
elif 1001 <= birthday <= 1031:
star_sign = "Tenbin"
elif 1101 <= birthday <= 1131:
star_sign = "Sasori"
elif 1201 <= birthday <= 1231:
star_sign = "Ite"

return star_sign

def update_birthday(self, birthday):
self.birthday = birthday
self.star_sign = self.get_star_sign(birthday)


hitorime = PersonalData("Ichiro", 1010)
futarime = PersonalData("Jiro", 322)
sanninme = PersonalData("Saburo", 620)

hitorime.update_birthday(1231)

print hitorime.name, hitorime.birthday, hitorime.star_sign


 クラスを使って個人情報を管理するオブジェクトを作ると、そこで情報を一元管理できるようになる。上記の例の場合、誕生日を入力し間違えたとして、誕生日をもう一度改めて入力し直せば星座が自動で更新されるようになっている。

 プログラムを勉強して少しすると関数という概念が出てきて、これがわかるとある程度の働きを関数にまとめてコードを書くようになる。クラスはこれに若干似た考えだ。ある程度の情報(変数の値など)をまとめて管理できるようになっている。関数との違いを一つ述べるなら、関数は基本的に値を一度返せば終わりだ。クラスは『インスタンス』というのを作れば、一度呼び出し実行したあとでもなかの情報(変数の値)を更新していくことができ、更新のための関数をクラスのなかに定義することもできる。こうすることで、ある変数や関数をクラスのなかにまとめられ、コードの可読性が上がったりメンテナンスがしやすいというメリットが出てくる。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。