Slide 1

Slide 1 text

Swift 4Ͱߦ͏DTOͱDAOͷ૬ޓม׵ DevSapษڧձ 17/09/23

Slide 2

Slide 2 text

ੁݪ ༞ @yusuga_

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

VO, DTO, POSO, DAOͱ͸

Slide 5

Slide 5 text

VO, DTO, POSO, DAOͱ͸ 4 VO (Value Object) 4 getterͷΈ 4 ෆม VO, DTO, POSO, DAO, Entity ͷҧ͍

Slide 6

Slide 6 text

VO, DTO, POSO, DAOͱ͸ 4 DTO (Data Transfer Object) 4 VO + setter 4 Մมɻ֎͔ΒมߋՄೳ 4 ҟͳΔϨΠϠʔؒʢϞσϧ૚ɺϏϡʔ૚ͳͲʣͰσʔλ Λड͚౉͢ͷʹ࢖͏ VO, DTO, POSO, DAO, Entity ͷҧ͍

Slide 7

Slide 7 text

VO, DTO, POSO, DAOͱ͸ 4 POSO (Plain Old Swift Object) 4 VO΍DTOͷੑ࣭Λ࣋ͭ 4 Swift struct, enum 4 ໋໊ͷ༝དྷ͸POJO(Plain Old Java Object) VO, DTO, POSO, DAO, Entity ͷҧ͍

Slide 8

Slide 8 text

VO, DTO, POSO, DAOͱ͸ 4 DAO (Data Access Object) 4 DBʹΞΫηε͠஋Λߋ৽ͨ͠Γ݁ՌΛฦ͢ VO, DTO, POSO, DAO, Entity ͷҧ͍

Slide 9

Slide 9 text

஌͖͔͚ͬͨͬ 4 try! Swift Tokyo 2017 4 σʔλϨΠϠΛ෼཭͢Δ (LT) 4 ҿΈձͰ΋࿩୊ʹ

Slide 10

Slide 10 text

ͦ͏͍͑͹ 4 Realm.RLMObject (RealmSwift.Object) 1. ελϯυΞϩʔϯͷRLMObject 2. Realm(σʔλϕʔε)ʹඥ͚ͮΒΕ͍ͯΔRLMObject RealmͰελϯυΞϩʔϯͷRLMObjectΛ׆༻͢Δ

Slide 11

Slide 11 text

ͦ͏͍͑͹ 4 Realm.RLMObject (RealmSwift.Object) 1. ελϯυΞϩʔϯͷRLMObject 4 DTO 2. Realm(σʔλϕʔε)ʹඥ͚ͮΒΕ͍ͯΔRLMObject 4 DAO RealmͰελϯυΞϩʔϯͷRLMObjectΛ׆༻͢Δ

Slide 12

Slide 12 text

ҟͳΔϨΠϠʔؒͰͷσʔλͷड͚౉͠ MVC→MVP→MVVM→Fluxͷ࣮૷ͷҧ͍Λൺֱͯ͠ΈΔ

Slide 13

Slide 13 text

DAOΛ౉͢΂͖Ͱ͸ͳ͍ 4 Ͳ͜ͰͰ΋σʔλϕʔεͷߋ৽͕Մೳʹͳͬͯ͠·͏

Slide 14

Slide 14 text

DAOΛ౉͢΂͖Ͱ͸ͳ͍ 4 Ͳ͜ͰͰ΋σʔλϕʔεͷߋ৽͕Մೳʹͳͬͯ͠·͏ 4 Realmʹݶͬͯ͸ɺDBʹඥ͍ͮͨObjectͷߋ৽ʹ͸τϥ ϯβΫγϣϯ͕ඞཁͰ͋ͬͨΓɺεϨουΛ·ͨ͛ͳ͍ͱ ͍͏੍໿͕͋Δ

Slide 15

Slide 15 text

