Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
責務範囲を意識するというお話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Elvis Shi
October 03, 2017
Programming
3.3k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
責務範囲を意識するというお話
Elvis Shi
October 03, 2017
More Decks by Elvis Shi
See All by Elvis Shi
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
540
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
540
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
160
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
400
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
770
How did I build an Open-Source SwiftUI Toast Library
lovee
1
180
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
1.3k
SwiftUIで二重スクロール作ってみた / When I tried to make a dual-scroll-ish view in SwiftUI
lovee
1
390
Observation のあれこれ / A brief introduction about Observation
lovee
3
450
Other Decks in Programming
See All in Programming
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
130
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
700
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
120
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
5.9k
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
4
1.1k
Deep dive into the select statement (GopherCon UK)
jespino
0
170
ALB ログから Trace を気合で繋げる技術
fohte
7
880
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
ハーネス設計入門 〜プロンプト、コンテキストの次〜
kinopeee
56
37k
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
150
AIエージェント時代のコードレビューを設計する
nogu66
6
2.6k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
220
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Speed Design
sergeychernyshev
33
2.1k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
270
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Designing Powerful Visuals for Engaging Learning
tmiket
1
540
Paper Plane
katiecoart
PRO
3
53k
Google's AI Overviews - The New Search
badams
0
1.6k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
820
ラッコキーワード サービス紹介資料
rakko
1
4.8M
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Transcript
ൣғΛҙࣝ͢Δͱ͍͏͓ for Զίϯ7PM%BZ
override init() { super.init() emplyedBy = "YUMEMI Inc." job =
"iOS Developer" twitter = "@lovee" qiita = "lovee" github = "el-hoshino" additionalInfo = "స৬͠·ͨ͠ʂ" class Speaker: Developer { } }
.PEFMɺ7JFXͱ$POUSPMMFS Λ࡞Ε͕͚ΒΕͨͬ ͯ͜ͱʹͳΔΜͰ͔͢ʁ
.PEFMɺ7JFXͱ$POUSPMMFSΛ࡞Ε ͕͚ΒΕͨͬͯ͜ͱʹͳΔΜͰ͔͢ʁ ͦ͏ͱݶΒͳ͍ ͦͦʮ࡞ͬͨʯͱ ʮਖ਼͘͠࡞ͬͨʯ ผ֓೦
ຊʹ͚ΒΕͯΔͷ͔ʁ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad()
view.backgroundColor = UIColor(hue: 0.5, saturation: 1, brightness: 0.9, alpha: 1) } } $POUSPMMFS͕ϏδϡΞϧΛ ઃఆ͍ͯ͠Δ!
ઃܭͱͦΕΒͷʢͬ͘͟Γʣ ‣ .7$ ‣ .PEFMɿϏδωεϩδοΫ ‣ 7JFXɿը໘ग़ྗ ‣ $POUSPMMFSɿϢʔβೖྗ ‣
.77. ‣ .PEFMɿϏδωεϩδοΫ ‣ 7JFXɿը໘ೖग़ྗ ‣ 7JFX.PEFMɿσʔλόΠϯσΟϯά ‣ FUD
ઃܭͱͦΕΒͷʢͬ͘͟Γʣ ‣ .7$ ‣ 7JFXɿը໘ग़ྗ ‣ .77. ‣ 7JFXɿը໘ೖग़ྗ ۩ମతͳϏδϡΞϧදݱ
7JFXͷׂ
ຊʹ͚ΒΕͯΔͷ͔ʁ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad()
view.backgroundColor = UIColor(hue: 0.5, saturation: 1, brightness: 0.9, alpha: 1) } } $POUSPMMFS͕ϏδϡΞϧΛ ઃఆ͍ͯ͠Δ!
ຊ͜͏͖͢͡Όͳ͍ͷ͔ʁ class ViewController: UIViewController { private lazy var _view =
View() override func loadView() { self.view = _view } override func viewDidLoad() { super.viewDidLoad() _view.setupVisual() } } class View: UIView { func setupVisual() { self.backgroundColor = UIColor(hue: 0.5, saturation: 1, brightness: 0.9, alpha: 1) } } $POUSPMMFS͕ϏδϡΞϧΛ ઃఆ͍ͯ͠ͳ͍" ϏδϡΞϧͷઃఆશͯ Ϗϡʔʹू͞ΕΔ
Λҙࣝ͢Δͱݴ͏ͷ 7JFX.PEFMͱͯ͠ͷׂΛ ҙࣝ͢Δ͜ͱ
Λҙࣝ͢Δͱݴ͏ͷ 7JFX.PEFMͱͯ͠ͷׂΛ ҙࣝ͢Δ͜ͱ ͚ͩͰͳ͍
https://qiita.com/lovee/items/555a5b76097347aa2367
ंͷΨεܽ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } } class Car { let model: String var owner: Person? init(_ model: String) { self.model = model } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia)
ंͷΨεܽ Ψεܽ څ༉͠ʹߦ͘ څ༉
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } } class Car { let model: String var owner: Person? init(_ model: String) { self.model = model } func outOfGasoline() { // ??? } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // ???
ंͷΨεܽ Ψεܽ څ༉͠ʹߦ͘ څ༉ - ࠷دΓͷΨιϦϯελϯυ͕Ͳ͜ʹ͋ͬͯͲ͏ߦ͔͘ʁ - څ༉ελοϑʹͲ͏͑Δ͔ʁ - ࢧ͍Ͳ͏͢Δ͔ʁ
- FUD ͜ΕΒͷ ॴ༗ऀ͕ղܾ͢Δ ඞཁ͕͋Δʂ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } class Car { let model: String var owner: Person? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner?.buyGasoline() } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy some gasoline!
ंͷΨεܽ Ψεܽ ॴ༗ऀʹ څ༉ͤ͞Δ څ༉͠ʹߦ͘ څ༉ څ༉͕ ऴΘΔ Ψεܽղܾ -
શͯͷॲཧं͕ߦͳ͍ͬͯΔ - ॴ༗ऀंʹͬऔΒΕͯ͠·͏ - ͷͪͷ4LZOFUʢେӕʣ ͜ΕΒͷ ͋͘·Ͱॴ༗ऀ͕ࣗ ղܾ͖͢ʂ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } extension Person: CarOwner { func carDidRunOutOfGasoline(_ car: Car) { self.buyGasoline() } } protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) } class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy some gasoline!
ंͷΨεܽ Ψεܽ ॴ༗ऀʹ ΒͤΔ څ༉͠ʹߦ͘ څ༉ څ༉͕ ऴΘΔ Ψεܽղܾ -
શͯͷॲཧॴ༗ऀ͕ߦͳ͍ͬͯΔ - ॴ༗ऀंʹͬऔΒΕͯ͠·Θͳ͍ - ॴ༗ऀͷؾ࣋ͪͰങ͍͑Δ͜ͱՄೳʂ
ंͷΨεܽ Ψεܽ ॴ༗ऀʹ ΒͤΔ σΟʔϥʔʹߦ͘ ങ͍͑Δ ৽͍͠ंΛೖख - શͯͷॲཧॴ༗ऀ͕ߦͳ͍ͬͯΔ -
ॴ༗ऀंʹͬऔΒΕͯ͠·Θͳ͍ - ॴ༗ऀͷؾ࣋ͪͰങ͍͑Δ͜ͱՄೳʂ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } extension Person: CarOwner { func carDidRunOutOfGasoline(_ car: Car) { self.buyCar(Car("488GTB")) } } protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) } class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy Ferrari 488 GTB!
Λҙࣝ͢Δͱݴ͏ͷ ෦ͷॴ༗ؔʢ֊ؔʣΛ ҙࣝ͢Δ͜ͱͰ͋Δ
ंͷΨεܽ class Person { var car: Car? func buyCar(_ car:
Car) { self.car = car car.owner = self } func buyGasoline() { print("Buy some gasoline!") } } extension Person: CarOwner { func carDidRunOutOfGasoline(_ car: Car) { self.buyCar(Car("488GTB")) } } protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) } class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } let maki = Person() let ferrari458Italia = Car("458Italia") maki.buyCar(ferrari458Italia) maki.car?.outOfGasoline() // Buy Ferrari 488 GTB!
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ं͕ΦʔφʔͷߦಈʹΛ࣋ͯ ͳ͍ʹ͕ͳ͍ - ͔ͩΒΦʔφʔΛॴ༗ͯ͠ ͍͚ͳ͍ - ͦΕͰΦʔφʔΛಈ͔͢ ͜ͱͰ͖ͳ͍ - Ͱ$BS0XOFSͱͯ͠ಈ͚Δ ͜ͱ͍ͬͯΔ - ඞཁͳ࣌ʹΦʔφʔʹॲཧΛ ҠৡͰ͖Δ
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ंΦʔφʔΛॴ༗͍ͯ͠ͳ͍ - ΦʔφʔΛऑࢀর͠ͳ͚ΕͳΒͳ͍ - ڧࢀর͏͔ɺऑࢀর͏͔ͷج४ɺ ͜ͷΦϒδΣΫτΛॴ༗͍ͯ͠Δ͔Ͳ͏͔ - ॴ༗ؔҰํ௨ߦͳͷͰɺ॥ࢀর ͷճආͰ͖Δ
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ໋໊িಥͷճආ - ͔͢͠Δͱಉ໊͡લͷผͷϝιου͕ ͋Δ͔͠Εͳ͍ - Ҡৡݩ୭͔ΛผͰ͖ΔΑ͏ʹ - Ҡৡઌ͕ಉ͡ΫϥεͷෳΦϒδΣΫτ ࣋ͬͯΔ͔͠Εͳ͍
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarOwner: class { func carDidRunOutOfGasoline(_ car: Car) }
class Car { let model: String weak var owner: CarOwner? init(_ model: String) { self.model = model } func outOfGasoline() { self.owner? .carDidRunOutOfGasoline(self) } } - ࣗࣗΛ࿐ͨ͘͠ͳ͍߹Ͳ͏͠Α͏# - ྫ͑Ҡৡઌࣗͷॴ༗ऀ͡Όͳ͍͔ ͠Εͳ͍߹ - యܕతͳύλʔϯ7JFXͷ%BUB4PVSDF - ͜͜ͰंͷΨϨʔδΛྫʹ
ඞཁ࠷খݶͷ͜ͱ͚ͩΛΖ͏ protocol CarGarage: class { func carNeedsToPark(_ car: CarGarageUser) }
protocol CarGarageUser: class { var garageUserModel: String { get } } class Car { let model: String weak var garage: CarGarage? // ... func parkToGarage() { self.garage?.carNeedsToPark(self) } } extension Car: CarGarageUser { var garageUserModel: String { return self.model } } ࣗࣗΛ$BSͷΘΓʹ $BS(BSBHF6TFSͱͯ͠࿐ $BS(BSBHF͕ඞཁͦ͏ͳͷ͚ͩΛ $BS(BSBHF6TFSͱͯ͠ఏڙ
Λҙࣝ͢Δͱݴ͏ͷ ඞཁ࠷খݶͷใΛΓͳ͕Β ඞཁ࠷খݶͷใΛ࿐͢ΔͷΛ ҙࣝ͢Δ͜ͱͰ͋Δ
·ͱΊ ‣ ൣғΛҙࣝ͠Α͏ ‣ ෦ʢ7JFX.PEFMʣͱͯ͠ͷׂΛҙࣝ͠Α͏ ‣ ෦ͷॴ༗ؔʢ֊ؔʣΛҙࣝ͠Α͏ ‣ ඞཁ࠷খݶͷใͷอ࣋ͱΓऔΓΛҙࣝ͠Α͏
ൣғΛҙࣝͯ͠ ༷มߋʹڧ͍։ൃΛ "