ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    スポンサーサイト

    このエントリーを含むはてなブックマーク はてなブックマーク - スポンサーサイト あとで読む
    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    CodeIgniterコーディングのコツ(試案)

    このエントリーを含むはてなブックマーク はてなブックマーク - CodeIgniterコーディングのコツ(試案) あとで読む
    CodeIgniterで、思いつくままにプログラミングしていると、記述が肥大しがちでした。

    MVCフレームワークのモデル設計 - 浜村拓夫の世界

    モチベーションがあって、情熱の赴くままにどんどん書き進めると、生産性は上がって良いのだけれど、後で改修したり、使い回すときに難儀します。

    どうすれば良いか?考え続けていたら、簡単な解決方法を思いつきました。

    (1) ControllerとModelのメソッドは、エイリアスを設けて、ファイルの上部にまとめて宣言しておく。
    (2) Controlerの中身は、(A)//input (B)//process (C)//outputの3つのパートで、上から順番に書いていく。
    (3) Modelは、なるべくActiveRecordクラスやクエリーヘルパーを利用して、簡潔に書く。

    自分用のメモなので、とりあえず概略だけ。

    ●エイリアス
    Rubyは関数やメソッドに別の名前を割り当てることができるけど、PHPはできません。=言語仕様。
    別名の代わりに、エイリアス(ショートカット)を用意して、ファイルの上部に、宣言部分のようなかんじでまとめておきます。

    こうすると、IDEのメソッド折りたたみ表示機能がなくても、メソッドの一覧を一望できます。
    テキストエディタで、画面をスクロールするのが面倒なときの対策です。

    効用はそれしかありません。(笑)
    まあ、強いて言えば、メソッドの中身を変更しても、呼び出す側は常に同じ名前でメソッドを呼び出せる、ということがあるかな?

    …スタティックなコールやテストで、面倒なことにならなきゃいいけど。


    <?php if (!defined('BASEPATH')) exit('No direct script access allowed');

    class Welcome extends CI_Controller
    {
    function __construct()
    {
    parent::__construct();
    }

    //=============================
    // method alias
    //=============================

    function index() { $this->_index(); }

    //=============================
    // method substance
    //=============================

    function _index()
    {
    // input
    $input = $this->input->post('some_data');

    // process
    $result = 'input:'.$input;

    // output
    $data['result'] = $result;
    $this->load->view('welcome', $data);
    }
    }


    ・CodeIgniterは、メソッド名を「_」(アンダーバー、アンダースコア)で始めると、privateなメソッドになる。
    ・Modelのメソッドは、「return」を書き忘れない。(例)function some() { return $this->_some(); }
    という2点に注意。

    ・alias(仮姿) → public / シンボリックリンク的な存在
    ・substance(実体) → private / ハードリンク的な存在

    「alias」の名前は不変
    =他からメソッドを呼び出す側は、常に同じ名前で呼び出せる。
    =publicな「alias」が呼び出すprivateな「subsutance」を変えても、外から見たら分からない(カプセル化)

    「substance」の中身は書き換えてもOK。


    ●擬似オーバーロード
    ついでに、引数のコツも。
    PHPは、Javaのようなオーバーロード機能がないので、
    ・引数が、1個しかないメソッドは、変数で渡してOK。
    ・引数が、2個以上のメソッドは、連想配列で渡すと吉。

    (この方法は、CodeIgniterのソースコードを読んで気がつきました。)

    メリットとしては、引数を配列で受け取ると、メソッド内で他のメソッドを呼ぶときの引数にも、シグネチャの違いを気にせずに、そのままバトンタッチで、引数を送り込めるんです。
    デメリットとしては、配列の中身を見ないと、何個のデータを受け渡ししているか、コード上だけでは、分からないこと。

    バグになりそうなら、引数の記述は、素直に変数の羅列にしておく方が無難かも?
    → 自前でライブラリを作るときに限定するとか?


    ●処理
    コントローラーは、本来、処理を割り振るディスパッチャーの役割を果たせば十分です。

    プログラムってのは、本質的に「データ」と「処理」の2要素しかありません。
    データと処理 - 浜村拓夫の世界

    プログラミングとは一言でいえば、データを扱うための処理を作ることだった。
    これ以上でもなければ、これ以外でもない。

    どんなに複雑なコンピューターのプログラムであってさえも、その構成要素は、
    ・データ
    ・処理
    というたった2つの要素に分解、還元できる。



    (1) データの入力
    (2) データの処理
    (3) データの出力
    という順番で、(1)から(3)の過程をつなげていくことが、プログラミング作業なのです。

    なので、CodeIgniterのControllerの中身も、この3つを順番に書けばOKと。


    ●SQL
    RDBを使う場合、ORM経由よりも、SQLを書く方が好きです。

    でも、INSERTとかUPDATEのSQLを書くと、結構行数を使う書き方をしてしまうので、
    簡単な処理なら、ActiveRecordクラスのヘルパーメソッドを使った方がスッキリします。

    「INSERT IGNORE」とか、デフォルトでないメソッドは、自前で用意するしかないけど。

    以上の工夫で、面倒くさいと感じる要素を減らし、コードを書きまくってみます。



    プログラマの考え方がおもしろいほど身につく本 問題解決能力を鍛えよう!
    V.Anton Spraul
    アスキー・メディアワークス
    2013-05-01
    2310円



    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/960-7389b345

    FC2Ad

    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。