SlideShare a Scribd company logo
1 of 17
インデントを減らそう
@tasaeda
2018-02-14 第38回関西PHP勉強会
自己紹介
• 朝枝 知之(ASAEDA Tomoyuki)
• Webサイト/サービス制作会社勤務
• Twitter: @tasaeda
発端
• プログラムが不慣れな人に徐々にでも
いいから成長してほしかった
……… (元から書かれているコード)
$tagList = [];
for ($i = 0; $i < count($data); $i++) {
if (!empty($data[$i]['tag'])) {
$tagList[] = $data[$i]['tag'];
} else {
$tagList[] = 'none';
}
}
……… (元から書かれているコード)
例1
foreach ($list as $id => $item) {
// ...
if (isset($item->no)) {
foreach ($item->no as $d => $t) {
if ($t['st'] && $t['et']) {
// ...
if ($etc) {
foreach ($etc as $etcK => $etcV) {
if ($etcK) {
$birthday = $etcValue;
}
}
}
}
// ...
}
// ...
}
}
例2
• コードは数行〜数十行
• 普段のやりたい処理は 配列|if|for で
ほぼ満たせる
• これらの単純な組み合わせでは処理で
きないか、書き方がわからなくなると
こちらに投げられる
• この繰り返しでは全体の成長がないの
で、できる限り自分で書くように仕向
けると…
$SQL = "SELECT id, score, score_day2, position FROM `".$tblName."` WHERE
tour_id = ".q($tour_id)." && hole != '-' ORDER BY '".$order_score."' ASC";
$RS = mysql_query($SQL);
$ROWS = mysql_num_rows($RS);
for ($i=0; $i<$ROWS; $i++) {
$id = vh(mysql_result($RS,$i,0));
$score = vh(mysql_result($RS,$i,1));
if ($i > 0) {
$score_prev = vh(mysql_result($RS,$i-1,1));
$z = ($score === $score_prev) ? $z : $i+1;
} else {
$z = $i+1;
}
$SQL = "UPDATE `".$tblName."` SET position = '".$z."' WHERE id = ".q($id);
if (!mysql_query($SQL)) {
vmsg("再設定が失敗しました。
","index","ntype=".$data['ntype']."&id=".$data['id']."&tid=".$data['tour_id']);
}
}
mysql_query("UPDATE `".$tblName."` SET position = 0 WHERE hole = '-'");
… to be continued …
システムの近代化を説いてみる
• 「一度簡単なフレームワークを触ってみようか!」
→なに書いてるか全然わからないです
• 「プログラム不要なCMSはどうかな?」
→やりたいカスタマイズができないのでイヤです
• 「Pinocoを使おう!HTMLも自然に書けるよ」
→forループ書いたらエラーでます!
※一部受け入れられました
なぜ響かないか
• 構造化しなくてもなんとか理解できる規模(数百〜
1000行程度)までのコードがほとんど
• 忙しい/興味がない
• それなりに回っているのでこれ以上の勉強の必要性
を感じない
…とはいえ「手に負える規模のレベル」は引き上げたい
最低限お願いしたこと
• コードのインデントはなるべく2段までに抑える
→ if|for をある程度抑制
• array系の関数を紹介 → 配列への対応
• continue を紹介 → for/ifへの対応
• php.net をブックマークに入れてもらう
……… (元から書かれているコード)
$tagList = [];
for ($i = 0; $i < count($data); $i++) {
if (!empty($data[$i]['tag'])) {
$tagList[] = $data[$i]['tag'];
} else {
$tagList[] = 'none';
}
}
……… (元から書かれているコード)
Before
……… (元から書かれているコード)
$tagList = array_map(function ($item) {
return $item['tag'] ?: 'none';
}, $data);
……… (元から書かれているコード)
After
foreach ($list as $id => $item) {
// ...
if (isset($item->no)) {
foreach ($item->no as $d => $t) {
if ($t['st'] && $t['et']) {
// ...
if ($etc) {
foreach ($etc as $etcK => $etcV) {
if ($etcK) {
$birthday = $etcValue;
}
}
}
}
// ...
}
// ...
}
}
Before
foreach ($list as $id => $item) {
// ...
if (!isset($item->no)) {
continue;
}
foreach ($item->no as $d => $t) {
if ((!$t['st'] && !$t['et']) && !$etc) {
continue;
}
// ...
foreach ($etc as $etcKey => $etcValue) {
if (!$etcK) {
continue;
}
$birthday = $etcValue;
// ...
}
}
// ...
}
After
感想
• 「インデントを減らすようにする」とより論理的に
考えるクセがついた模様
→「上から下へ」だけではない処理の流れを意識
→関数・クロージャを使うことでスコープを意識
※「行数を減らすようにする」だと漠然すぎたみたい
• 色々な関数を php.net で調べるようになった
リファクタリングが(多少なりとも)しやすくなった(^^)v
完
ありがとうございました。

More Related Content

Similar to インデントを減らそう

Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろTakuya Tsuchida
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talkmitamex4u
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話侑弥 濱田
 
PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門Tomo Mizoe
 
今さら始めるJavaScript
今さら始めるJavaScript今さら始めるJavaScript
今さら始めるJavaScriptAshitaba YOSHIOKA
 
プログラムの読み方
プログラムの読み方プログラムの読み方
プログラムの読み方Takuya Otani
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
デザイナーのためのPHP講座 for WordPress (初級)
デザイナーのためのPHP講座  for WordPress (初級)デザイナーのためのPHP講座  for WordPress (初級)
デザイナーのためのPHP講座 for WordPress (初級)佑 小田垣佑
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)Hiroaki KOBAYASHI
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードShigenori Sagawa
 