DAOΛ౉͢΂͖Ͱ͸ͳ͍ 4 Ͳ͜ͰͰ΋σʔλϕʔεͷߋ৽͕Մೳʹͳͬͯ͠·͏ 4 Realmʹݶͬͯ͸ɺDBʹඥ͍ͮͨObjectͷߋ৽ʹ͸τϥ ϯβΫγϣϯ͕ඞཁͰ͋ͬͨΓɺεϨουΛ·ͨ͛ͳ͍ͱ ͍͏੍໿͕͋Δ 4 ͜ΕΒͷ࢓༷ΛͲ͏΍ͬͯप஌ͤ͞Δ͔ʁ

Slide 16

Slide 16 text

DAOΛ౉͢΂͖Ͱ͸ͳ͍ 4 Ͳ͜ͰͰ΋σʔλϕʔεͷߋ৽͕Մೳʹͳͬͯ͠·͏ 4 Realmʹݶͬͯ͸ɺDBʹඥ͍ͮͨObjectͷߋ৽ʹ͸τϥ ϯβΫγϣϯ͕ඞཁͰ͋ͬͨΓɺεϨουΛ·ͨ͛ͳ͍ͱ ͍͏੍໿͕͋Δ 4 ͜ΕΒͷ࢓༷ΛͲ͏΍ͬͯप஌ͤ͞Δ͔ʁ 4 ࢓༷ॻ/ӡ༻ϧʔϧ → ❌

Slide 17

Slide 17 text

DAOΛ౉͢΂͖Ͱ͸ͳ͍ 4 Ͳ͜ͰͰ΋σʔλϕʔεͷߋ৽͕Մೳʹͳͬͯ͠·͏ 4 Realmʹݶͬͯ͸ɺDBʹඥ͍ͮͨObjectͷߋ৽ʹ͸τϥ ϯβΫγϣϯ͕ඞཁͰ͋ͬͨΓɺεϨουΛ·ͨ͛ͳ͍ͱ ͍͏੍໿͕͋Δ 4 ͜ΕΒͷ࢓༷ΛͲ͏΍ͬͯप஌ͤ͞Δ͔ʁ 4 ࢓༷ॻ/ӡ༻ϧʔϧ → ❌ 4 VO, DTOΛ౉͠ϓϩάϥϜతʹ੍ݶͤ͞Δ΂͖

Slide 18

Slide 18 text

࣮૷: Objective-C࣌୅

Slide 19

Slide 19 text

࣮૷: Objective-C࣌୅ 4 Realm-JSONͷdeepCopy()Λ࢖༻

Slide 20

Slide 20 text

࣮૷: Objective-C࣌୅ 4 Realm-JSONͷdeepCopy()Λ࢖༻ 4 த਎͸Realm.RLMPropertyΛར༻͠ϓϩύςΟΛղੳ ͠ɺ࠶ؼతʹίϐʔ

Slide 21

Slide 21 text

// 1. ΦϒδΣΫτΛ࡞੒͢Δ Person *author = [[Person alloc] init]; author.name = @"David Foster Wallace"; // 2. ΦϒδΣΫτΛRealmʹ௥Ճ͢Δ [realm beginWriteTransaction]; [realm addObject:author]; [realm commitWriteTransaction]; // author͸DAOʹͳΔ // 3. อଘͨ͠authorΛίϐʔ Person *copiedAuthor = [author deepcopy]; XCTAssertNil(copiedAuthor.realm); // true XCTAssertEqualObjects(author, copiedAuthor); // true // 4. τϥϯβΫγϣϯ͕ͳͯ͘΋มߋՄೳ copiedAuthor = @"other name"; // DTO

Slide 22

Slide 22 text

4 ৄ͘͠͸ɺRealmͰελϯυΞϩʔϯͷRLMObjectΛ׆༻ ͢ΔΛ͝ཡ͍ͩ͘͞ɻ

Slide 23

Slide 23 text

Objective-C࣌୅ͷऴᖼ 4 RealmSwiftͷొ৔

Slide 24

Slide 24 text

Objective-C࣌୅ͷऴᖼ 4 RealmSwiftͷొ৔ 4 RealmSwift.Object͸RLMObjectBaseΛܧঝ

Slide 25

Slide 25 text

