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
リファクタリング・チャレンジ リバーシ編
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yuki Yasoshima
May 16, 2020
Programming
210
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
リファクタリング・チャレンジ リバーシ編
Yuki Yasoshima
May 16, 2020
More Decks by Yuki Yasoshima
See All by Yuki Yasoshima
空間オーディオの活用
objectiveaudio
0
190
Swift Concurrency - 状態監視の罠
objectiveaudio
2
840
Swift Concurrencyとレースコンディション
objectiveaudio
2
810
モーダルの遷移を理解する
objectiveaudio
4
2.8k
オーディオ波形を表示するために知っておくべきこと
objectiveaudio
0
1.1k
AVAudioEngineでリアルタイムレンダリング
objectiveaudio
1
940
UIKitは2度ベルを鳴らす
objectiveaudio
0
360
iOSDC2018.pdf
objectiveaudio
1
2.4k
Objective-C++を使ってMRCで快適に開発する
objectiveaudio
0
24k
Other Decks in Programming
See All in Programming
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
410
AIエージェントで 変わるAndroid開発環境
takahirom
2
710
自作OSでスライド発表する
uyuki234
1
3.9k
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
530
act1-costs.pdf
sumedhbala
0
240
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
220
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
190
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
0
280
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
First, design no harm
axbom
PRO
2
1.2k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Balancing Empowerment & Direction
lara
6
1.2k
Navigating Team Friction
lara
192
16k
Building Applications with DynamoDB
mza
96
7.1k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
230
Google's AI Overviews - The New Search
badams
0
1.1k
Transcript
:VLJ:BTPTIJNB!ZBTP@TBO ϦϑΝΫλϦϯάɾνϟϨϯδ Ϧόʔγฤ IUUQTHJUIVCDPNPCKFDUJWFBVEJPSFWFSTJJPT
ԿΛϦϑΝΫλϦϯά͢Δͷ͔ w ͦΜͳʹ'BUͰͳ͍ͷͰʁ w ήʔϜͷίʔυͱͯͪ͠ΌΜͱཧ͞Ε͍ͯͳ͍ํ͕ʁ w ࣌ؒ࣠ํͷঢ়ଶཧ͕࠷ॏཁ w ઃܭύλʔϯΏΔ;ΘͰ w
֎෦ϥΠϒϥϦΘͳ͍ɻ7JFXʹखΛ͚ͭͳ͍
Ͳ͏ͬͯίʔυΛཧ͢Δ͔ w ίʔυΛ͋Δ͖ܗʹ͢ΔʢύλʔϯʹΊΔͷͰͳ͍ʣ w ᐆດ͞Λͳ͘͢ʢܕؔͷ࡞ΓํͳͲʣ w ҙຯ͕Θ͔ΔΑ͏ʹ͢Δʢ໊લͷ͚ํɺॲཧͷྲྀΕͳͲʣ w ͭΛղܾ͢Εผͷղܾ͘͢͠ͳΔ w
Ͳ͜·ͰΔ͔ཧͱ࣌ؒͱͷ݉Ͷ߹͍
ঢ়ଶͷཧ
େ·͔ͳঢ়ଶભҠ ήʔϜ݁Ռ ։࢝ 6*ͪ ૢ࡞ͪ ύεͪ ஔத Ϧηοτ MBVODIJOH QBTTJOH
PQFSBUJOH QMBDJOH SFTVMU ή ʔ Ϝ ऴ ྃ ήʔϜத ४උྃ ࣍ͷϓϨʔϠ͚ͩ ஔ͚ͳ͍ ύε͢Δ ϓϨʔϠަ ஔ͘ ͲͪΒ ஔ͚ͳ͍ ϓϨʔϠަ
ήʔϜͷঢ়ଶΛFOVNͰఆٛ enum State { case launching(side: Side) case operating(side: Side,
player: Player) case passing(side: Side) case placing(side: Side, positions: [Position]) case result(Result) case resetting, branching, next } w ڞ༻ܕͷFOVNͳΒ֤εςʔτ͝ͱʹඞཁͳ͚ͩΛ࣋ͯΔ
શମͷߏ
Ϋϥεߏ 7JFX$POUSPMMFS 1SFTFOUFS *OUFSBDUPS ݺͼग़͠ ݺͼग़͠ ௨ ௨ %BUB4UPSF อଘ
ಡΈࠐΈ w *OUFSBDUPSήʔϜͷঢ়ଶΛཧɻΞϓϦͷத৺ w 1SFTFOUFS*OUFSBDUPSͱ7$ͷڮ͠
ΦϒδΣΫτͷࢀর 7JFX$POUSPMMFS 1SFTFOUFS *OUFSBDUPS 4USPOH 8FBL w ສ͕Ұ7$͕κϯϏʹͳͬͯ*OUFSBDUPSͱܨ͕ͬͯͳ͚Ε༨ܭͳΠϕϯτ ΛແࢹͰ͖Δ γϯάϧτϯ
ࡉ͔͍ίʔυͷཧͷྫ
OFYU5VSO ϦϑΝΫλϦϯάલ func nextTurn() { guard var turn = self.turn
else { return } turn.flip() if validMoves(for: turn).isEmpty { if validMoves(for: turn.flipped).isEmpty { self.turn = nil // ...ॲཧ͍Ζ͍Ζ } else { self.turn = turn // ...ॲཧ͍Ζ͍Ζ } } else { self.turn = turn // ...ॲཧ͍Ζ͍Ζ } } w UVSO͕OJMͰདྷͯྑ͍ͷ͔ʁ w UVSOͷঢ়ଶ͕Θ͔Γʹ͍͘ w ذͨ͠ޙͷॲཧ͕ଟ͍
OFYU5VSO ϦϑΝΫλϦϯάத w UVSOΛTJEFʹͯ͠OJMΛ࠷ ॳ͔Βআ֎ w DVSSFOUͱOFYUʹ͚Δ w CPBSEͰWBMJE.PWFT w
ذͨ͠ޙͷॲཧ࣍ͷ εςʔτΛฦ͚ͩ͢ func nextTurnState(from currentSide: Side) -> State { let nextSide = currentSide.flipped if board.validMoves(for: nextSide).isEmpty { if board.validMoves(for: currentSide).isEmpty { return .result(board.result()) } else { return .passing(side: nextSide) } } else { return .operating(side: nextSide, player: player(for: nextSide)) } }
OFYU5VSO ϦϑΝΫλϦϯάޙ w WBMJE.PWFTJT&NQUZ ΛDBO1MBDFʹஔ͖͑ w ωετΛઙ͘͢Δ func nextTurnState(from currentSide:
Side) -> State { let nextSide = currentSide.flipped if board.canPlace(for: nextSide) { return .operating(side: nextSide, player: player(for: nextSide)) } else if board.canPlace(for: currentSide) { return .passing(side: nextSide) } else { return .resulting(board.result()) } }
·ͱΊ w Կͳ͘ͱঢ়ଶཧ w ঢ়ଶ͕ཧͰ͖ΕߟྀෆΛݟ͚͍ͭ͢ w ᐆດ͞Λল͘ɺҙຯ͕௨͡Α͏ʹ͢Δ w 7JFX$POUSPMMFS7JFXΛཧ͢Δ͚ͩɻΞϓϦͷຊମผ IUUQTHJUIVCDPNPCKFDUJWFBVEJPSFWFSTJJPT