Как лучше всего вернуть одно значение разных типов из функции - PullRequest
0 голосов
/ 03 мая 2019

У меня есть функция, которая возвращает либо сообщение об ошибке (String), либо Firestore DocumentReference.Я планировал использовать класс, содержащий и то, и другое, чтобы проверить, является ли сообщение об ошибке ненулевым, чтобы обнаружить ошибку, а если нет, то ссылка действительна.Однако я подумал, что это слишком многословно, а потом подумал, что может быть лучше вернуть переменную.Однако возврат переменной не разрешен.Поэтому я возвращаю динамику и проверяю, является ли результат String, чтобы обнаружить ошибку.IE.

   dynamic varResult = insertDoc(_sCollection,
     dataRec.toJson());
   if (varResult is String) {

Затем, проверив на соответствие, я прочитал следующее от одного из гуру: «Это плохой стиль - явно помечать функцию как возвращающую Dynamic (или var, Any или что-то другое, что вы выберете»).чтобы вызвать его). Очень редко вам нужно об этом знать (только при создании экземпляра универсального типа с несколькими аргументами типа, где некоторые известны, а некоторые нет). "

Я очень счастлив, используядинамическое для возвращаемого значения, если это уместно, но в целом я стараюсь соответствовать передовой практике.Я также очень осведомлен о раздутом программном обеспечении, и я иду на крайние меры, чтобы избежать этого.Вот почему я не хотел использовать Class для возвращаемого значения.

Каков наилучший способ справиться с описанной выше ситуацией, когда тип возвращаемого значения может быть String или, альтернативно, каким-либо другим объектом, в данном случаеFirestore DocumentReference (акцент на очень компактный код)?

1 Ответ

1 голос
/ 03 мая 2019

Один из вариантов - создание абстрактного класса состояний.Примерно так:

abstract class DocumentInsertionState {
  const DocumentInsertionState();
}

class DocumentInsertionError extends DocumentInsertionState {
  final String message;

  const DocumentInsertionError(this.message);
}

class DocumentInsertionSuccess<T> extends DocumentInsertionState {
  final T object;

  const DocumentInsertionSuccess(this.object);
}

class Test {
  void doSomething() {
    final state = insertDoc();
    if (state is DocumentInsertionError) {

    }
  }

  DocumentInsertionState insertDoc() {
    try {
      return DocumentInsertionSuccess("It worked");
    } catch (e) {
      return DocumentInsertionError(e.toString());
    }
  }
}

Полный пример здесь: https://github.com/ReactiveX/rxdart/tree/master/example/flutter/github_search

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...