Changes between Initial Version and Version 1 of リファクタリングガイドライン


Ignore:
Timestamp:
2011/01/27 21:48:19 (15 years ago)
Author:
nanasess
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • リファクタリングガイドライン

    v1 v1  
     1= リファクタリングガイドライン = 
     2 
     3''このページは書きかけです'' 
     4 
     5== init 関数 == 
     6 
     7変数の初期化のみを行い, ビジネスロジックは記述しないこと 
     8 
     9{{{ 
     10#!php 
     11<?php 
     12function init() { 
     13     // 変数の初期化は OK 
     14     $this->tpl_mainpage = 'index.tpl'; 
     15     $this->arrDISP = $masterData->getMasterData("mtb_disp"); 
     16 
     17     // ビジネスロジックの記述は NG 
     18     if (count($this->arrPayment) > 0) { 
     19         $i = 0; 
     20         foreach ($this->arrPayment as $val) { 
     21             $this->payment[$i] = $val; 
     22             $i++; 
     23         } 
     24     } 
     25} 
     26?> 
     27}}} 
     28== action 関数 == 
     29 
     30action 関数は, 以下の処理のみを記述し, ビジネスロジックは記述しない 
     31  * 条件分岐 
     32  * VIEW に渡すメンバ変数($this->variable_name)への代入 
     33  * 宣言 
     34  * ビジネスロジックの呼び出し 
     35 
     36また, action 関数の内部で, 直接 SQL を実行する処理を記述してはならな  
     37い. 
     38 
     39{{{ 
     40#!php 
     41<?php 
     42function action() { 
     43 
     44         $this->arrForm = $this->lfConvertParam($_POST); 
     45 
     46         switch ($_POST['mode']) { 
     47         case 'edit': 
     48 
     49             $this->arrErr = $this->lfProductClassError($this->arrFor  
     50m); 
     51             if (empty($this->arrErr)){ 
     52                 $this->tpl_mainpage = 'products/product_class_confir  
     53m.tpl'; 
     54                 // 確認ページ表示 
     55                 $this->lfProductConfirmPage($this->arrForm); 
     56             } else { 
     57                 $this->doPreEdit($this->arrForm, false ,true); 
     58             } 
     59             break; 
     60 
     61         case 'delete': 
     62             $this->doDelete($this->arrForm); 
     63             break; 
     64 
     65         case 'pre_edit': 
     66             $this->doPreEdit($this->arrForm); 
     67             break; 
     68 
     69         case 'disp': 
     70             $this->doDisp($this->arrForm); 
     71             break; 
     72 
     73         case 'complete': 
     74             // 登録処理 
     75             $this->registerProductClass($this->arrForm, $this->arrFo  
     76rm['product_id']); 
     77             // 完了ページへリダイレクト 
     78             SC_Response_Ex::sendRedirect("complete.php"); 
     79             break; 
     80 
     81         default: 
     82         } 
     83 
     84} 
     85?> 
     86}}} 
     87 
     88== MODE パラメータ == 
     89 
     90`$_POST['mode']` や `$_GET['mode']` に対する条件分岐は, LC_Page::getMode() を使用し, switch 文で記述する. 
     91 
     92{{{ 
     93#!php 
     94<?php 
     95// OK 
     96switch ($this->getMode()) { 
     97     case 'disp': 
     98         $this->doDisp($this->arrForm); 
     99         break; 
     100 
     101     case 'complete': 
     102         SC_Response_Ex::sendRedirect("complete.php"); 
     103         break; 
     104 
     105     default: 
     106     } 
     107} 
     108 
     109// NG 
     110if ($_POST['mode'] == 'disp') { 
     111     $this->doDisp($this->arrForm); 
     112} elseif ($_POST['mode'] == 'complete') { 
     113     SC_Response_Ex::sendRedirect("complete.php"); 
     114} 
     115?> 
     116}}} 
     117== ビジネスロジック == 
     118 
     119  * ページ間で重複する処理が存在する場合は, Helper などの共通クラスへ 記述する 
     120  * ページ固有の処理は, ローカル関数で記述する 
     121  * 宣言を除き, 引数や返り値が無く, すべて内部のメンバ変数で処理するような関数は極力作成しない 
     122    * ステートレスな処理を心掛けること 
     123 
     124{{{ 
     125#!php 
     126<?php 
     127// OK 
     128function lfSendMail($order_id) { 
     129     $objPurchase = new SC_Purchase_Ex(); 
     130     $objPurchase->sendOrderMail($order_id) 
     131} 
     132 
     133// NG 
     134function lfSendMail() { 
     135     $objPurchase = new SC_Purchase_Ex(); 
     136     $objPurchase->sendOrderMail($this->order_id) 
     137} 
     138?> 
     139}}} 
     140 
     141  * 可能であれば, PHPUnit を使用してテストケースを残すこと 
     142  * ループ処理などで, メンバ変数や, スーパーグローバル変数は直接使わない 
     143 
     144{{{ 
     145#!php 
     146<?php 
     147// OK 
     148$this->arrParams = $this->getParams($_POST['params']); 
     149 
     150function getParams($arrParams) { 
     151     $arrResults = array(); 
     152     foreach ($arrParams as $key => $val) { 
     153         $arrResults[$key] = $val; 
     154     } 
     155     return $arrResults; 
     156} 
     157 
     158// NG 
     159foreach ($_POST['params'] as $key => $val) { 
     160     $this->arrForm[$key] = $val; 
     161} 
     162?> 
     163}}} 
     164 
     165== データベースアクセス == 
     166 
     167  * SC_Query のインスタンスを毎回必ず生成する必要の無い場合は SC_Query::getSingletonInstance() を使用してインスタンスを取得すること 
     168  * SQL 文を散乱させない 
     169    * SELECT id, name, foo, bar FROM table_name と SELECT id, name, foo, bar, too FROM table_name が存在する場合は, 後者を共通関数にリファクタリングすること 
     170  * INSERT/UPDATE/DELETE は, SC_Query::insert(), SC_Query::update(),  SC_Query::delete() を使用し, SC_Query::query() は使用しないこと 
     171 
     172== 入力チェック == 
     173 
     174入力チェック用のクラスには, SC_FromParam と SC_CheckError が存在するが, 極力 SC_FormParam を使用すること 
     175 
     176== スーパーグローバル変数 == 
     177 
     178$_POST や $_GET の値は, 必ず入力チェック後に使用する. SC_FormParam を使用していれば, SC_FormParam::getHashArray() で取得できる 
     179 
     180{{{ 
     181#!php 
     182<?php 
     183$objFormParam = new SC_FormParam(); 
     184$objFormParam->addParam("商品規格ID", "product_class_id", INT_LEN, "n  
     185", array("EXIST_CHECK", "MAX_LENGTH_CHECK", "NUM_CHECK")); 
     186$objFormParam->setParam($_POST); 
     187$objFormParam->convParam(); 
     188$arrErr = $objFormParam->checkError() 
     189if (SC_Utils_Ex::isBlank($arrErr)) { 
     190     // 入力チェック後の値が取得可能 
     191     $arrForm = $objFormParam->getHashArray(); 
     192} 
     193?> 
     194}}} 
     195 
     196`$_SESSION` は, SC_CartSession クラス等, セッションを扱うビジネスロジックを通じて使用すること. 
     197 
     198どうしても, グローバル変数を使用したい場合は, global キーワードは使用せず, `$GLOBALS` を使用すること. 
     199 
     200== 変数名 == 
     201 
     202変数名で, どんなデータか識別できるよう考慮すること 
     203 
     204{{{ 
     205誤) 
     206$arrRet 
     207 
     208正) 
     209$arrProducts 
     210}}} 
     211 
     212テーブルカラム名と共通の変数名は, キャメル式を使用せず, アンダーバーで区切ること 
     213 
     214{{{ 
     215誤) 
     216$productId 
     217 
     218正) 
     219$product_id 
     220}}} 
     221 
     222== PHPDoc コメント == 
     223関数の PHPDoc コメントは必ず記述する. 
     224  * 関数の説明 
     225  * 引数 
     226  * 返り値 
     227 
     228== 非推奨機能 == 
     229 
     230error_reporting(E_ALL) で, エラー及び警告が出力されないようコーディン  
     231グすること. 
     232PHP5.3 で非推奨となっている関数は使用しないこと. 
     233 
     234  * call_user_method() (かわりに call_user_func() を使用します) 
     235  * call_user_method_array() (かわりに call_user_func_array() を使用します) 
     236  * define_syslog_variables() 
     237  * dl() 
     238  * ereg() (かわりに preg_match() を使用します) 
     239  * ereg_replace() (かわりに preg_replace() を使用します) 
     240  * eregi() (かわりに preg_match() で 'i' 修正子を使用します) 
     241  * eregi_replace() (かわりに preg_replace() で 'i' 修正子を使用します) 
     242  * set_magic_quotes_runtime() およびそのエイリアスである magic_quotes_runtime() 
     243  * session_register() (かわりにスーパーグローバル `$_SESSION` を使用します) 
     244  * session_unregister() (かわりにスーパーグローバル `$_SESSION` を使用します) 
     245  * session_is_registered() (かわりにスーパーグローバル `$_SESSION` を使用します) 
     246  * set_socket_blocking() (かわりに stream_set_blocking() を使用します) 
     247  * split() (かわりに preg_split() を使用します) 
     248  * spliti() (かわりに preg_split() で 'i' 修正子を使用します) 
     249  * sql_regcase() 
     250  * is_dst を mktime() に渡すこと。 かわりにタイムゾーン処理用の新しい関数を使用します。 
     251 
     252以下の機能も, PHP5.3.x で非推奨となっているが, PHP4互換のために使用しても良い 
     253 
     254  * new の返り値を参照で代入すること 
     255  * 呼び出し時の参照渡し 
     256 
     257参考 
     258http://www.php.net/manual/ja/migration53.deprecated.php 
     259 
     260== PHP4 での動作 == 
     261 
     262PHP4.3.11 以降で動作可能な構文にすること 
     263 
     264参考 
     265http://svn.ec-cube.net/open_trac/ticket/854 
     266http://svn.ec-cube.net/open_trac/changeset/20024 
     267 
     268== 不要な機能 == 
     269 
     270TODO 
     271