Objective-C࣌୅ͷऴᖼ 4 RealmSwiftͷొ৔ 4 RealmSwift.Object͸RLMObjectBaseΛܧঝ 4 Realm-JSONͷdeepCopy()͕࢖͑ͳ͘ͳΔ

Slide 26

Slide 26 text

Objective-C࣌୅ͷऴᖼ 4 RealmSwiftͷొ৔ 4 RealmSwift.Object͸RLMObjectBaseΛܧঝ 4 Realm-JSONͷdeepCopy()͕࢖͑ͳ͘ͳΔ 4 ౰࣌͸୅ସͳ͠

Slide 27

Slide 27 text

࣮૷: Swift 3࣌୅

Slide 28

Slide 28 text

࣮૷: Swift 3࣌୅ 4 ObjectMapperΛ࢖༻

Slide 29

Slide 29 text

࣮૷: Swift 3࣌୅ 4 ObjectMapperΛ࢖༻ 4 Object to JSON / JSON to Object͕Մೳ

Slide 30

Slide 30 text

࣮૷: Swift 3࣌୅ 4 ObjectMapperΛ࢖༻ 4 Object to JSON / JSON to Object͕Մೳ 4 SwiftͷStructʹ΋ద༻Ͱ͖Δʂ

Slide 31

Slide 31 text

࡞ͬͨ TransformableObject

Slide 32

Slide 32 text

TransformableObject public protocol TransformableObject { associatedtype TransformedObject } public extension TransformableObject where Self: Mappable, TransformedObject: Mappable { func transformToObject() -> TransformedObject? { return TransformedObject(JSON: toJSON()) } }

Slide 33

Slide 33 text

ڞ௨͢Δgetter/setterͷprotocol protocol ObjectType: Mappable { var bool: Bool { get set } var int: Int { get set } var float: Float { get set } var double: Double { get set } var string: String { get set } var date: Date { get set } var data: Data { get set } }

Slide 34

Slide 34 text

ObjectMapperͷϚοϐϯά extension ObjectType { mutating func mapping(map: Map) { bool <- map["bool"] int <- map["int"] float <- map["float"] double <- map["double"] string <- map["string"] date <- (map["date"], DateTransform()) data <- (map["data"], DataTransform()) } }

Slide 35

Slide 35 text

POSOͷఆٛ struct Struct: ObjectType { var bool = false var int = 0 var float: Float = 0 var double: Double = 0 var string = "" var date = Date() var data = Data() init?(map: Map) { } }

Slide 36

Slide 36 text

DAOͷఆٛ class RealmObject: Object, ObjectType { dynamic var bool = false dynamic var int = 0 dynamic var float: Float = 0 dynamic var double: Double = 0 dynamic var string = "" dynamic var date = Date() dynamic var data = Data() required convenience init?(map: Map) { self.init() } }

Slide 37

Slide 37 text

TransformableObjectʹ४ڌ extension Struct: TransformableObject { typealias TransformedObject = RealmObject } extension RealmObject: TransformableObject { typealias TransformedObject = Struct }

Slide 38

Slide 38 text

Struct → RealmSwift.Object let obj = Struct(JSON: JSONCreator.json())! let realmObj = obj.transformToObject()! RealmSwift.Object → Struct let realmObj = RealmObject(JSON: JSONCreator.json())! let obj = obj.transformToObject()!

Slide 39

Slide 39 text

ར༻γʔϯ let editVC = R.storyboard .ownerEditViewController .instantiateInitialViewController()! editVC.owner = userList.owner!.transformToObject() // 1. DAO ! POSO editVC.ownerUpdated .map { $0.transformToObject() } // 2. POSO ! DTO .bind(to: Realm.rx.add(update: true)) .disposed(by: disposeBag)

Slide 40

Slide 40 text

σϝϦοτ 4 ObjectMapperͷϚοϐϯάΛॻ͘ͷ͕൥ࡶ

Slide 41

Slide 41 text

