Facadeパターン(?)
ごちゃごちゃしたコードを弄っている中で、デザインパターンの1つであるFacadeパターンを使えばコードを改善できそうだったので内容をメモしときます。
タイトルに疑問符がついているのはこれが本当にFacadeパターンになっているのか確信が持てなかったためです…。
Facadeパターンについてはコチラ
15.Facadeパターン | TECHSCORE(テックスコア)
今回ターゲットとしている処理は、
メールアドレスで仮登録 → メールにて送付されたトークン付URLをクリック → パスワードを入力して本登録
という流れの中の、本登録処理。
改善前の疑似コードは以下の通り。
// Usersクラス public function register($token, $password) { // 仮登録ユーザテーブルpre_usersから、 // $tokenを持つユーザ情報を取得(select)するクエリを発行 // 本登録ユーザテーブルusersに、メールアドレスとパスワードなどを // 挿入(insert)してユーザ情報を新規作成するクエリを発行 // 仮登録ユーザテーブルpre_usersで、ユーザが // 本登録済みであることを示すフラグをセット(update)するクエリを発行 }
このコードで気になった点は、
- 1つのメソッドに複数の処理(DBに対するselect、insert、update)が書かれている
- 本登録ユーザ関連のデータと処理をまとめたはずのUsersというクラスの中で
仮登録ユーザテーブル(pre_users)を操作している - 他所で同様のクエリを発行したい場合、類似コードが出てきてしまう
⇒ 再利用性のなさ
この3点です。
この問題を解消するために、各クエリ発行の処理を別メソッドに分け、さらにFacadeパターンを適用してみました。
AccountManagerクラスの中でregister( )メソッドを用意し、そのメソッド内で、分割したUsersクラスの各メソッドを呼び出します。
こうすることで情報取得のためのクエリなどが再利用しやすくなり、Usersクラスが自身に関係する処理のみを実行できるようになりました。
利用する側(Controllerクラスなど)はregister( )メソッドを呼び出すだけでよく、
難しいことを考える必要はなくなり、さらにregister( )を使いまわす(可能性は低いですが)ことも可能になりました。
// PreUsersクラス public function get($token) { // 仮登録ユーザテーブルpre_usersから、 // $tokenを持つユーザ情報を取得するクエリ発行 } public function setRegisteredFlag( ) { // 仮登録ユーザテーブルpre_usersで、ユーザが本登録済みであることを // 示すフラグをセットするクエリ発行 } // Usersクラス public function createUser( ) { // 本登録ユーザテーブルusersに、メールアドレスとパスワードなどを // 挿入してユーザ情報を新規作成するクエリ発行 } // AccountManagerクラス public function register( ) { $preUser = new PreUsers( ) ; $user = new Users( ) ; $preUser->get( ) ; $user->create( ) ; $preUser->setRegisteredFlag( ) ; }