Nous construisons une application iOS en utilisant Realm comme modèle/base de données, mais nous souhaitons concevoir le client afin qu'il puisse facilement prendre en charge les modifications de l'API REST-ful qui pourraient se produire dans le futur. Disons que nous développons une application pour les organisations de compétition sportive qui accueille différents événements. Chaque événement a différents types de types d'événements basés sur les sports qui sont joués. À l'heure actuelle, l'API ne renvoie que le football, le baseball et le football, mais à l'avenir, il pourrait également inclure le basketball. Plus tard, il pourrait éliminer le baseball. Je l'ai conçu les objets de royaume pour que les événements sont découplées à partir de types d'événements en utilisant un-à-plusieurs comme ceci:Comment rendre dynamique le modèle dans MVC pour iOS en fonction des modifications apportées à l'API REST-ful?
class EventTypeGroup: Object {
dynamic var name = ""
let eventTypes = List<EventType>()
}
class EventType: Object {
dynamic var name = ""
dynamic var descriptionText = ""
}
Un EventTypeGroup est la classe qui décrit les types d'événements (dans ce cas, quels sports) sera joué à l'événement. J'ai utilisé cette conception car les dictionnaires ne sont pas pris en charge dans Realm où nous pourrions stocker un type d'événement avec un ensemble de propriétés associé.
Afin de rendre le modèle adaptable aux changements futurs dans l'API au cas où des sports pour une organisation particulière sont ajoutés ou supprimés, j'ai utilisé un modèle d'usine abstrait comme ci-dessous. De cette façon, un événement ne peut pas être créé sans utiliser une énumération conforme aux principes de conception modernes de Swift. Le problème que je suis est, en supposant que nous vérifions seulement les changements de l'API pour les types d'événements (sports) une fois que l'utilisateur ouvre l'application, comment pouvons-nous changer le modèle avec l'application déjà ouverte? La base de données doit-elle être migrée si ces champs changent?
protocol EventTypeGroupFactory {
func createEventTypeGroup(List<EventType>) -> EventTypeGroup
}
protocol EventTypeFactory {
func createEventTypes() -> List<EventType>
}
class SportEventGroupFactory: EventTypeGroupFactory {
func createEventTypeGroup(withEventTypes: List<EventType>) ->
EventTypeGroup {
//implement logic to create an EventTypeGroup for the SportEventGroup
}
}
class SportEventTypeFactory: EventTypeFactory {
EventTypeGroup {
func createEventType() -> EventType {
//implement logic to create an EventType for the SportEventType
}
}
class EventTypeGroup: Object {
let eventTypes = List<Int>
enum EventType {
}
}
class EventType: Object {
var type: Int?
name: String?
description: String?
}
class Event: Object {
static enum EventType
init(eventTypeWithRawValue:) {
}
}
En outre, comment vais-je faire référence aux différentes variations des classes dans le code que je vous écris si je ne sais pas comment ils vont être définis. Je suppose que le modèle d'usine abstraite n'est peut-être pas la meilleure solution, mais je ne sais pas quelles autres options je devrais envisager ou comment aborder la question de rendre les types facilement extensibles dans un modèle basé sur les changements d'API.
Aucun dés sur la classe EventType que j'ai ajouté à votre réponse? En outre, une raison particulière vous avez choisi d'implémenter le modèle d'événement en utilisant une structure plutôt qu'une classe? – stonybrooklyn
Re. structs: les structs sont plus sûrs (dans Swift, ils sont passés par valeur, pas par référence) et aussi plus rapidement à l'exécution (pas de vtable à maintenir). Mais si vous avez besoin de sous-classe et que les protocoles ne suffisent pas, alors revenez à l'utilisation des classes. – willtherussian
Re. EventType class: oui, vous pouvez utiliser une classe ou une structure pour la propriété eventType si vous devez envelopper d'autres données et placer la chaîne (celle qui prendra des valeurs comme "baseball" et "football") à l'intérieur. Le fait est que vous utiliseriez toujours une chaîne au lieu d'une énumération. – willtherussian