Share
Embed
Transcript
68 slides
-
VO, DTO, POSO, DAOͱ 4 VO (Value Object) 4 getterͷΈ
4 ෆม VO, DTO, POSO, DAO, Entity ͷҧ͍ -
VO, DTO, POSO, DAOͱ 4 DTO (Data Transfer Object) 4
VO + setter 4 Մมɻ֎͔ΒมߋՄೳ 4 ҟͳΔϨΠϠʔؒʢϞσϧɺϏϡʔͳͲʣͰσʔλ Λड͚͢ͷʹ͏ VO, DTO, POSO, DAO, Entity ͷҧ͍ -
VO, DTO, POSO, DAOͱ 4 POSO (Plain Old Swift Object)
4 VODTOͷੑ࣭Λ࣋ͭ 4 Swift struct, enum 4 ໋໊ͷ༝དྷPOJO(Plain Old Java Object) VO, DTO, POSO, DAO, Entity ͷҧ͍ -
VO, DTO, POSO, DAOͱ 4 DAO (Data Access Object) 4
DBʹΞΫηε͠Λߋ৽ͨ͠Γ݁ՌΛฦ͢ VO, DTO, POSO, DAO, Entity ͷҧ͍ -
ͦ͏͍͑ 4 Realm.RLMObject (RealmSwift.Object) 1. ελϯυΞϩʔϯͷRLMObject 4 DTO 2. Realm(σʔλϕʔε)ʹඥ͚ͮΒΕ͍ͯΔRLMObject
4 DAO RealmͰελϯυΞϩʔϯͷRLMObjectΛ׆༻͢Δ -
DAOΛ͖͢Ͱͳ͍ 4 Ͳ͜ͰͰσʔλϕʔεͷߋ৽͕Մೳʹͳͬͯ͠·͏ 4 RealmʹݶͬͯɺDBʹඥ͍ͮͨObjectͷߋ৽ʹτϥ ϯβΫγϣϯ͕ඞཁͰ͋ͬͨΓɺεϨουΛ·ͨ͛ͳ͍ͱ ͍͏੍͕͋Δ 4 ͜ΕΒͷ༷ΛͲ͏ͬͯपͤ͞Δ͔ʁ 4
༷ॻ/ӡ༻ϧʔϧ → ❌ 4 VO, DTOΛ͠ϓϩάϥϜతʹ੍ݶͤ͞Δ͖ -
// 1. ΦϒδΣΫτΛ࡞͢Δ Person *author = [[Person alloc] init]; author.name
= @"David Foster Wallace"; // 2. ΦϒδΣΫτΛRealmʹՃ͢Δ [realm beginWriteTransaction]; [realm addObject:author]; [realm commitWriteTransaction]; // authorDAOʹͳΔ // 3. อଘͨ͠authorΛίϐʔ Person *copiedAuthor = [author deepcopy]; XCTAssertNil(copiedAuthor.realm); // true XCTAssertEqualObjects(author, copiedAuthor); // true // 4. τϥϯβΫγϣϯ͕ͳͯ͘มߋՄೳ copiedAuthor = @"other name"; // DTO -
࣮: Swift 3࣌ 4 ObjectMapperΛ༻ 4 Object to JSON /
JSON to Object͕Մೳ -
࣮: Swift 3࣌ 4 ObjectMapperΛ༻ 4 Object to JSON /
JSON to Object͕Մೳ 4 SwiftͷStructʹద༻Ͱ͖Δʂ -
TransformableObject public protocol TransformableObject { associatedtype TransformedObject } public extension
TransformableObject where Self: Mappable, TransformedObject: Mappable { func transformToObject() -> TransformedObject? { return TransformedObject(JSON: toJSON()) } } -
ڞ௨͢Δ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 } } -
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()) } } -
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) { } } -
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() } } -
TransformableObjectʹ४ڌ extension Struct: TransformableObject { typealias TransformedObject = RealmObject }
extension RealmObject: TransformableObject { typealias TransformedObject = Struct } -
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()! -
ར༻γʔϯ 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) -
࣮: Swift 4࣌ 4 Codable protocolͷొ 4 Swift 4ͷFoundationʹCodable͕Ճ͞Εͨ 4
Codableclass, struct, enumͷͯ͢ͷγϦΞϥΠ ζ/σγϦΞϥΠζΛՄೳʹ͍ͯ͠Δ -
࣮: Swift 4࣌ 4 Codable protocolͷొ 4 Swift 4ͷFoundationʹCodable͕Ճ͞Εͨ 4
Codableclass, struct, enumͷͯ͢ͷγϦΞϥΠ ζ/σγϦΞϥΠζΛՄೳʹ͍ͯ͠Δ 4 ܕ҆શੑ -
ఆٛ 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 -
Encoder / Decoder 4 JSONEncoder / JSONDecoder 4 PropertyListEncoder /
PropertyListDecoder -
༻ํ๏ 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 -
ObjectConvertible public protocol ObjectConvertible: Encodable {} public extension ObjectConvertible {
func convert<T: Decodable>() throws -> T { return try JSONDecoder().decode( T.self, from: try JSONEncoder().encode(self)) } } -
Ϟσϧڞ௨ͷgetter protocol ObjectType { var bool: Bool { get }
var int: Int { get } var float: Float { get } var double: Double { get } var string: String { get } } -
POSOͷఆٛ struct Object: ObjectType, Codable, ObjectConvertible { var bool: Bool
var int: Int var float: Float var double: Double var string: String } -
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 = "" } -
POSOͷม extension Object { /// 1. POSO ! VO var
VO: ObjectType { return self } /// 2. POSO ! DAO(DTO) func convertToDAO() throws -> RealmObject { return try convert() } } -
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() } } -
มͷࣦഊ // Swift.DecodingError.keyNotFound let obj: RealmObject = try! Person().convert() 4
ͪΖΜఆ͕ٛҰக͠ͳ͍Ϟσϧؒͷมɺσίʔυ· ͨΤϯίʔυͷྫ֎͕ൃੜ͢Δ -
มͷࣦഊ // Swift.DecodingError.keyNotFound let obj: RealmObject = try! Person().convert() 4
ͪΖΜఆ͕ٛҰக͠ͳ͍Ϟσϧؒͷมɺσίʔυ· ͨΤϯίʔυͷྫ֎͕ൃੜ͢Δ 4 ݱঢ়ͷҊͰObjectConvertibleͰdecodeՄೳͳܕ੍ ݶͤͣɺϓϩάϥϚͷͰconvert()Λ༻͢Δͱ͍͏ ํ -
·ͱΊ 4 σʔλϨΠϠͷେࣄ 4 ༷ॻӡ༻ϧʔϧͰͳ͘ɺϓϩάϥϜͰ༷ΛറΔ ͖ɹ 4 ࣮ͷࡶ͞ͱτϨʔυΦϑ 4 Codableͷ͓͔͛Ͱ֎෦ϥΠϒϥϦʹґଘ͢Δ͜ͱͳ͘Ϛ
οϐϯά͔Ͱ͖ΔΑ͏ʹͳΓɺDecoder/EncoderΛհ͢ Δ͜ͱͰҟͳΔϞσϧؒͰͷϚοϐϯά༰қʹͳͬͨ -
ࢀߟ/Ҿ༻ 4 VO, DTO, POSO, DAO, Entity ͷҧ͍ 4 MVC→MVP→MVVM→Fluxͷ࣮ͷҧ͍Λൺֱͯ͠ΈΔ
4 RealmͰελϯυΞϩʔϯͷRLMObjectΛ׆༻͢Δ 4 SE-0166