狠狠撸
Submit Search
叁项演算子を见ると「ウッ」てなる人のはなし
?
1 like
?
1,823 views
Yuta Ohashi
PHPerKaigi Online #1
Read less
Read more
1 of 53
Download now
Download to read offline
More Related Content
叁项演算子を见ると「ウッ」てなる人のはなし
1.
三項演算?を?ると 「ウッ」 てなる?のはなし PHPerKaigi Online #1 2020.03.27 Yuta
Ohashi
2.
三項演算?を?ると 「ウッ」 てなる? ?
3.
blue_goheimochi ?橋 佑太 株式会社オウケイウェイヴ PHP(Laravel), Javascript(Vue.js/Nuxt.js), Laravel
JP Conference 2020, PHPerKaigi 2020, サッカー, フットサル, 浜松まつり, ポケカ, さわやかのげんこつハンバーグ おおはし ゆうた
4.
44 例:商品ステータス判定 <?php $status = $hasItem
? $isOpened ? "OK" : "NG" : "NG"; <?php $status = $hasItem ? $isOpened ? "OK" : "NG" : "NG";
5.
55 例:商品ステータス判定 <?php $status = $hasItem
? $isOpened ? "OK" : "NG" : "NG"; <?php $status = $hasItem ? $isOpened ? "OK" : "NG" : "NG"; ぱっと?で どういう条件かわからない???
6.
66 例:商品ステータス判定 <?php $status = $hasItem
? $isOpened ? "OK" : "NG" : "NG"; <?php $status = $hasItem ? $isOpened ? "OK" : "NG" : "NG"; ぱっと?で どういう条件かわからない??? ネストはそれはそれで わらからない???
7.
书き换える
8.
88 例:商品ステータス判定 <?php $status = "NG"; if
($isOpened && $hasItem) { $status = "OK"; } <?php $status = ($hasItem && $isOpened) ? "OK" : "NG"; デフォルトをNGにしとく
9.
99 例:商品ステータス判定 <?php $status = "NG"; if
($isOpened && $hasItem) { $status = "OK"; } <?php $status = ($hasItem && $isOpened) ? "OK" : "NG"; デフォルトをNGにしとく OKになる条件だけifで指定
10.
1010 例:商品ステータス判定 <?php $status = "NG"; if
($isOpened && $hasItem) { $status = "OK"; } <?php $status = ($hasItem && $isOpened) ? "OK" : "NG"; デフォルトをNGにしとく OKになる条件だけifで指定 このくらいなら三項演算?使ってても 分かりやすさがある
11.
1111 例:商品ステータス判定 <?php $status = "NG"; if
($isOpened && $hasItem) { $status = "OK"; } <?php $status = ($hasItem && $isOpened) ? "OK" : "NG"; デフォルトをNGにしとく OKになる条件だけifで指定 そのくらいなら三項演算?使ってても 分かりやすさはある ?の好みによるところも?きい (育ってきた環境とか違うとすれ違うよね)
12.
(個?的な想いとしては) 冗?でもいいから 分かりやすくかいてほしいが 強く?えない
13.
そうだパフォーマンスを 調べればいいんだ!
14.
そうだパフォーマンスを 調べればいいんだ!
15.
1515 <?php $loop = $argv[1]; $result
= [ "OK" => 0, "NG" => 0, ]; for ($i=0; $i<$loop; $i++) { $hasItem = rand(0, 1) == 1; $isOpened = rand(0, 1) == 1; $status = $hasItem ? $isOpened ? "OK" : "NG" : "NG"; $result[$status]++; unset($status); } echo "Finish?n"; echo "----------?n"; echo "loop: " . $loop . "?n"; echo "result: OK: " . $result["OK"] . " NG: " . $result["NG"] . "?n"; echo "----------?n"; 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合
16.
1616 <?php $loop = $argv[1]; $result
= [ "OK" => 0, "NG" => 0, ]; for ($i=0; $i<$loop; $i++) { $hasItem = rand(0, 1) == 1; $isOpened = rand(0, 1) == 1; $status = "NG"; if ($isOpened && $hasItem) { $status = "OK"; } $result[$status]++; unset($status); } echo "Finish?n"; echo "----------?n"; echo "loop: " . $loop . "?n"; echo "result: OK: " . $result["OK"] . " NG: " . $result["NG"] . "?n"; echo "----------?n"; 雑にパフォーマンスを調べる test02.php ? 三項演算?を使わない場合
17.
ループ回数 1回?10億回まで調査
18.
1818 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 1 Finish ---------- loop: 1 result: OK: 1 NG: 0 ---------- real 0.03 user 0.01 sys 0.00 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1 Finish ---------- loop: 1 result: OK: 0 NG: 1 ---------- real 0.04 user 0.02 sys 0.00 test02.php ? 三項演算?を使わない場合
19.
1919 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 10 Finish ---------- loop: 10 result: OK: 2 NG: 8 ---------- real 0.02 user 0.01 sys 0.00 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 10 Finish ---------- loop: 10 result: OK: 4 NG: 6 ---------- real 0.04 user 0.02 sys 0.00 test02.php ? 三項演算?を使わない場合
20.
2020 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 100 Finish ---------- loop: 100 result: OK: 20 NG: 80 ---------- real 0.04 user 0.00 sys 0.02 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 100 Finish ---------- loop: 100 result: OK: 23 NG: 77 ---------- real 0.04 user 0.01 sys 0.01 test02.php ? 三項演算?を使わない場合
21.
2121 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 1000 Finish ---------- loop: 1000 result: OK: 263 NG: 737 ---------- real 0.05 user 0.02 sys 0.01 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1000 Finish ---------- loop: 1000 result: OK: 259 NG: 741 ---------- real 0.02 user 0.01 sys 0.00 test02.php ? 三項演算?を使わない場合
22.
2222 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 10000 Finish ---------- loop: 10000 result: OK: 2481 NG: 7519 ---------- real 0.05 user 0.01 sys 0.02 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 10000 Finish ---------- loop: 10000 result: OK: 2526 NG: 7474 ---------- real 0.04 user 0.02 sys 0.00 test02.php ? 三項演算?を使わない場合
23.
2323 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 100000 Finish ---------- loop: 100000 result: OK: 25039 NG: 74961 ---------- real 0.06 user 0.02 sys 0.02 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 100000 Finish ---------- loop: 100000 result: OK: 24951 NG: 75049 ---------- real 0.15 user 0.04 sys 0.00 test02.php ? 三項演算?を使わない場合
24.
2424 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 1000000 Finish ---------- loop: 1000000 result: OK: 249859 NG: 750141 ---------- real 0.33 user 0.31 sys 0.00 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1000000 Finish ---------- loop: 1000000 result: OK: 249445 NG: 750555 ---------- real 0.46 user 0.21 sys 0.00 test02.php ? 三項演算?を使わない場合
25.
2525 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 10000000 Finish ---------- loop: 10000000 result: OK: 2500307 NG: 7499693 ---------- real 1.98 user 1.93 sys 0.02 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 10000000 Finish ---------- loop: 10000000 result: OK: 2499460 NG: 7500540 ---------- real 2.13 user 2.07 sys 0.02 test02.php ? 三項演算?を使わない場合
26.
2626 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 100000000 Finish ---------- loop: 100000000 result: OK: 25010943 NG: 74989057 ---------- real 19.66 user 19.34 sys 0.07 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 100000000 Finish ---------- loop: 100000000 result: OK: 25000619 NG: 74999381 ---------- real 19.67 user 19.51 sys 0.09 test02.php ? 三項演算?を使わない場合
27.
2727 % docker-compose run
--rm php-cli time -p php ternary-operator/test01.php 1000000000 Finish ---------- loop: 1000000000 result: OK: 250032439 NG: 749967561 ---------- real 196.47 user 195.49 sys 0.33 雑にパフォーマンスを調べる test01.php ? 三項演算?を使った場合 % docker-compose run --rm php-cli time -p php ternary-operator/test02.php 1000000000 Finish ---------- loop: 1000000000 result: OK: 250021250 NG: 749978750 ---------- real 209.85 user 207.77 sys 1.05 test02.php ? 三項演算?を使わない場合
28.
2828 雑にパフォーマンスを調べる test01.php 1 2
3 4 5 6 7 8 9 10 平均 1回 0.03 0.03 0.02 0.02 0.04 0.05 0.05 0.04 0.05 0.02 0.035 10回 0.02 0.05 0.05 0.14 0.02 0.02 0.04 0.03 0.02 0.02 0.041 100回 0.04 0.03 0.03 0.02 0.04 0.03 0.02 0.02 0.05 0.05 0.033 1000回 0.05 0.02 0.14 0.04 0.03 0.04 0.04 0.02 0.06 0.04 0.048 1万回 0.05 0.03 0.03 0.02 0.02 0.02 0.05 0.03 0.04 0.05 0.034 10万回 0.06 0.15 0.05 0.07 0.04 0.07 0.06 0.06 0.07 0.06 0.069 100万回 0.33 0.21 0.24 0.22 0.22 0.23 0.23 0.21 0.2 0.34 0.243 1000万回 1.98 1.84 1.78 1.82 1.92 1.88 2 1.81 2.06 3.61 2.07 1億回 19.66 17.46 17.32 17.36 17.27 17.35 17.39 17.3 17.51 17.52 17.614 10億回 196.47 183.12 190.1 204.81 173.54 174.8 176.23 188.99 190.94 182.66 186.166 縦: loop回数 横: 実?回数
29.
2929 雑にパフォーマンスを調べる test02.php 1 2
3 4 5 6 7 8 9 10 平均 1回 0.04 0.14 0.03 0.02 0.02 0.05 0.02 0.03 0.04 0.04 0.043 10回 0.04 0.02 0.03 0.03 0.02 0.02 0.02 0.05 0.02 0.02 0.027 100回 0.04 0.02 0.02 0.02 0.03 0.02 0.04 0.02 0.04 0.05 0.03 1000回 0.02 0.04 0.12 0.04 0.03 0.02 0.03 0.04 0.04 0.04 0.042 1万回 0.04 0.05 0.03 0.04 0.04 0.03 0.03 0.03 0.03 0.03 0.035 10万回 0.15 0.14 0.04 0.05 0.05 0.05 0.06 0.05 0.05 0.06 0.07 100万回 0.46 0.22 0.2 0.21 0.2 0.21 0.22 0.21 0.24 0.23 0.24 1000万回 2.13 1.69 1.72 1.72 1.75 1.78 1.76 1.75 1.81 1.76 1.787 1億回 19.67 16.33 16.74 16.44 16.58 16.45 16.5 16.65 16.63 16.71 16.87 10億回 209.85 165.94 172.02 171.37 174.32 170.2 163.97 164.31 164.8 163.44 172.022 縦: loop回数 横: 実?回数
30.
3030 雑にパフォーマンスを調べる test1.php test2.php 差分 1回
0.035 0.043 -0.008 10回 0.041 0.027 0.014 100回 0.033 0.03 0.003 1000回 0.048 0.042 0.006 1万回 0.034 0.035 -0.001 10万回 0.069 0.07 -0.001 100万回 0.243 0.24 0.003 1000万回 2.07 1.787 0.283 1億回 17.614 16.87 0.744 10億回 186.166 172.022 14.144
31.
3131 0 20 40 60 80 100 120 140 160 180 200 1 10 100
1000 10000 100000 1000000 10000000 100000000 1000000000 三項演算?を使った場合と使わない場合の実?時間 test1.php test2.php 雑にパフォーマンスを調べる
32.
3232 0 20 40 60 80 100 120 140 160 180 200 1 10 100
1000 10000 100000 1000000 10000000 100000000 1000000000 三項演算?を使った場合と使わない場合の実?時間 test1.php test2.php 雑にパフォーマンスを調べる ほらー三項演算?使わない?が パフォーマンスいいでしょー?
33.
3333 0 20 40 60 80 100 120 140 160 180 200 1 10 100
1000 10000 100000 1000000 10000000 100000000 1000000000 三項演算?を使った場合と使わない場合の実?時間 test1.php test2.php 雑にパフォーマンスを調べる ほらー三項演算?使わない?が パフォーマンスいいでしょー? (そういう話ではない)
34.
3434 調査結果 ? 1億回ループさせないと差が顕著にならない ? 現実にそんなユースケースは存在しない ?
誤差の範囲 ? Webアプリケーションの場合においては ? バッチとか重めの処理する場合には少し考慮しても よいかも
35.
三項演算?を 禁?したいわけではない
36.
https://twitter.com/tadsan/status/1243531504459759622
37.
3737 例:商品ステータス判定 <?php $status = $hasItem
? $isOpened ? "OK" : "NG" : "NG"; <?php $status = $hasItem ? $isOpened ? "OK" : "NG" : "NG"; ぱっと?で どういう条件かわからない??? ネストはそれはそれで わらからない???
38.
3838 例:商品ステータス判定 <?php $status = "NG"; if
($isOpened && $hasItem) { $status = "OK"; } <?php $status = ($hasItem && $isOpened) ? "OK" : "NG"; デフォルトをNGにしとく OKになる条件だけifで指定 このくらいなら三項演算?使ってても 分かりやすさがある
39.
「分かりやすさ」が?事
41.
1章 理解しやすいコード
42.
コードは理解しやすく なければいけない。
43.
コードは他の?が最短時間で 理解できるように 書かなければいけない。
44.
7章 制御フローを読みやすくする 7.3 三項演算?
45.
?数を短くするよりも、 他の?が理解するのに かかる時間を短くする。
46.
基本的には if/else を使おう。 三項演算?はそれによって 簡潔になる時にだけ使おう。
47.
解説 他の?に読んでもらう
48.
?分が書いたコードを ?に読んでもらうということは、 読みやすいコードを書くための とてもいい機会になる
49.
仲間にも本書を読んでもらって、 どうすれば読みやすいコードに なるかを共有しておくのがいい。 仲間と?緒に実践できるとなおいい。
50.
「分かにくいコード」がいい という?はきっといないでしょう
51.
?分??が 「理解しやすいコード」を 意識的に書き
52.
仲間と 「理解しやすいコード」の 共通認識をつくる
53.
5353 まとめ ? 三項演算?は適材適所で使う ? 理解しやすいコードを書くように?がける ?
?分で説明できるとなおよし ? 「なぜ理解しやすいコードだと思うのか?」を チームメンバーと話して共通理解をつくってい く
Download