Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
責務範囲を意識するというお話
Elvis Shi
October 03, 2017
Programming
6
2.2k
責務範囲を意識するというお話
Elvis Shi
October 03, 2017
Tweet
Share
More Decks by Elvis Shi
See All by Elvis Shi
偏見と妄想で語るスクリプト言語としての Swift / Swift as a Scripting Language
lovee
2
270
danger-swift-kantoku
lovee
1
130
Decimal、正しく使ってる? / Are you using Decimal correctly?
lovee
4
280
A story about me trying to make a router that manages when, how and which view to transit in a SwiftUI app
lovee
1
160
M1チップの脆弱性M1raclesを読み解く / About the vulnerability on M1 chip called M1racles
lovee
1
790
Demystify SwiftUI 要約 / Summary of Demystify SwiftUI
lovee
3
350
いいから `!` を使え! / Shut up and use `!` !
lovee
11
3.4k
SwiftUIにおける依存性逆転原則の戦略 / A strategy to import Dependency-Inversion-Principle in SwiftUI apps
lovee
3
430
CGAffineTransform はどう動いてるのか?〜Swift エンジニアのための線形代数〜 / How does CGAffineTransform work? ~A linearity lesson for Swift engineers~
lovee
0
220
Other Decks in Programming
See All in Programming
プログラミングを勉強したいと言われたら
yuba_4
0
420
もしも、 上司に鬼退治を命じられたら~プロジェクト計画編~
higuuu
0
290
[RailsConf 2022] The pitfalls of realtime-ification
palkan
0
240
Unity Localization で多言語対応実装しよう / xrdnk-yokohamaunity-lt10-20220513
xrdnk
0
160
競プロへの誘 -いざな-
u76ner
0
380
Loom is Blooming
josepaumard
3
560
Modern Web Apps with Spring Boot, Angular & TypeScript
toedter
12
14k
Cloud-Conference-Day-Spring Cloud + Spring Webflux: como desenvolver seu primeiro microsserviço reativo em Java?
kamilahsantos
1
150
インフラエンジニアの多様性と評価、またはキャリアへのつなげ方 / Careers as infrastructure engineers
katsuhisa91
0
540
Microsoft Teams の 会議アプリ開発のはじめかた / How to start Microsoft Teams app development
karamem0
0
1.7k
Learning DDD輪読会#4 / Learning DDD Book Club #4
suzushin54
1
150
Swift Concurrencyによる安全で快適な非同期処理
tattn
2
330
Featured
See All Featured
Music & Morning Musume
bryan
35
4.1k
jQuery: Nuts, Bolts and Bling
dougneiner
56
6.4k
No one is an island. Learnings from fostering a developers community.
thoeni
9
1.1k
Infographics Made Easy
chrislema
233
17k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
7
1k
GraphQLの誤解/rethinking-graphql
sonatard
24
6.2k
Art, The Web, and Tiny UX
lynnandtonic
280
17k
Optimizing for Happiness
mojombo
365
63k
The Most Common Mistakes in Cover Letters
jrick
PRO
4
24k
Teambox: Starting and Learning
jrom
121
7.6k
Three Pipe Problems
jasonvnalue
89
8.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
119
28k
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ʣͱͯ͠ͷׂΛҙࣝ͠Α͏ ‣ ෦ͷॴ༗ؔʢ֊ؔʣΛҙࣝ͠Α͏ ‣ ඞཁ࠷খݶͷใͷอ࣋ͱΓऔΓΛҙࣝ͠Α͏
ൣғΛҙࣝͯ͠ ༷มߋʹڧ͍։ൃΛ "