はじめに
(対象言語:PHP)
まず私は、オブジェクト指向の信者ではありません。
逆に(逆なのか?)、関数(function)やグローバル変数の多用派です。
オブジェクト指向は便利なら使ってみようか、という程度です。
そんな私がオブジェクト指向を取り入れてみて、便利さを評価しました。
(既存のフレームワークではなく、すべて私の手作りクラスです。)
種類 | 評価 |
---|---|
ログ出力 | ◎ |
日時計算 | ◎ |
画面操作 | ○ |
セッション | △ |
データアクセス(PDO) | ○ |
データそのもの(RDB) | × |
ログ出力 ◎
ログには色んな種類があります。
・デバッグログ
・エラーログ
・アクセスログ
例えばこれらを関数のみで作ると、少し面倒です。
ログ1種類ならともかく、上記のように複数のログを管理するとなると、
配列で状態管理しなければなりません。
それよりは、インスタンスで分けたほうが便利でした。
日時計算 ◎
「日時計算なら元々 DateTimeクラス があるじゃないか」
と言われそうですが、その DateTimeクラスを内包して作りました。
(ただし継承はしていません。)
たとえば日時フォーマット出力(メソッド)で、年は 'Y'
だっけ 'y'
だっけ?
時間は 'H'
だっけ 'h'
だっけ? と いちいち迷うんですよ。
なのでその方法は継承せず、よく使うフォーマットをあらかじめ洗い出して、
数値の定数を引数で渡すことでフォーマット出力するメソッドを作ったりしました。
ただし関数と併用しています。
例えばデータベースから取得した日時 (2020-09-20 12:34:56)
は文字列なので、
それをいちいちインスタンスにする手間を省くため、文字列を直接 関数に渡して、
内部でインスタンスにして処理する方法も用意しています。これも便利です。
画面操作 ○
画面操作に必要な諸々をカプセル化したものです。
・表示対象データのキー
・次画面の行き先
・戻り画面
・データの最終更新日時
・ワンタイムトークン
・ページネーション情報
などなど
以前はこれらを画面毎にグローバル変数に保持していましたが、
クラス化でだいぶ すっきりしました。
セッション管理 △
作っては見たけど、メリットは感じませんでした。
単に session_start()
や session_destroy()
をするだけだし、
そもそも複数のインスタンスを作る必要もありません。
クラス化せず単なる共通関数でよかったかも。
データアクセス(PDO)○
ほぼPDOですが、PDOは直接 操作せず
それを内包した手作りクラスで、データベースにアクセスするようにしました。
日時計算クラスと同じく、親クラス(PDO)は継承していません。
理由は後述します。
データそのもの(RDB) ×
データアクセスはクラス化できても、
データそのもの(RDB)はクラス化できません。
変数を直接 取得後、変数を直接 参照したほうがよいです。
(システムの種類にもよるのでしょうが。)
私の作っているものは、テーブルが100以上あります。
これらをテーブル毎に いちいちクラス化していたら、
さらにカラムごとにゲッターセッターを作っていたら、いつまで経っても終わりません。
(PDOで連想配列でデータ取得するだけで十分です。)
インターフェイス的なものを作るにしても、共通関数で十分です。
まとめ
日時計算やPDOがそうなのですが、
親クラスの継承はせず、それを隠蔽して、機能を制限して使っています。
というのも、親クラスは往々にして、以下の特徴があるからです。
・全世界の人に使ってもらうため、汎用的に作られている。
・よって細かい(使わない)機能が多くなりがち。
私は必要最低限の範囲で、オブジェクト指向を利用したいと思います。