オブジェクト指向 ≒ classを定義して使う,ということ?
オブジェクト指向ってなに?
【Python】オブジェクト指向プログラミングの概念と書き方 | HEADBOOST
オブジェクト指向がわからない! そんなあなたの脳味噌をオブジェクト脳にする準備体操:CodeZine(コードジン)
初心者向けに徹底解説!オブジェクト指向とは?
オブジェクト指向超入門
オブジェクト指向の定義は、専門家の間でも微妙に食い違っているが、 「ソフトウェアで扱う事柄について、データと操作(メソッド)をまとめて1つのオブジェクトとして捉える」 ということは共通している。オブジェクト指向ではオブジェクトを基本単位として考え、 1つのオブジェクトの中には、データとメソッドが備わっているとする。
この説明だけ読むと,データ(変数)と操作(関数)をまとめて1つのオブジェクト(クラス)にまとめれば,とりあえず最大公約数的な定義を満たすように思われる.
例
たとえば,テキストファイルを読み込み,指定した文字列を含む行のみを出力するプログラムをサンプルにする.
【Python】オブジェクト指向プログラミングの概念と書き方 | HEADBOOSTの説明にある,いわゆる手続き型の書き方だと,
import sys lines_list = [] with codecs.open(sys.argv[1], 'r', 'utf-8') as fin: for line in fin: if sys.argv[2] in line: lines_list.append(line.rstrip('\r\n') for line in lines_list: print line
これを関数型というのにしてみると,こんなところだろうか.
import sys def get_key(): key = sys.argv[2] return key def make_lines_list(key): with codecs.open(sys.argv[1], 'r', 'utf-8') as fin: lines_list = [line.rstrip('\r\n') for line in fin if key in line] return lines_list def output_lines(lines_list): for line in lines_list: yield line if __name__ == '__main__': for i in output_lines(make_lines_list(get_key)): print i
どこといわずおかしいような気もするが,少なくとも関数の引数と戻り値だけで処理のやりとりをしている.
(関数型プログラミングはまず考え方から理解しよう - Qiitaによるとループは関数型らしくないらしい)
さらにこれをオブジェクト指向にするには,こうすればいいのか?
import sys class FindLine: def __init__(self): filename = '' key = '' def make_lines_list(self): with codecs.open(self.filename, 'r', 'utf-8') as fin: lines_list = [line.rstrip('\r\n') for line in fin if self.key in line] return lines_list def output_lines(self, lines_list): for line in lines_list: yield line if __name__ == '__main__': find_line = FindLine() find_line.filename = sys.argv[1] find_line.key = sys.argv[2] lines_list = find_line.make_lines(find_line.key) for i in find_line.output_lines(lines_list): print i
まあ,クラスオブジェクトを定義し,インスタンスオブジェクトを生成して処理を行っている.
このコードでは意味はないが,オブジェクト指向の利点としてよく言及されるところの,
同様のインスタンスを生成したかったり,機能を引き継ぐ別のクラスを作りたかったりするなら,容易にできるだろう.
本当にただこれだけのことなのか?
オブジェクト指向プログラミング OOP(Object Oriented Programming)の基本的な仕組み – Device Configuration
「クラス」「ポリモーフィズム」「継承」をOOPの三大要素と呼ぶ。構造化言語では解決しなかった2つの課題である「グローバル変数」「貧弱な再利用」を解決している。
もちろん言葉の上では「これだけのこと」ではないが,仕組み上,ポリモーフィズムはクラスの書き方の話で,継承だってクラスの話である.
したがって事実上,クラスを使い,かつそれ以外のもの(グローバル変数をはじめとする,クラスの外に定義するもの)をできるだけ排除することで実現されると考えて差し支えないように思う.
少なくともPythonの場合は.