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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Elvis Shi
October 03, 2017
Programming
3.2k
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
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
460
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
150
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
390
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
740
How did I build an Open-Source SwiftUI Toast Library
lovee
1
170
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
380
Observation のあれこれ / A brief introduction about Observation
lovee
3
440
ChatGPT 時代の勉強 / Learning under ChatGPT era
lovee
27
9k
Other Decks in Programming
See All in Programming
ふつうのFeature Flag実践入門
irof
8
4.2k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
750
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
930
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
RTSPクライアントを自作してみた話
simotin13
0
630
New "Type" system on PicoRuby
pocke
1
1k
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
800
Vite+ Unified Toolchain for the Web
naokihaba
0
340
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
200
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
170
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
190
Featured
See All Featured
Designing for Timeless Needs
cassininazir
1
260
The Cost Of JavaScript in 2023
addyosmani
55
10k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Fireside Chat
paigeccino
42
4k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
190
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
300
AI: The stuff that nobody shows you
jnunemaker
PRO
8
730
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
450
Building Adaptive Systems
keathley
44
3.1k
Being A Developer After 40
akosma
91
590k
Google's AI Overviews - The New Search
badams
0
1k
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ʣͱͯ͠ͷׂΛҙࣝ͠Α͏ ‣ ෦ͷॴ༗ؔʢ֊ؔʣΛҙࣝ͠Α͏ ‣ ඞཁ࠷খݶͷใͷอ࣋ͱΓऔΓΛҙࣝ͠Α͏
ൣғΛҙࣝͯ͠ ༷มߋʹڧ͍։ൃΛ "