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
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
450
ゼロから始める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
730
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
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
670
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.6k
LLM Plugin for Node-REDの利用方法と開発について
404background
0
170
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
200
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
530
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
750
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.9k
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
320
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
120
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
130
さぁV100、メモリをお食べ・・・
nilpe
0
140
AIエージェントの隔離技術の徹底比較
kawayu
0
470
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Abbi's Birthday
coloredviolet
2
8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
230
Speed Design
sergeychernyshev
33
1.8k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
160
The agentic SEO stack - context over prompts
schlessera
0
800
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
We Have a Design System, Now What?
morganepeng
55
8.2k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
160
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ʣͱͯ͠ͷׂΛҙࣝ͠Α͏ ‣ ෦ͷॴ༗ؔʢ֊ؔʣΛҙࣝ͠Α͏ ‣ ඞཁ࠷খݶͷใͷอ࣋ͱΓऔΓΛҙࣝ͠Α͏
ൣғΛҙࣝͯ͠ ༷มߋʹڧ͍։ൃΛ "