Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
170
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
450
Amazon Q Developer CLI でゲームと Amplify アプリを作ってみた #ゆるWeb札幌
tacck
PRO
0
39
ゆるWeb勉強会@札幌 #30 #ゆるWeb札幌
tacck
PRO
0
15
Flutter を始めよう! - Flutter の開発現場から
tacck
PRO
0
160
GitHub Actions で Flutter アプリの CI/CD をやってます #ゆるWeb札幌
tacck
PRO
0
320
ゆるWeb勉強会@札幌 #29 #ゆるWeb札幌
tacck
PRO
0
150
読んで学ぶ Amplify Gen2 / Amplify と CDK の関係を紐解く #jawsug_tokyo
tacck
PRO
1
520
はじめまして GoLang #cm_sapporo_study
tacck
PRO
0
150
Other Decks in Technology
See All in Technology
エンジニアリングをやめたくないので問い続ける
estie
2
1.1k
形式手法特論:CEGAR を用いたモデル検査の状態空間削減 #kernelvm / Kernel VM Study Hokuriku Part 8
ytaka23
2
460
文字列の並び順 / Unicode Collation
tmtms
3
540
AIと二人三脚で育てた、個人開発アプリグロース術
zozotech
PRO
1
710
SSO方式とJumpアカウント方式の比較と設計方針
yuobayashi
7
600
regrowth_tokyo_2025_securityagent
hiashisan
0
220
[JAWS-UG 横浜支部 #91]DevOps Agent vs CloudWatch Investigations -比較と実践-
sh_fk2
1
250
世界最速級 memcached 互換サーバー作った
yasukata
0
330
30分であなたをOmniのファンにしてみせます~分析画面のクリック操作をそのままコード化できるAI-ReadyなBIツール~
sagara
0
120
Sansanが実践する Platform EngineeringとSREの協創
sansantech
PRO
2
790
Overture Maps Foundationの3年を振り返る
moritoru
0
170
手動から自動へ、そしてその先へ
moritamasami
0
300
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6k
Making Projects Easy
brettharned
120
6.5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Being A Developer After 40
akosma
91
590k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Balancing Empowerment & Direction
lara
5
790
Automating Front-end Workflow
addyosmani
1371
200k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Building an army of robots
kneath
306
46k
Designing Experiences People Love
moore
143
24k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
Bash Introduction
62gerente
615
210k
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ࡳຈ