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
1.6k
PHPで FizzBuzz問題をやってみよう #ゆるWeb札幌
PHPでFizzBuzz問題を解いていく。
シンプルな解き方から、段階的にオブジェクト指向を取り入れてみる。
ゆるWeb勉強会@札幌 #4
#ゆるWeb札幌
Kihara, Takuya
PRO
March 30, 2019
Tweet
Share
More Decks by Kihara, Takuya
See All by Kihara, Takuya
それでは聞いてください「Impeller導入に失敗しました」 #FlutterKaigi #skia
tacck
PRO
0
140
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
290
Amazon Q Developer CLI でゲームと Amplify アプリを作ってみた #ゆるWeb札幌
tacck
PRO
0
37
ゆるWeb勉強会@札幌 #30 #ゆるWeb札幌
tacck
PRO
0
12
Flutter を始めよう! - Flutter の開発現場から
tacck
PRO
0
150
GitHub Actions で Flutter アプリの CI/CD をやってます #ゆるWeb札幌
tacck
PRO
0
280
ゆるWeb勉強会@札幌 #29 #ゆるWeb札幌
tacck
PRO
0
150
読んで学ぶ Amplify Gen2 / Amplify と CDK の関係を紐解く #jawsug_tokyo
tacck
PRO
1
510
はじめまして GoLang #cm_sapporo_study
tacck
PRO
0
140
Other Decks in Technology
See All in Technology
米軍Platform One / Black Pearlに学ぶ極限環境DevSecOps
jyoshise
2
510
Service Monitoring Platformについて
lycorptech_jp
PRO
0
310
【M3】攻めのセキュリティの実践!プロアクティブなセキュリティ対策の実践事例
axelmizu
0
170
LINEスキマニ/LINEバイトにおけるバックエンド開発
lycorptech_jp
PRO
0
330
持続可能なアクセシビリティ開発
azukiazusa1
6
270
Progressive Deliveryで支える!スケールする衛星コンステレーションの地上システム運用 / Ground Station Operation for Scalable Satellite Constellation by Progressive Delivery
iselegant
1
200
ECS組み込みのBlue/Greenデプロイを動かしてELB側の動きを観察してみる
yuki_ink
1
160
AI駆動開発を実現するためのアーキテクチャと取り組み
baseballyama
8
4.6k
組織の“見えない壁”を越えよ!エンタープライズシフトに必須な3つのPMの「在り方」変革 #pmconf2025
masakazu178
1
390
Rubyist入門: The Way to The Timeless Way of Programming
snoozer05
PRO
7
520
AIと自動化がもたらす業務効率化の実例: 反社チェック等の調査・業務プロセス自動化
enpipi
0
680
「O(n log(n))のパフォーマンス」の意味がわかるようになろう
dhirabayashi
0
200
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
40k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8k
RailsConf 2023
tenderlove
30
1.3k
Docker and Python
trallard
46
3.7k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Leading Effective Engineering Teams in the AI Era
addyosmani
8
1.1k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Rails Girls Zürich Keynote
gr2m
95
14k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.3k
A better future with KSS
kneath
239
18k
Context Engineering - Making Every Token Count
addyosmani
9
400
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.8k
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ࡳຈ