2015-07-03 4 views
2

Я думаю, что я понимаю идею опций Swift, т. Е. Свойство с необязательным типом представляет собой MUST HAVE, в то время как свойство с дополнительным типом МОЖЕТ ИМЕТЬ, но мне кажется, что это один из эти функции, такие как обязательная обработка исключений или обязательный отступ, в то время как в теории теоретически имеют некоторые непредвиденные практические последствия. Это ситуация, с которой я столкнулся. Я создаю медицинское приложение для оценки познавательных способностей. Тест проводится пациентом у поставщика, и он состоит из, скажем, 10 различных видов деятельности. Модель данных приложения представляет собой простой класс Test, который собирает результаты деятельности. Каждая деятельность имеет свой собственный класс, так же как и пациент и поставщик. Бизнес-логика определяет, что все действия должны быть завершены или тест недействителен, и пациент и поставщик, очевидно, являются обязательными. Естественное определение класса Test быБыстрые варианты использования опций

class Test { 
    var provider: Provider 
    var patient: Patient 
    var activity1: Activity1 
    var activity2: Activity2 
    ... 
    var activity10: Activity10 
    } 

Теперь проблема заключается в том, что для создания экземпляра класса Test, мне нужно иметь все результаты для всех видов деятельности; на практике я должен переносить все отдельные экземпляры Provider, Patient, а действия и только по завершении теста создают экземпляр Test, это, конечно, нецелесообразно. Таким образом, для практических целей все свойства Test могут быть сделаны необязательными, а класс заполняется постепенно, но теперь класс Test не представляет модель данных точно; кроме того, любой доступ к свойствам должен быть развернут. Одним из вариантов было бы создание необязательного массива действий, которые могут расти постепенно, но еще раз класс не будет представлять намерения модели данных. Наконец, можно создать «сестра-класс» PartialTest со всеми необязательными свойствами, а когда PartialTest полностью заполнен, создайте экземпляр Test. Тем не менее это кажется излишним.

Итак, я неверно истолковываю роль опций в Swift? Если нет, есть ли какой-либо практический способ сохранить класс Test, как и должно быть?

ответ

4

Вы могли бы сделать что-то вроде:

class Test { 
    var provider: Provider 
    var patient: Patient 
    var activity1: Activity1! = nil 
    var activity2: Activity2! = nil 
    // ... 
    var activity10: Activity10! = nil 

    var isComplete: Bool { 
     return activity1 != nil 
      && activity2 != nil 
      // ... 
      && activity10 != nil 
    } 
} 

... и только деятельность доступа в тесте, когда он имеет isComplete == true, я думаю, что дизайн может быть концептуально улучшена.

Но в целом я бы пересмотрел дизайн, чтобы уйти от сдерживания жестким набором действий в классе Test. Например:

protocol Activity { 
    var isMandatory: Bool { get } 
    var isComplete: Bool { get } 
} 

struct Activity1: Activity { 
    let isMandatory: Bool 

    var result1: Int! = nil 

    var isComplete: Bool { 
     return result1 != nil 
    } 

    init(isMandatory: Bool) { 
     self.isMandatory = isMandatory 
    } 
} 

class Test { 
    var provider: Provider 
    var patient: Patient 
    var activities: [Activity] = [ 
     Activity1(isMandatory: true) 
     // ... 
    ] 

    var isComplete: Bool { 
     return activities.reduce(true) { 
      $0 && $1.isComplete 
     } 
    } 
} 

... или какой-либо еще лучший подход.

Смежные вопросы