Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPで FizzBuzz問題をやってみよう #ゆるWeb札幌
Search
Kihara, Takuya
PRO
March 30, 2019
Technology
1.6k
1
Share
PHPで FizzBuzz問題をやってみよう #ゆるWeb札幌
PHPでFizzBuzz問題を解いていく。
シンプルな解き方から、段階的にオブジェクト指向を取り入れてみる。
ゆるWeb勉強会@札幌 #4
#ゆるWeb札幌
Kihara, Takuya
PRO
March 30, 2019
More Decks by Kihara, Takuya
See All by Kihara, Takuya
Amplify でも Auth0 をいい感じに使いたい! - Cognito Identity Pool を使った認証情報の連携 #auth0
tacck
PRO
0
88
雑食エンジニアの生きる道〜AI時代のこれから #seb_summit
tacck
PRO
1
190
それでは聞いてください「Impeller導入に失敗しました」 #FlutterKaigi #skia
tacck
PRO
0
510
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
650
Amazon Q Developer CLI でゲームと Amplify アプリを作ってみた #ゆるWeb札幌
tacck
PRO
0
71
ゆるWeb勉強会@札幌 #30 #ゆるWeb札幌
tacck
PRO
0
44
Flutter を始めよう! - Flutter の開発現場から
tacck
PRO
0
200
GitHub Actions で Flutter アプリの CI/CD をやってます #ゆるWeb札幌
tacck
PRO
0
520
ゆるWeb勉強会@札幌 #29 #ゆるWeb札幌
tacck
PRO
0
210
Other Decks in Technology
See All in Technology
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.8k
Ruby::Boxでできること、Refinementsでできること
joker1007
3
350
地元にいないローカルオーガナイザーの立ち回り
uvb_76
1
430
Platform Engineering as a Product: Criteria for Improvement and Multi-Tenant Design
kumorn5s
0
460
Strands Agents超入門
kintotechdev
1
150
20260528_生成AIを専属DSに_Howの次にすべきことを考える
doradora09
PRO
0
280
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
120
個人AIからチームAIへ:開発における品質と生産性の再設計
moongift
PRO
0
350
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
2
870
電子辞書Brainをネットに繋げてみた(自力編)
raspython3
0
410
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
140
long-running-tasks
cipepser
3
460
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
200
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
810
Designing Powerful Visuals for Engaging Learning
tmiket
1
390
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
400
Believing is Seeing
oripsolob
1
140
Ethics towards AI in product and experience design
skipperchong
2
290
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
200
Evolving SEO for Evolving Search Engines
ryanjones
0
210
Tell your own story through comics
letsgokoyo
1
940
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
220
How to make the Groovebox
asonas
2
2.2k
Transcript
PHPͰ FizzBuzzΛ ͬͯΈΑ͏ 2019/03/30 tacck ゆるWeb勉強会@札幌 #4 #ゆるWeb札幌
୭ UBDDL ໊લ ࠷ۙݹͷ+BWBͷ͓कΓ ͓ࣄ εϓϨουɾΠʔάϧ ͖ͳϑΟΪϡΞεέʔτͷٕ ΏΔ8FCࡳຈ
ࠓ͓͢͠Δ͜ͱ • FizzBuzz • ͬͯΈΑ͏ • റΓϓϨΠ ΏΔ8FCࡳຈ
FizzBuzz ΏΔ8FCࡳຈ
FizzBuzz • ϓϩάϥϚʔͷᅂΈ ΏΔ8FCࡳຈ
FizzBuzz • 3ͷഒͰ “Fizz” ͱग़ྗ • 5ͷഒͰ “Buzz” ͱग़ྗ •
3ͷഒ ͔ͭ 5ͷഒͰ “FizzBuzz” ͱग़ྗ (ͭ·Γ15ͷഒ) • ͦΕҎ֎ࣗମΛจࣈͱͯ͠ग़ྗ ΏΔ8FCࡳຈ
FizzBuzz • ࠓճɺ • 1ʙ100·ͰͷΛ༩͑Δɻ • લͷϖʔδͷنଇʹैͬͯग़ྗ͢Δɻ • ͱ͍͏ϓϩάϥϜΛ࡞͍ͯ͘͠ɻ ΏΔ8FCࡳຈ
ͬͯΈΑ͏ ΏΔ8FCࡳຈ
Step1: ૉͳ࣮ ΏΔ8FCࡳຈ
ૉͳ࣮ • ࡉ͔͍͜ͱؾʹͤͣʹɻ https://github.com/tacck/PHPFizzBuzzTraining/tree/Step1 ΏΔ8FCࡳຈ
<?php for ($num = 1; $num <= 100; $num++) {
if ($num % 3 === 0 && $num % 5 === 0) { echo 'FizzBuzz' . PHP_EOL; } elseif ($num % 3 === 0 && $num % 5 !== 0) { echo 'Fizz' . PHP_EOL; } elseif ($num % 3 !== 0 && $num % 5 === 0) { echo 'Buzz' . PHP_EOL; } else { echo "$num" . PHP_EOL; } }
Step2: ॳ৺ऀ͚ ΏΔ8FCࡳຈ
ॳ৺ऀ͚ • FizzBuzzͷఆΛؔ(ϝιου)Խɻ https://github.com/tacck/PHPFizzBuzzTraining/tree/Step2 ΏΔ8FCࡳຈ
<?php for ($num = 1; $num <= 100; $num++) {
echo getFizzBuzz($num) . PHP_EOL; } function getFizzBuzz(int $num): string { if ($num % 3 === 0 && $num % 5 === 0) { return 'FizzBuzz'; } elseif ($num % 3 === 0 && $num % 5 !== 0) { return 'Fizz'; } elseif ($num % 3 !== 0 && $num % 5 === 0) { return 'Buzz'; } else { return "$num"; } }
Step3: ॳ৺ऀΑΓ্Λࢦ͢ ΫϥεΛ͏ ΏΔ8FCࡳຈ
ΫϥεΛ͏ • ׂͷ୲ΛΫϥεͰදݱ͢Δɻ • 1ʙ100ͷʹରԠ͢ΔจࣈྻΛදࣔ • ͱจࣈͷରԠؔΛఆ͠ฦ٫ https://github.com/tacck/PHPFizzBuzzTraining/tree/Step3 ΏΔ8FCࡳຈ
<?php require_once __DIR__ . '/vendor/autoload.php'; use App\FizzBuzz\FizzBuzz; $fizzBuzz = new
FizzBuzz(); for ($num = 1; $num <= 100; $num++) { echo $fizzBuzz->getFizzBuzz($num) . PHP_EOL; }
<?php namespace App\FizzBuzz; class FizzBuzz { public function getFizzBuzz(int $num):
string { if ($num % 3 === 0 && $num % 5 === 0) { return 'FizzBuzz'; } elseif ($num % 3 === 0 && $num % 5 !== 0) { return 'Fizz'; } elseif ($num % 3 !== 0 && $num % 5 === 0) { return 'Buzz'; } else { return "$num"; } } }
Step4: தڃऀ͚ ΫϥεͷΛ͚Δ ΏΔ8FCࡳຈ
Ϋϥεͷ? • ͦͷΫϥε͕ʮҰͭͷʯʹด͍ͯ͡Δ͔ • ؔ৺ͷɺૄ݁߹ɺͱ͍ͬͨΩʔϫʔυɻ • 1ʙ100ͷʹରԠ͢ΔจࣈྻΛදࣔ • ͱจࣈͷରԠؔͷఆ •
ରԠ͢Δจࣈྻͷฦ٫ https://github.com/tacck/PHPFizzBuzzTraining/tree/Step4 ΏΔ8FCࡳຈ
ؔ৺ • ಛఆͷΛ༩͑ɺจࣈྻΛग़ྗ͍ͨ͠ɻ • ͱจࣈྻͷରԠΛอূ͍ͨ͠ɻ • จࣈྻΛ֬ఆ͍ͤͨ͞ɻ ΏΔ8FCࡳຈ
ؔ৺ͱ • ಛఆͷΛ༩͑ɺจࣈྻΛग़ྗ͍ͨ͠ɻ ˠ ϝιουͷݺͼग़͠ͱ݁Ռͷग़ྗ • ͱจࣈྻͷରԠΛอূ͍ͨ͠ɻ ˠ Λड͚औΓɺରԠ͢Δදࣔ༰ͷฦ٫ •
දࣔ༰Λ֬ఆ͍ͤͨ͞ɻ ˠ ͕ࣗར༻͞ΕΔ߹ʹදࣔ༰Λฦ٫ ΏΔ8FCࡳຈ
ؔ৺ͱ • ಛఆͷΛ༩͑ɺจࣈྻΛग़ྗ͍ͨ͠ɻ ˠ ϝιουͷݺͼग़͠ͱग़ྗ • ͱจࣈྻͷରԠΛอূ͍ͨ͠ɻ ˠ Λड͚औΓɺରԠ͢Δදࣔ༰ͷฦ٫ •
දࣔ༰Λ֬ఆ͍ͤͨ͞ɻ ˠ ͕ࣗར༻͞ΕΔ߹ʹදࣔ༰Λฦ٫ ݺͼग़ͯ͠͏ ݺͼग़ͯ͠͏ ΏΔ8FCࡳຈ
ؔ৺ͱ ΏΔ8FCࡳຈ ΠϯλϑΣʔε ೖग़ྗ ͷ ਖ਼͍͠σʔλΛड͚͢ ਖ਼͍͠σʔλͰ͋Δ ґଘؔ Ұํ ґଘؔ
Ұํ
<?php require_once __DIR__ . '/vendor/autoload.php'; use App\FizzBuzz\FizzBuzzPresenterBuilder; for ($num =
1; $num <= 100; $num++) { echo FizzBuzzPresenterBuilder::build($num) . PHP_EOL; }
<?php namespace App\FizzBuzz; use App\FizzBuzz\FizzBuzzPresenterInterface; class FizzBuzzPresenterBuilder { public static
function build(int $num): FizzBuzzPresenterInterface { if ($num % 3 === 0 && $num % 5 === 0) { return new \App\FizzBuzz\Presenter\FizzBuzzPresenter($num); } elseif ($num % 3 === 0 && $num % 5 !== 0) { return new \App\FizzBuzz\Presenter\FizzPresenter($num); } elseif ($num % 3 !== 0 && $num % 5 === 0) { return new \App\FizzBuzz\Presenter\BuzzPresenter($num); } else { return new \App\FizzBuzz\Presenter\NumberPresenter($num); } } }
<?php namespace App\FizzBuzz\Presenter; use App\FizzBuzz\FizzBuzzPresenterInterface; class FizzPresenter implements FizzBuzzPresenterInterface {
private $num; public function __construct(int $num) { $this->num = $num; } public function __toString(): string { return 'Fizz'; } public function isAvailable(): bool { return true; } }
Step5: റΓϓϨΠ ifจΛΘͳ͍Ͱ࣮͢Δ ΏΔ8FCࡳຈ
ifจΛΘͳ͍Ͱ࣮͢Δ • ಄ͷମૢ ΏΔ8FCࡳຈ
ifจΛΘͳ͍Ͱ࣮͢Δ • ಄ͷମૢ • ݱ࣮ͱͯ͠ɺ ଟͷ݅ذόάΛੜΈ͍͢ɻ ˠ ʮଟʯͷ෦Λղ͖΄͙͢ https://github.com/tacck/PHPFizzBuzzTraining/tree/Step5 ΏΔ8FCࡳຈ
ؔ৺ͱ • ಛఆͷΛ༩͑ɺจࣈྻΛग़ྗ͍ͨ͠ɻ ˠ ϝιουͷݺͼग़͠ͱग़ྗ • ͱจࣈྻͷରԠΛอূ͍ͨ͠ɻ ˠ Λड͚औΓɺରԠ͢Δදࣔ༰ͷฦ٫ •
දࣔ༰Λ֬ఆ͍ͤͨ͞ɻ ˠ ͕ࣗར༻͞ΕΔ߹ʹදࣔ༰Λฦ٫ ΏΔ8FCࡳຈ ͜͜ʹ݅ذ
ؔ৺ͱ • ಛఆͷΛ༩͑ɺจࣈྻΛग़ྗ͍ͨ͠ɻ ˠ ϝιουͷݺͼग़͠ͱग़ྗ • ͱจࣈྻͷରԠΛอূ͍ͨ͠ɻ ˠ Λड͚औΓɺରԠ͢Δදࣔ༰ͷฦ٫ •
දࣔ༰Λ֬ఆ͍ͤͨ͞ɻ ˠ ͕ࣗར༻͞ΕΔ߹ʹදࣔ༰Λฦ٫ ΏΔ8FCࡳຈ ͜͜ʹ
ؔ৺ͱ • ಛఆͷΛ༩͑ɺจࣈྻΛग़ྗ͍ͨ͠ɻ ˠ ϝιουͷݺͼग़͠ͱग़ྗ • ͱจࣈྻͷରԠΛอূ͍ͨ͠ɻ ˠ Λड͚औΓɺରԠ͢Δදࣔ༰ͷฦ٫ •
දࣔ༰Λ֬ఆ͍ͤͨ͞ɻ ˠ ͕ࣗར༻͞ΕΔ߹ʹදࣔ༰Λฦ٫ ΏΔ8FCࡳຈ ͑Δ͔Ͳ͏͔ ʮදࣔ༰ʯ͕ࣗΔ͖
ؔ৺ͱ ΏΔ8FCࡳຈ ΠϯλϑΣʔε ೖग़ྗ ͷ ਖ਼͍͠σʔλΛड͚͢ ਖ਼͍͠σʔλͰ͋Δ
<?php require_once __DIR__ . '/vendor/autoload.php'; use App\FizzBuzz\FizzBuzzPresenterBuilder; for ($num =
1; $num <= 100; $num++) { echo FizzBuzzPresenterBuilder::build($num) . PHP_EOL; }
<?php namespace App\FizzBuzz; use App\FizzBuzz\FizzBuzzPresenterInterface; class FizzBuzzPresenterBuilder { public static
function build(int $num): FizzBuzzPresenterInterface { foreach (glob(__DIR__ . '/Presenter/Dynamic/*.php') as $file) { require_once $file; $class = '\App\FizzBuzz\Presenter\Dynamic\\' . basename($file, '.php'); $presenter = new $class($num); try { // throw ParseError if $num is not available $presenter->isAvailable(); return $presenter; } catch (\ParseError $e) { // none } } return new \App\FizzBuzz\Presenter\NumberPresenter($num); } }
<?php namespace App\FizzBuzz\Presenter\Dynamic; use App\FizzBuzz\FizzBuzzPresenterInterface; class FizzPresenter implements FizzBuzzPresenterInterface {
private $num; public function __construct(int $num) { $this->num = $num; } public function __toString(): string { return 'Fizz'; } public function isAvailable(): bool { return ($this->num % 3 === 0 && $this->num % 5 !== 0) ? true : eval('invalid'); } }
ifจΛΘͳ͍Ͱ࣮͢Δ • Ԡ༻ྫ • ݩ߸ • ৽ݩ߸͕ൃද͞ΕͨΒɺ PresenterΫϥεΛՃ͢Δ͚ͩɻ https://github.com/tacck/PHPJapaneseEraTraining ΏΔ8FCࡳຈ
·ͱΊ ΏΔ8FCࡳຈ
·ͱΊ • FizzBuzzΛɺ ͍͔ͭ͘ͷܗͰղ͍ͯΈͨɻ • ΦϒδΣΫτࢦͷߟ͑ํΛ͏·͘͏ͱɺ ҆શ͔֦ͭுੑΛߴ͘Ͱ͖Δɻ ˠ ࠓճͬͨͷ ɹ
ʮΦʔϓϯɾΫϩʔζυͷݪଇʯ • ಄ͷମૢΛ݉ͶͯɺറΓϓϨΠΛͯ͠ΈΑ͏! ΏΔ8FCࡳຈ
·ͱΊ • ͷ͚ํɺؔ৺ͷɺ ࠷ॳ͍͠ɻ • ʮ͜ͷਓ(Ϋϥε)ԿΛ͍ͬͯΔ͖͔ʯ ʮ͜ͷਓ(Ϋϥε)ʹԿΛͬͯཉ͍͔͠ʯ ਓ(Ϋϥε)ͷؾ࣋ͪʹͳͬͯߟ͑Δɻ • TDD
(ςετۦಈ։ൃ) ΛΔͱɺ ʮΫϥεʹ͍͔͚ͳ͕Βʯ։ൃͰ͖Δɻ ΏΔ8FCࡳຈ
࣍ճ༧ࠂ? • (PHPͰ)TDDΛͬͯΈΔ? ΏΔ8FCࡳຈ
end ΏΔ8FCࡳຈ