【Python】オブジェクト その1

オブジェクト指向、またはオブジェクト指向プログラミングと呼ばれるプログラミングの考え方が近年では主流になっています。
プログラミング言語によってもオブジェクト指向に向いている言語があり、Python意外にもC++やJavaがその代表的な言語です。

「スッキリわかるPython入門」の6章ではオブジェクトの簡単な説明にとどめていますが、オブジェクト指向の考え方をりかいしやすいようにプログラミング技法の進化にあわせて説明したいと思います

オブジェクト指向とは(ざっくりと)

オブジェクト指向とは簡単に言うと処理とデータを一つのまとまりにしたモノです。
このモノをオブジェクトと言います。

まだプログラムを学習し始めた方にはそのメリットがわかりにくいとおもいますので、初期のプログラミング技法である逐次処理から発展の順にご説明します。
プログラミング技法の発展に沿って学習することでオブジェクト指向の考え方を理解出来ると思います。

逐次処理

突然ですが、このような設問に対してどのようなプログラムを解答しますか?

おまけを含たブロック数と端数で考えてみましょう。
みかんは2個で1個おまけなので1ブロックは3個と考えます。
今回必要なのは3個なので1ブロック必要になります。
1ブロックの価格はみかん単価10円*2=20円、従ってみかん購入に必要な金額は20円となります。
同様にリンゴも1ブロック必要になり1ブロックの価格は20円*3=60円です。
こちらは端数1個が出ますのでこちらの価格が20円でリンゴ購入に必要な金額は60円+20円=80円。
全部で必要な金額は20+80=100円となります。

これをプログラムで表したのがこちら。


上から順に考え方に従って処理をしているのが解ると思います。
上から順に処理を行うので逐次処理とも呼ばれています。
高級言語が出来る以前のプログラムの世界ではこのような形で記述されていました。

サンプルプロ語ラムを見て頂くと単価や個数は定数として登録してあり、見やすく記述しています。
購入する個数や単価が変更されても定義されている定数を変更するだけですので簡単ですね。
ちなみにpythonでは規約上定数は有りませんが、定数として扱う変数は大文字で記述する慣習があります。

一見問題無いように見えますが、いくつか指摘する点があります。

変数の有効範囲

変数などの有効範囲をスコープと呼びます。
サンプルプログラムでは変数のスコープがプログラム全体に及んでいます。
このようにプログラム全体にスコープが有効な変数をグローバル変数と呼びます。
一般的にグローバル変数が多いプログラムは、グローバル変数の影響領域を確認するだけでも大変な手間になります。
特に数千、数万行に及ぶプログラムではなおさらです。

似た処理の羅列

またみかんやリンゴの合計金額を計算する処理がとても似ていますね。
もしここに梨やスイカなど他にも購入する果物が出てきたらさらに似たような処理の羅列になってしまいます。
高級言語が出来る以前のプログラムの世界ではこのような形で記述されていました。
似たような処理の羅列はサブルーチンという手法でまとめることも出来ましたが、初期のプログラミング言語では関数の概念がなく基本的にはグローバル変数を介したデータのやり取りになっていました。
※サブルーチンでスタックを使ったデータの受け渡し手法もありましたが、今回の説明では割愛します。

関数型プログラミング

先に説明したサブルーチンの考え方をさらに進めて、処理の入出力を明確にしたモノが関数と言えるでしょう。
またその関数を呼び出しながら処理を行う手法を関数型プログラミングなどと言うこともあります。
その代表的な言語がC言語です。

こちらのプログラムを見てください。


先ほどと比較して大分スッキリしましたね。
似たような処理を関数にまとめました。
関数は入力と出力を定義した手続きになりますのでサンプルのようにグローバル変数がなくても希望する処理をわかりやすく記述出来ます。

ここまでくれば十分でしょうか?
以下のようなケースを考えてみてください。
先ほど購入した人をAさん、新たな登場人物Bさんとします。
Bさんはみかん9個、リンゴを7個購入します。
このプログラムを書いてみましょう。


やはり、似たような処理が出てきて見にくいですね。
理由はそれぞれの組み合わせ(例えば果物の種類やAさん、Bさんのような人)ごとに外部から値を与えているからです。

まだまだ改善の余地はありそうですが少々長くなってしまったので、今回はここまで。

お疲れ様でした。

python教室「総合目次」に戻る

 

 

Python教室

Posted by taka