σϝϦοτ 4 ObjectMapperͷϚοϐϯάΛॻ͘ͷ͕൥ࡶ 4 RealmSwift.ObjectͱStructͰಉ͡ఆٛΛॻ͘ͷ͕൥ࡶ

Slide 42

Slide 42 text

σϝϦοτ 4 ObjectMapperͷϚοϐϯάΛॻ͘ͷ͕൥ࡶ 4 RealmSwift.ObjectͱStructͰಉ͡ఆٛΛॻ͘ͷ͕൥ࡶ 4 StructΛ࢖͏ͳΒ͠ΐ͏͕ͳ͍

Slide 43

Slide 43 text

࣮૷: Swift 4࣌୅

Slide 44

Slide 44 text

࣮૷: Swift 4࣌୅ 4 Codable protocolͷొ৔

Slide 45

Slide 45 text

࣮૷: Swift 4࣌୅ 4 Codable protocolͷొ৔ 4 Swift 4ͷFoundationʹCodable͕௥Ճ͞Εͨ

Slide 46

Slide 46 text

࣮૷: Swift 4࣌୅ 4 Codable protocolͷొ৔ 4 Swift 4ͷFoundationʹCodable͕௥Ճ͞Εͨ 4 Codable͸class, struct, enumͷ͢΂ͯͷγϦΞϥΠ ζ/σγϦΞϥΠζΛՄೳʹ͍ͯ͠Δ

Slide 47

Slide 47 text

࣮૷: Swift 4࣌୅ 4 Codable protocolͷొ৔ 4 Swift 4ͷFoundationʹCodable͕௥Ճ͞Εͨ 4 Codable͸class, struct, enumͷ͢΂ͯͷγϦΞϥΠ ζ/σγϦΞϥΠζΛՄೳʹ͍ͯ͠Δ 4 ܕ҆શੑ

Slide 48

Slide 48 text

Codable public typealias Codable = Decodable & Encodable

Slide 49

Slide 49 text

