| | 1 | = リファクタリングガイドライン = |
| | 2 | |
| | 3 | ''このページは書きかけです'' |
| | 4 | |
| | 5 | == init 関数 == |
| | 6 | |
| | 7 | 変数の初期化のみを行い, ビジネスロジックは記述しないこと |
| | 8 | |
| | 9 | {{{ |
| | 10 | #!php |
| | 11 | <?php |
| | 12 | function 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 | |
| | 30 | action 関数は, 以下の処理のみを記述し, ビジネスロジックは記述しない |
| | 31 | * 条件分岐 |
| | 32 | * VIEW に渡すメンバ変数($this->variable_name)への代入 |
| | 33 | * 宣言 |
| | 34 | * ビジネスロジックの呼び出し |
| | 35 | |
| | 36 | また, action 関数の内部で, 直接 SQL を実行する処理を記述してはならな |
| | 37 | い. |
| | 38 | |
| | 39 | {{{ |
| | 40 | #!php |
| | 41 | <?php |
| | 42 | function action() { |
| | 43 | |
| | 44 | $this->arrForm = $this->lfConvertParam($_POST); |
| | 45 | |
| | 46 | switch ($_POST['mode']) { |
| | 47 | case 'edit': |
| | 48 | |
| | 49 | $this->arrErr = $this->lfProductClassError($this->arrFor |
| | 50 | m); |
| | 51 | if (empty($this->arrErr)){ |
| | 52 | $this->tpl_mainpage = 'products/product_class_confir |
| | 53 | m.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 |
| | 76 | rm['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 |
| | 96 | switch ($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 |
| | 110 | if ($_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 |
| | 128 | function lfSendMail($order_id) { |
| | 129 | $objPurchase = new SC_Purchase_Ex(); |
| | 130 | $objPurchase->sendOrderMail($order_id) |
| | 131 | } |
| | 132 | |
| | 133 | // NG |
| | 134 | function 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 | |
| | 150 | function getParams($arrParams) { |
| | 151 | $arrResults = array(); |
| | 152 | foreach ($arrParams as $key => $val) { |
| | 153 | $arrResults[$key] = $val; |
| | 154 | } |
| | 155 | return $arrResults; |
| | 156 | } |
| | 157 | |
| | 158 | // NG |
| | 159 | foreach ($_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() |
| | 189 | if (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 | |
| | 230 | error_reporting(E_ALL) で, エラー及び警告が出力されないようコーディン |
| | 231 | グすること. |
| | 232 | PHP5.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 | 参考 |
| | 258 | http://www.php.net/manual/ja/migration53.deprecated.php |
| | 259 | |
| | 260 | == PHP4 での動作 == |
| | 261 | |
| | 262 | PHP4.3.11 以降で動作可能な構文にすること |
| | 263 | |
| | 264 | 参考 |
| | 265 | http://svn.ec-cube.net/open_trac/ticket/854 |
| | 266 | http://svn.ec-cube.net/open_trac/changeset/20024 |
| | 267 | |
| | 268 | == 不要な機能 == |
| | 269 | |
| | 270 | TODO |
| | 271 | |