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
Fat ViewControllerを倒せ! 〜Cocoa MVC への道のり〜 / No M...
Search
Elvis Shi
May 30, 2020
Programming
0
840
Fat ViewControllerを倒せ! 〜Cocoa MVC への道のり〜 / No More Fat ViewController! ~The path to Cocoa MVC~
Elvis Shi
May 30, 2020
Tweet
Share
More Decks by Elvis Shi
See All by Elvis Shi
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
270
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
480
How did I build an Open-Source SwiftUI Toast Library
lovee
1
110
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
990
SwiftUIで二重スクロール作ってみた / When I tried to make a dual-scroll-ish view in SwiftUI
lovee
1
310
Observation のあれこれ / A brief introduction about Observation
lovee
3
390
ChatGPT 時代の勉強 / Learning under ChatGPT era
lovee
27
8.8k
属人化しない為の勉強会作り / To make tech meetups with less personal dependencies
lovee
0
320
偏見と妄想で語るスクリプト言語としての Swift / Swift as a Scripting Language
lovee
2
870
Other Decks in Programming
See All in Programming
코딩 에이전트 체크리스트: Claude Code ver.
nacyot
0
930
NPOでのDevinの活用
codeforeveryone
0
900
20250704_教育事業におけるアジャイルなデータ基盤構築
hanon52_
5
1.1k
What's new in AppKit on macOS 26
1024jp
0
150
Rails Frontend Evolution: It Was a Setup All Along
skryukov
0
280
AIエージェントはこう育てる - GitHub Copilot Agentとチームの共進化サイクル
koboriakira
0
760
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
mickey_kubo
1
240
「テストは愚直&&網羅的に書くほどよい」という誤解 / Test Smarter, Not Harder
munetoshi
0
200
DMMを支える決済基盤の技術的負債にどう立ち向かうか / Addressing Technical Debt in Payment Infrastructure
yoshiyoshifujii
3
410
MCPを使ってイベントソーシングのAIコーディングを効率化する / Streamlining Event Sourcing AI Coding with MCP
tomohisa
0
170
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
360
「App Intent」よくわからんけどすごい!
rinngo0302
1
100
Featured
See All Featured
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.7k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Testing 201, or: Great Expectations
jmmastey
43
7.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Code Review Best Practice
trishagee
69
19k
Balancing Empowerment & Direction
lara
1
450
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Transcript
'BU7JFX$POUSPMMFSΛͤʂ ʙ$PDPB.7$ͷಓͷΓʙ f o r 4X J G U
;P PN J O Ԇ ઓ
} var employedBy = "YUMEMI Inc." var job = "iOS
Tech Lead" var favoriteLanguage = "Swift" var twitter = "@lovee" var qiita = "lovee" var github = "el-hoshino" var additionalInfo = """ Twitter෮׆ͨ͠ʂ """ final class Me: Developable, Talkable {
IUUQTHJUIVCDPNSFGBDUPSJOHDIBMMFOHFSFWFSTJJPT
طଘϓϩδΣΫτͷ w ϩδοΫ͕༷ʑͳॴʹࠞࡏ͍ͯ͠Δ w ϦηοτϩδοΫ͕BoardViewʹ w ਐߦϩδοΫ͕ViewControllerʹ w ൫αΠζϩδοΫ͕BoardViewʹ w
ΞχϝʔγϣϯϩδοΫ͕ViewControllerʹ
$PDPB.7$ͷߏ 7JFX$POUSPMMFS .PEFM 7JFX ߦಈ ૢ࡞ ௨ ߋ৽
$PDPB.7$ͷߏ w .PEFMɿήʔϜϩδοΫͷॲཧ w 7JFXɿը໘ඳըͱɺϢʔβΞΫγϣϯͷड w 7JFX$POUSPMMFSɿ7JFXͱ.PEFMͷՍ͚ڮ
$PDPB.7$ͷߏ w (BNF&OHJOFɿήʔϜϩδοΫͷॲཧ w #PBSE7JFXɿը໘ඳըͱɺϢʔβΞΫγϣϯͷड w 7JFX$POUSPMMFSɿ#PBSE7JFXͱ(BNF&OHJOFͷ Ս͚ڮ
मਖ਼ํʢίϯϙʔωϯτʣ w (BNF&OHJOFʹશͯͷήʔϜϩδοΫΛू w 7JFX$POUSPMMFSͱ#PBSE7JFXͷήʔϜϩδοΫ Λશͯ(BNF&OHJOFʹҠಈ w #PBSE7JFXʹඳըॲཧͷΈΛ͢ w ήʔϜϧʔϧʹґଘͤͣɺݴΘΕͨ௨Γʹ͢Δ
͚ͩͷඳըϩδοΫ w طଘͷॲཧίʔυࣗମ࠷খݶͷमਖ਼Ͱ
मਖ਼ํʢσʔλϑϩʔʣ w ॲཧͷྲྀΕΛҰຊಓԽ w BoardView͕ϢʔβΞΫγϣϯΛड͚ͨΒ@IBAction ͘͠delegate௨ͯ͠ViewControllerʹୡ w ViewController͕ΒͬͨϢʔβΞΫγϣϯΛݩʹ GameEngineΛૢ࡞ w
GameEngine͕ಠࣗઐ༻εϨουͰૢ࡞Λॲཧ͠ɺͦͷ݁Ռ ΛAnyPublisherͰViewControllerʹ௨ w ViewController͕Βͬͨ݁ՌΛݩʹϝΠϯεϨουͰ BoardViewΛߋ৽ w BoardView͕ͦͷ݁Ռͷ௨Γʹඳը
$PDPB.7$ͷߏ 7JFX$POUSPMMFS .PEFM 7JFX ૢ࡞ ௨ ߋ৽ ߦಈ
$PDPB.7$ͷߏ 7JFX$POUSPMMFS (BNF&OHJOF #PBSE7JFX ૢ࡞ ௨ ߋ৽ ߦಈ
$PDPB.7$ͷߏ 7JFX$POUSPMMFS (BNF&OHJOF #PBSE7JFX reset() setPlayer(_:for:) getPlayer(for:)-> placeDisk(at:) nextMove() currentBoard{get}
saveGame() loadGame() $isThinking $changedDisks $currentTurn $currentCount boardSize{set} changeDisks(at:to:) reset(with:) @pressReset(_:) @changePlayerControl(_:) .didSelectCell(at:) $AnyPublisherͱͯ͠ฦ͞ΕΔ @@IBActionΛ௨ͯ͠ݺΕΔ .delegateΛ௨ͯ͠ݺΕΔ
%&.0
ল w ෦࡞ͬͯॲཧΛҠಈ͢Δલʹɺ͏গ͠ϝιουΛ ࡉ͔͘Γग़͖ͩͬͨ͢ w ॲཧͷҠಈͱϝιουͷΓग़͠ͱςετͷ࣮ͷ ಉ࣌ฒߦ͕ڧ͍ΒΕͯେมͩͬͨ w ͞Βʹͦͷ͍ͤͰ్த͔Βςετॻ͘ͷఘΊͨ
ͦͷଞ w $PDPB.7$ͷߏͷઆ໌͚ͩͳͷͰɺGameEngine ͕·ͩগʑ'BU w GameEngineΛ७ਮؔԽͯ͠ɺ֤छঢ়ଶΛ͞Βʹ GameStoreͱ͔ʹΓग़ͤߋʹ͖Ε͍ʹͳΔ w ͬͺ6*,JUʹͱͬͯ$PDPB.7$ָʂ w
protocolͰ@Published<Value>ͱ͔ΛએݴͰ͖Δ Α͏ʹͯ͠΄͍͠ w ࠓAnyPublisher<Value, Never> { get }Ͱ ఆٛ͢Δ͔͠ͳ͍ͷ͕ඍົʹਏ͍