ఆٛ public struct Location : Codable { // 1 public let latitude: Double public let longitude: Double } public enum Animal : Int, Codable { // 2 case chicken = 1 case dog case turkey case cow } public struct Farm : Codable { // 3 public let name: String public let location: Location public let animals: [Animal] } SE-0166

Slide 50

Slide 50 text

Encoder / Decoder 4 JSONEncoder / JSONDecoder 4 PropertyListEncoder / PropertyListDecoder

Slide 51

Slide 51 text

࢖༻ํ๏ let farm = Farm(name: "Old MacDonald's Farm", location: Location(latitude: 51.621648, longitude: 0.269273), animals: [.chicken, .dog, .cow, .turkey, .dog, .chicken, .cow, .turkey, .dog]) let payload: Data = try JSONEncoder().encode(farm) // 1 do { let farm = try JSONDecoder().decode(Farm.self, from: payload) // 2 // Extracted as user types: let coordinates = "\(farm.location.latitude, farm.location.longitude)" } catch { // Encountered error during deserialization } SE-0166

Slide 52

Slide 52 text

Codable 4 ObjectMapperͰߦͳ͍ͬͯͨϚοϐϯάΛCodableʹஔ ͖׵͑ΒΕͦ͏

Slide 53

Slide 53 text

࡞ͬͨ ObjectConvertible

Slide 54

Slide 54 text

ObjectConvertible public protocol ObjectConvertible: Encodable {} public extension ObjectConvertible { func convert() throws -> T { return try JSONDecoder().decode( T.self, from: try JSONEncoder().encode(self)) } }

Slide 55

Slide 55 text

Ϟσϧڞ௨ͷgetter protocol ObjectType { var bool: Bool { get } var int: Int { get } var float: Float { get } var double: Double { get } var string: String { get } }

Slide 56

Slide 56 text

POSOͷఆٛ struct Object: ObjectType, Codable, ObjectConvertible { var bool: Bool var int: Int var float: Float var double: Double var string: String }

Slide 57

Slide 57 text

DAOͷఆٛ @objcMembers class RealmObject: RealmSwift.Object, ObjectType, Codable, ObjectConvertible { dynamic var bool = false dynamic var int = 0 dynamic var float: Float = 0 dynamic var double: Double = 0 dynamic var string = "" }

Slide 58

Slide 58 text

POSOͷม׵ extension Object { /// 1. POSO ! VO var VO: ObjectType { return self } /// 2. POSO ! DAO(DTO) func convertToDAO() throws -> RealmObject { return try convert() } }

Slide 59

Slide 59 text

DAOͷม׵ extension RealmObject { /// 1. DAO ! POSO func convertToPOSO() throws -> Object { return try convert() } /// 2. DAO ! DTO func convertToDTO() throws -> RealmObject { return try convert() } /// 3. DAO ! VO func convertToVO() throws -> ObjectType { return try convertToDTO() } }

Slide 60

Slide 60 text

ม׵ͷࣦഊ // Swift.DecodingError.keyNotFound let obj: RealmObject = try! Person().convert()

Slide 61

Slide 61 text

ม׵ͷࣦഊ // Swift.DecodingError.keyNotFound let obj: RealmObject = try! Person().convert() 4 ΋ͪΖΜఆ͕ٛҰக͠ͳ͍Ϟσϧؒͷม׵͸ɺσίʔυ· ͨ͸Τϯίʔυͷྫ֎͕ൃੜ͢Δ

Slide 62

Slide 62 text

ม׵ͷࣦഊ // Swift.DecodingError.keyNotFound let obj: RealmObject = try! Person().convert() 4 ΋ͪΖΜఆ͕ٛҰக͠ͳ͍Ϟσϧؒͷม׵͸ɺσίʔυ· ͨ͸Τϯίʔυͷྫ֎͕ൃੜ͢Δ 4 ݱঢ়ͷҊͰ͸ObjectConvertibleͰdecodeՄೳͳܕ͸੍ ݶͤͣɺϓϩάϥϚͷ੹೚Ͱconvert()Λ࢖༻͢Δͱ͍͏ ํ਑

Slide 63

Slide 63 text

·ͱΊ 4 σʔλϨΠϠͷ෼཭͸େࣄ

Slide 64

Slide 64 text

·ͱΊ 4 σʔλϨΠϠͷ෼཭͸େࣄ 4 ࢓༷ॻ΍ӡ༻ϧʔϧͰ͸ͳ͘ɺϓϩάϥϜͰ࢓༷ΛറΔ ΂͖ɹ

Slide 65

Slide 65 text

·ͱΊ 4 σʔλϨΠϠͷ෼཭͸େࣄ 4 ࢓༷ॻ΍ӡ༻ϧʔϧͰ͸ͳ͘ɺϓϩάϥϜͰ࢓༷ΛറΔ ΂͖ɹ 4 ࣮૷ͷ൥ࡶ͞ͱ͸τϨʔυΦϑ

Slide 66

Slide 66 text

·ͱΊ 4 σʔλϨΠϠͷ෼཭͸େࣄ 4 ࢓༷ॻ΍ӡ༻ϧʔϧͰ͸ͳ͘ɺϓϩάϥϜͰ࢓༷ΛറΔ ΂͖ɹ 4 ࣮૷ͷ൥ࡶ͞ͱ͸τϨʔυΦϑ 4 Codableͷ͓͔͛Ͱ֎෦ϥΠϒϥϦʹґଘ͢Δ͜ͱͳ͘Ϛ οϐϯά͔Ͱ͖ΔΑ͏ʹͳΓɺDecoder/EncoderΛհ͢ Δ͜ͱͰҟͳΔϞσϧؒͰͷϚοϐϯά΋༰қʹͳͬͨ

Slide 67

Slide 67 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

Slide 68

Slide 68 text

ࢀߟ/Ҿ༻ 4 VO, DTO, POSO, DAO, Entity ͷҧ͍ 4 MVC→MVP→MVVM→Fluxͷ࣮૷ͷҧ͍Λൺֱͯ͠ΈΔ 4 RealmͰελϯυΞϩʔϯͷRLMObjectΛ׆༻͢Δ 4 SE-0166