TDEで透過的暗号化
TDEで透過的暗号化TDEで透過的暗号化
TDEで透過的暗号化furandon_pig
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワークTakuya Sato
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道Satoshi Sato
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2Nishida Kansuke
 
Phpmatsuri2011 LT j_nakada
Phpmatsuri2011 LT j_nakadaPhpmatsuri2011 LT j_nakada
Phpmatsuri2011 LT j_nakadaJunpei Nakada
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Ransui Iso
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews, Inc.
 

Similar to インデントを減らそう (20)

Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろ
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
 
PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話PHP7をDockerで動かしたという話
PHP7をDockerで動かしたという話
 
PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門PHP, JavaScriptプログラマのためのC#入門
PHP, JavaScriptプログラマのためのC#入門
 
今さら始めるJavaScript
今さら始めるJavaScript今さら始めるJavaScript
今さら始めるJavaScript
 
プログラムの読み方
プログラムの読み方プログラムの読み方
プログラムの読み方
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
デザイナーのためのPHP講座 for WordPress (初級)
デザイナーのためのPHP講座  for WordPress (初級)デザイナーのためのPHP講座  for WordPress (初級)
デザイナーのためのPHP講座 for WordPress (初級)
 
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
仕事の手離れを良くする手段としての、静的検査のあるテンプレートエンジン (YATT::Lite talk at 2014 テンプレートエンジンNight)
 
プログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコードプログラムの処方箋~健康なコードと病んだコード
プログラムの処方箋~健康なコードと病んだコード
 
TDEで透過的暗号化
TDEで透過的暗号化TDEで透過的暗号化
TDEで透過的暗号化
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワーク
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
 
⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2⑯jQueryをおぼえよう!その2
⑯jQueryをおぼえよう!その2
 
Phpmatsuri2011 LT j_nakada
Phpmatsuri2011 LT j_nakadaPhpmatsuri2011 LT j_nakada
Phpmatsuri2011 LT j_nakada
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 

Recently uploaded

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Recently uploaded (8)

論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

インデントを減らそう