0

オブジェクト指向の思考イントロダクション

PHP

商流はフレームワークがあついですが、
今ここでオブジェクト指向を簡単なサンプルをもとに整理してみた。

対象

ベタ書きしたプログラムをそのまんまにしてる人用

このリファクタリングの目的

ファイルの最初らへんを見ただけで、そのファイルが何をしているか大体把握できるようにする
(つまり、具体的な処理は後回しにして必要なときだけ見ればいい形にする)

今回のサンプル

test.php

test.php

assign('mongon', $mongon);
$smarty->display('test_smarty.tpl');

このくらいのプログラムならこのままでも問題ないと思いますが例として。

目指すのはこれ

test.php

run();

class test{

        //テンプレに渡す変数
        var $mongon;

        function run(){
                //セッションスタート
                $this->sessionStart();

                //表示する文言を変数に入れる
                $this->defineMongon();

                //表示する
                $this->display();
        }

        //セッションを開始する関数
        function sessionStart(){
                session_start();
                $_SESSION['id'] = "test";
        }

        //表示する文言を指定する関数
        function defineMongon(){
                $this->mongon =" yahho" . $_SESSION['id']  . "さん!\n";
        }

        //文言をテンプレートに渡す(表示する)関数
        function display(){
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $this->mongon);
                $smarty->display('test_smarty.tpl');
        }
}

function run()の中身を見ればこのプログラムが
「セッションスタートしてテンプレに渡す変数に文言入れて、テンプレート表示してるんだな」
と、ざっくり理解できるかと思います。

では順を追って解像度をあげてきましょう!

①クラス化する

とりあえずクラス化してみます。
requireしてる下あたりからまるっとクラスで囲んで、中身の処理をfunction run()という関数にします。

assign('mongon', $mongon);
                $smarty->display('test_smarty.tpl');
        }
}

これでとりあえずクラス化が完了しました。
クラス名は、とりあえずファイル名と統一しときます。
次にクラスのインスタンスを作ってrun()を呼び出してみます。

test.php

run();
exit;

class test{

        function run(){
                //セッションスタート
                session_start();
                $_SESSION['id'] = "test";

                //表示する文言を変数に入れる
                $mongon = "こんにちは" . $_SESSION['id']  . "さん!\n";

                //表示する
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $mongon);
                $smarty->display('test_smarty.tpl');
        }
}

これでとりあえず


run();
exit;

ここまでを見ただけで、testクラスのインスタンスを作ってrun()を実行してることがわかるかと思います

②run()の中の処理を大まかに分ける

run()の中の処理を一言で表現できる程度に分けてみます。
例のプログラムだと以下の3つに分けれそうです。

セッションを開始する
表示する文言を変数に入れる
表示する
と、いうことでこの3つを関数にしてrun()の下に追加します。


        //セッションを開始する関数
        function sessionStart(){
                session_start();
                $_SESSION['id'] = "test";
        }

        //表示する文言を定義する関数
        function defineMongon(){
                $mongon = "こんにちは" . $_SESSION['id']  . "さん!\n";
        }

        //文言をテンプレートに渡す(表示する)関数
        function desplay(){
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $mongon);
                $smarty->display('test_smarty.tpl');
        }

追加したらrun()側ではその関数を呼び出すように変更します。


        function run(){
                //セッションスタート
                $this->sessionStart();

                //表示する文言を変数に入れる
                $this->defineMongon();

                //表示する
                $this->display();
        }

大分run()の中身がすっきりしました。とりあえずこれで実行してみます。

PHP Notice: Undefined variable: mongon in 実行ディレクトリ/refactering.php on line …
なんか怒られました。
mongonが定義されていないっぽい。


        //文言をテンプレートに渡す(表示する)関数
        function display(){
                $smarty = new Smarty_App;
                $smarty->assign('mongon', $mongon); ←こいつ
                $smarty->display('test_smarty.tpl');
        }

他の関数内で定義されているので怒られた模様。
次はこいつをなんとかしなくては

③共通変数を定義する

引数で渡してもいいですが、ここはクラス内共通変数として定義します。
共通変数にしたのでmongonと書いていたところをthis->mongonに変更します。


run();

class test{

        //テンプレに渡す変数を定義
        var $mongon;

        function run(){
                //セッションスタート
                $this->sessionStart();

                //表示する文言を変数に入れる
                $this->defineMongon();

                //表示する
                $this->display();
        }

        //セッションを開始する関数
        function sessionStart(){
                session_start();
                $_SESSION['id'] = "test";
        }

        //表示する文言を指定する関数
        function defineMongon(){
                //$this->mongonに変更
                $this->mongon =" yahho" . $_SESSION['id']  . "さん!\n";
        }

        //文言をテンプレートに渡す(表示する)関数
        function display(){
                $smarty = new Smarty_App;
                //$this->mongonに変更
                $smarty->assign('mongon', $this->mongon);
                $smarty->display('test_smarty.tpl');
        }
}

以上でリファクタリング終了。実際のところ100行超えるようなファイルだと試してみる価値あるかも。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です