我开发了一个结构,可以在我的应用程序中生成用于测试目的的随机数据,但只有在Realm数据库为空时才会这样做。负责CRUD操作的服务类将结果/结果返回为RxSwift Observables。
生成新数据取决于领域的内容 - 使用guard
是合乎逻辑的选择,但需要向返回Int
的服务添加新方法,而不是Observable
,这似乎是不必要的代码重复,有些不一致。
即
class Service {
let realm = try! Realm()
...
// Existing reactive code
func patients() -> Observable<Result<Patient>> {
let results = realm.objects(Patient.self)
return Observable.collection(from: results)
}
func objectCount() -> Int {
let realm = try! Realm()
return realm.objects(Patient.self).count
}
}
struct DataGenerator() {
...
func createRandomPatients() {
let service = Service()
guard service.objectCount() == 0 else { return }
...
//go on to generate patients
我可以使用反应式服务方法复制此控制流的唯一方法是将Observable
绑定到Variable
即
... service code as above ...
func createRandomPatients() {
let isEmpty = Variable<Bool>(false)
service.patients().map{ $0 == 0 }.bind(to: isEmpty)
guard isEmpty.value else { return }
// etc
它看起来有点像软糖,因为它可能并不是很清楚,但它避免了将代码添加到不会在生产应用程序中使用的服务类中。这是不好的做法还是个人偏好?如果有人有一个解决方案,我会接受替代解决方案...
答案 0 :(得分:0)
伪造绝对应该用多态来处理。
一个好的设计是定义一个通用接口;例如,它可以是PatientsSource
:
protocol PatientsSource {
func patients() -> Observable<Result<[Patient]>>
}
您可以通过定义:
来利用多态性class PatientsService: PatientsSource... {
//w/e
}
struct FakePatients: PatientsSource {
//your random patients generation
}
如果您使用Service
样式架构,那么您应该将Service
和PatientsSource
分别传递给用户(例如您的控制器),即使它们可能最终相同对象