Code sucks 人の振り見て 我が振り直せ 第7回社内勉強会
テーマ <ul><li>巷にあふれる困ったコードを 晒して dis る </li></ul><ul><li>身に覚えがあったら 反省する </li></ul><ul><li>自信をつける </li></ul>
お約束 <ul><li>自分のコードが出てきたら </li></ul><ul><ul><li>一緒に笑う </li></ul></ul><ul><ul><li>こっそり反省する </li></ul></ul><ul><ul><li>次から気をつ...
その1 <ul><li>終わらない二月、 </li></ul><ul><li>永遠の閏年 </li></ul>
月の最終日を取得したいらしい //  検索月の末日を取得 switch( $s_month ) { case 2: $last_day = 28; if (  ( $year % 4 ) == 0  ) { $last_day = 29; } ...
閏年(via Wikipedia) <ul><li>http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4 </li></ul><ul><li>グレゴリオ暦 </li></ul><ul><li>( 略 )...
ポイントをもう一度 <ul><li>西暦年が 4 で割り切れる年は閏年 </li></ul><ul><li>ただし、西暦年が 100 で割り切れる年は平年 </li></ul><ul><li>ただし、西暦年が 400 で割り切れる年は閏年 </...
コードをもう一度 //  検索月の末日を取得 switch( $s_month ) { case 2: $last_day = 28; if (  ( $year % 4 ) == 0  ) { $last_day = 29; } break;
コンピュータシステムと閏年 <ul><li>コンピュータシステムにおいて閏年を判定する アルゴリズムの記述には問題 がある場合が多く、しばしばこれが原因で システムは重大な障害 を起こす。 </li></ul><ul><li>これは例えば、 「...
二段オチ $today = time(); $s_year  = date( &quot;Y&quot;, $today); $s_month = date( &quot;m&quot;, $today); $s_day = 1; $e_yea...
正解は $last_day = date(&quot;t&quot;) ; http://jp2.php.net/manual/ja/function.date.php
その2 <ul><li>あなたが見ている </li></ul><ul><li>世界は </li></ul><ul><li>ほんものか? </li></ul>
こんなリストがありました <ul><li>よくある商品リスト </li></ul><ul><li>Web に表示したい </li></ul>
ソースをチェックしてみた $column_names = array( ' 商品名 ', ' 商品種別 ', ' 重量 ', ' 備考 ', ) ; イヤな予感!!
テーブルをチェックしてみた mysql> describe item_master ; +--------------+---------+------+-----+---------+-------+ | Field  | Type  | N...
データをチェックしてみた mysql> SELECT * FROM item_master ; (  ゚ д ゚ ) ( つ д⊂) ゴシゴシ ( ;゚ д ゚ ) ( つ д⊂) ゴシゴシ    _, ._ (;゚  Д ゚) …? ...
まあ落ち着け <ul><li>カラムの追加に強い、という メリットがあるかもしれないじゃないか </li></ul><ul><li>プライマリキーに縛られないので、 データスキーマに自由があるじゃないか </li></ul><ul><li>なに...
ロジックをチェックしてみた // $result には表示対象の商品コードが入っている while ($data = mysql_fetch_array($result)) { for ($i = 0 ; $i < count($column_...
正解は <ul><li>正規化しよう </li></ul>http://www.kogures.com/hitoshi/webtext/db-seikika/index.html
補足 <ul><li>あえて正規化しない、という選択肢 </li></ul><ul><ul><li>トランザクションロックの範囲を小さくする </li></ul></ul><ul><ul><li>どっちにしても「正規化してから」非正規化を検討 ...
その3 <ul><li>できるだけ コネタです </li></ul>
コネタその1 if( $order == _SER_ORDER_LAST_ ) { //  前日閲覧数順 } elseif( $order == _SER_ORDER_NEW_ ) { //  新着順 } elseif( $order == _...
コネタその2 // $iRecCnt( レコード数 ) が1以外なら //  不正アクセスらしい。 if($iRecCnt>1){ $strAttentMessage = &quot; 不正なアクセスです。 &quot;; } if($iRec...
コネタその3 //  取ってきたレコードを変数展開したいらしい。 $sorter = $aRecData[0][c_sorter]; $page_title = $aRecData[0][c_page_title]; $page_content...
コネタその4 (1/3) //  なんだかいろんなコネクションがある。 // INSERT 祭りが始まるようだ。 $conn->begin_trans(); $conn_sub->begin_trans(); $conn_s->begin_tr...
コネタその4 (2/3) //  ちょっと行数が多くて心が折れそうだが、 //  処理にしくじったらロールバックさせたいようだ。 if(!$conn->execute($strQue)) { $conn->rollback(); $conn_s...
コネタその4 (3/3) <ul><li>一連の処理でロールバックしている箇所を 数えてみた。 </li></ul>$ grep $conn->rollback hoge.php | wc -l 29 全部、手で 保守する気?
まとめ <ul><li>人の振り見て我が振り直せ </li></ul><ul><ul><li>あなたのコードもどこかで dis られてる …かも。 </li></ul></ul><ul><li>恐れる必要はない </li></ul><ul><u...
おしまい <ul><li>ご清聴ありがとうございました </li></ul>
Upcoming SlideShare
Loading in...5
×

第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」

1,386

Published on

世間や社内で見かけた困ったコードをdisることでコードレビューの必要性をアピールする

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,386
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

第7回社内勉強会「Code Sucks - 人の振り見て我が振り直せ」

  1. 1. Code sucks 人の振り見て 我が振り直せ 第7回社内勉強会
  2. 2. テーマ <ul><li>巷にあふれる困ったコードを 晒して dis る </li></ul><ul><li>身に覚えがあったら 反省する </li></ul><ul><li>自信をつける </li></ul>
  3. 3. お約束 <ul><li>自分のコードが出てきたら </li></ul><ul><ul><li>一緒に笑う </li></ul></ul><ul><ul><li>こっそり反省する </li></ul></ul><ul><ul><li>次から気をつける </li></ul></ul><ul><li>異論があったら </li></ul><ul><ul><li>ガンガンツッコむ </li></ul></ul><ul><li>他にもsuckなコードを見つけたら </li></ul><ul><ul><li>社内wikiに投稿する </li></ul></ul>
  4. 4. その1 <ul><li>終わらない二月、 </li></ul><ul><li>永遠の閏年 </li></ul>
  5. 5. 月の最終日を取得したいらしい // 検索月の末日を取得 switch( $s_month ) { case 2: $last_day = 28; if ( ( $year % 4 ) == 0 ) { $last_day = 29; } break;
  6. 6. 閏年(via Wikipedia) <ul><li>http://ja.wikipedia.org/wiki/%E9%96%8F%E5%B9%B4 </li></ul><ul><li>グレゴリオ暦 </li></ul><ul><li>( 略 ) </li></ul><ul><li>次の規則に従って 400 年に 97 回の閏年が設けられる。 ( 略 ) </li></ul><ul><li>1. 西暦年が 4 で割り切れる年は閏年 </li></ul><ul><li>2. ただし、西暦年が 100 で割り切れる年は平年 </li></ul><ul><li>3. ただし、西暦年が 400 で割り切れる年は閏年 </li></ul>
  7. 7. ポイントをもう一度 <ul><li>西暦年が 4 で割り切れる年は閏年 </li></ul><ul><li>ただし、西暦年が 100 で割り切れる年は平年 </li></ul><ul><li>ただし、西暦年が 400 で割り切れる年は閏年 </li></ul>
  8. 8. コードをもう一度 // 検索月の末日を取得 switch( $s_month ) { case 2: $last_day = 28; if ( ( $year % 4 ) == 0 ) { $last_day = 29; } break;
  9. 9. コンピュータシステムと閏年 <ul><li>コンピュータシステムにおいて閏年を判定する アルゴリズムの記述には問題 がある場合が多く、しばしばこれが原因で システムは重大な障害 を起こす。 </li></ul><ul><li>これは例えば、 「 4 で割り切れる年」 としかしていなかったり year==2000||year==2004 のようにある程度先の閏年しかコードしていないなどが挙げられる。 </li></ul>
  10. 10. 二段オチ $today = time(); $s_year = date( &quot;Y&quot;, $today); $s_month = date( &quot;m&quot;, $today); $s_day = 1; $e_year = date( &quot;Y&quot;, $today); $e_month = date( &quot;m&quot;, $today); // 検索月の末日を取得 switch( $s_month ) { case 2: $last_day = 28; if ( ( $year % 4 ) == 0 ) { $last_day = 29; } break; } $ php -r &quot;var_dump ( $year ) ; &quot; NULL $ php -r &quot;echo NULL % 4 ; &quot; 0   ↓ 毎年閏年になるじゃん
  11. 11. 正解は $last_day = date(&quot;t&quot;) ; http://jp2.php.net/manual/ja/function.date.php
  12. 12. その2 <ul><li>あなたが見ている </li></ul><ul><li>世界は </li></ul><ul><li>ほんものか? </li></ul>
  13. 13. こんなリストがありました <ul><li>よくある商品リスト </li></ul><ul><li>Web に表示したい </li></ul>
  14. 14. ソースをチェックしてみた $column_names = array( ' 商品名 ', ' 商品種別 ', ' 重量 ', ' 備考 ', ) ; イヤな予感!!
  15. 15. テーブルをチェックしてみた mysql> describe item_master ; +--------------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------+------+-----+---------+-------+ | item_id | int(11) | NO | | NULL | | | column_type | int(11) | NO | | NULL | | | column_value | text | YES | | NULL | | +--------------+---------+------+-----+---------+-------+    _, ._ (;゚ Д ゚)
  16. 16. データをチェックしてみた mysql> SELECT * FROM item_master ; (  ゚ д ゚ ) ( つ д⊂) ゴシゴシ ( ;゚ д ゚ ) ( つ д⊂) ゴシゴシ    _, ._ (;゚ Д ゚) …? ! ( つ д⊂) ゴシゴシゴシゴシゴシ ( ;  Д   ) !!
  17. 17. まあ落ち着け <ul><li>カラムの追加に強い、という メリットがあるかもしれないじゃないか </li></ul><ul><li>プライマリキーに縛られないので、 データスキーマに自由があるじゃないか </li></ul><ul><li>なにかオトナの理由で、正規化できない 事情があったのかもしれないじゃないか </li></ul>
  18. 18. ロジックをチェックしてみた // $result には表示対象の商品コードが入っている while ($data = mysql_fetch_array($result)) { for ($i = 0 ; $i < count($column_names) ; $i ++) { $sql = &quot;SELECT * FROM item_master&quot; . &quot; WHERE item_id = {$data['item_id']}&quot; . &quot; AND column_type = {$i}&quot; ; $ret = mysql_query($sql) ; $item = mysql_fetch_array($ret) ; echo &quot;<td>{$column_names[$item['column_type']]}</td> &quot; ; echo &quot;<td>{$item['column_value']}</td> &quot; ; } }
  19. 19. 正解は <ul><li>正規化しよう </li></ul>http://www.kogures.com/hitoshi/webtext/db-seikika/index.html
  20. 20. 補足 <ul><li>あえて正規化しない、という選択肢 </li></ul><ul><ul><li>トランザクションロックの範囲を小さくする </li></ul></ul><ul><ul><li>どっちにしても「正規化してから」非正規化を検討 </li></ul></ul><ul><li>重複項目も同様 </li></ul><ul><ul><li>「計算で出る要素」「他のテーブルにある要素」を あえて 持つ </li></ul></ul><ul><ul><ul><li>処理速度と記憶容量、保守性のトレードオフ </li></ul></ul></ul><ul><li>データベースは奥が深いね! </li></ul><ul><ul><li>技術者に敬意を </li></ul></ul>
  21. 21. その3 <ul><li>できるだけ コネタです </li></ul>
  22. 22. コネタその1 if( $order == _SER_ORDER_LAST_ ) { // 前日閲覧数順 } elseif( $order == _SER_ORDER_NEW_ ) { // 新着順 } elseif( $order == _SER_ORDER_FAV_ ) { // 登録数順 } else { // 更新順 } switch – case を 使え!!
  23. 23. コネタその2 // $iRecCnt( レコード数 ) が1以外なら // 不正アクセスらしい。 if($iRecCnt>1){ $strAttentMessage = &quot; 不正なアクセスです。 &quot;; } if($iRecCnt==0){ $strAttentMessage = &quot; 不正なアクセスです。 &quot;; } $iRecCnt != 1 じゃ ダメなの?
  24. 24. コネタその3 // 取ってきたレコードを変数展開したいらしい。 $sorter = $aRecData[0][c_sorter]; $page_title = $aRecData[0][c_page_title]; $page_content = $aRecData[0][c_page_content]; $mailflg = $aRecData[0][c_mail]; $signflg = $aRecData[0][c_sign]; $backlink = $aRecData[0][c_backlink]; $name = $aRecData[0][tname]; $cl_bg = $aRecData[0][color_bg]; $cl_text = $aRecData[0][color_text]; $cl_link = $aRecData[0][color_link]; $cl_vlink = $aRecData[0][color_vlink]; $cl_hr = $aRecData[0][color_hr]; $cl_title = $aRecData[0][color_title]; extract($aRecData[0]) ; じゃ ダメなの?
  25. 25. コネタその4 (1/3) // なんだかいろんなコネクションがある。 // INSERT 祭りが始まるようだ。 $conn->begin_trans(); $conn_sub->begin_trans(); $conn_s->begin_trans(); $conn_msg->begin_trans(); $conn_ad->begin_trans(); $conn_foo->begin_trans() ; $conn_bar->begin_trans() ;
  26. 26. コネタその4 (2/3) // ちょっと行数が多くて心が折れそうだが、 // 処理にしくじったらロールバックさせたいようだ。 if(!$conn->execute($strQue)) { $conn->rollback(); $conn_sub->rollback(); $conn_s->rollback(); $conn_msg->rollback(); $conn_ad->rollback(); $conn_foo->rollback() ; $conn_bar->rollback() ; db_regist_error($conn); }
  27. 27. コネタその4 (3/3) <ul><li>一連の処理でロールバックしている箇所を 数えてみた。 </li></ul>$ grep $conn->rollback hoge.php | wc -l 29 全部、手で 保守する気?
  28. 28. まとめ <ul><li>人の振り見て我が振り直せ </li></ul><ul><ul><li>あなたのコードもどこかで dis られてる …かも。 </li></ul></ul><ul><li>恐れる必要はない </li></ul><ul><ul><li>勇気とは恐怖を克服すること </li></ul></ul><ul><ul><ul><li>具体的には… </li></ul></ul></ul><ul><ul><ul><ul><li>たくさん書こう </li></ul></ul></ul></ul><ul><ul><ul><ul><li>人に見せよう </li></ul></ul></ul></ul><ul><li>レビュー重要 </li></ul><ul><ul><li>今回は「 dis る」という形式だった </li></ul></ul><ul><ul><li>次回は「ライブレビュー」を予定 </li></ul></ul><ul><ul><ul><li>「にこにこ力」「ほめ力」「自画自賛力」重要 </li></ul></ul></ul>
  29. 29. おしまい <ul><li>ご清聴ありがとうございました </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×