В следующем примере кода есть запах (Rx) Swift, но вопрос является общим для любого языка с реактивными функциями и возможностью бросания.
Рассмотрим функцию, которая возвращает наблюдаемую последовательность, но выполняет некоторую проверку работоспособности перед созданием последовательности. Ошибка проверки означает, что последовательность не может производить значения.
func yieldFoos() -> Observable<Foo> {
guard isValid(internalFoo) else {
// throw or return one shot observable?
}
return createValidObservable(from: internalFoo)
}
В случае сбоя проверки достоверности состояния должна ли функция выдавать или возвращать один наблюдаемый выстрел, который когда-либо приведет только к ошибке? Мой программист обнаружил следующие плюсы и минусы:
Бросок кажется логически более чистым (это сбой, препятствующий наблюдаемому созданию), но приводит к громоздкому вызывающему коду - блоку перехвата, множеству точек обработки ошибок в разных областях выполнения.
Наблюдаемый один выстрел приводит к более короткому и чистому вызывающему коду, но почему-то кажется неправильным. Для краткости наблюдаемое вынуждено быть носителем непоследовательного состояния ошибки.
У кого-нибудь есть твердое мнение, за которым стоит последовать? Или другое упущенное из виду элегантное решение?