Ho un vincolo / invariante interessante e mi piacerebbe sentire le opinioni della gente su come mantenerlo. Grande bonus se può essere assicurato al momento della compilazione ...
Ho i seguenti tipi e l'invariante concettuale seguente ... Se l'id di un attributo è uguale a un id di attributeValue, allora devono avere tipi corrispondenti. Come esprimeresti questo invariante e assicureresti che sia vero nel codice? (Il codice è Swift, ma la domanda è generica.Per quelli che non conoscono Swift, questi sono tutti tipi di valori immutabili. Possono essere utilizzati come interi o stringhe immutabili in altre lingue.)
struct Attribute {
let attributeID: Int
let name: String
let display: Bool
let type: AttributeType
}
enum AttributeType {
case Text
case SingleList([AttributeChoice])
case MultiList([AttributeChoice])
case Date
case Time
case DateTime
case Image
case Flag
case Count
}
struct AttributeValue {
let attributeID: Int
let value: AttributeValueType
}
enum AttributeValueType {
case Text(String)
case SingleList(AttributeChoice)
case MultiList([AttributeChoice])
case Date(NSDate)
case Time(NSDate)
case DateTime(NSDate)
case Image(UIImage)
case Flag(Bool)
case Count(Int)
}
struct AttributeChoice {
let serverID: Int
let name: String
}
Mentre sto scrivendo questa domanda, stavo pensando che forse la classe Attribute dovrebbe gestire la creazione di AttributeValues in qualche modo, altre idee?