【问题标题】:How best to return a single value of different types from function如何最好地从函数返回不同类型的单个值
【发布时间】:2019-09-21 22:28:15
【问题描述】:

我有一个返回错误消息(字符串)或 Firestore DocumentReference 的函数。我打算使用一个包含两者的类并测试错误消息是否为非空来检测错误,如果不是,则引用有效。然而,我认为这太冗长了,然后认为返回一个 var 可能会更整洁。但是,不允许返回 var。因此,我返回一个动态并测试结果是否为字符串以检测错误。 即。

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

然后在检查合规性之后,我从一位大师那里阅读了以下内容: “将函数显式标记为返回 Dynamic(或 var,或 Any 或您选择调用它的任何内容)是不好的风格。很少需要注意它(仅在实例化具有多个类型参数的泛型时)有些是已知的,有些是未知的)。”

如果合适的话,我很乐意使用动态作为返回值,但通常我会尽量遵守最佳做法。我也非常了解臃肿的软件,我会采取极端措施来避免它。这就是我不想使用 Class 作为返回值的原因。

在返回类型可能是 String 或其他对象(在本例中为 Firestore DocumentReference)(强调非常紧凑的代码)时,处理上述情况的最佳方法是什么?

【问题讨论】:

  • 我认为一个典型的方法是抛出一个 Exception 并在失败时显示错误消息,并希望调用者能够捕捉到它。
  • @jamesdlin。这不会导致大量重复代码吗?如果异常在它发生的地方得到处理,那么它可以简单地返回一条错误消息。对我来说,这似乎更整洁。
  • 我不明白这比让调用者一直检查返回值的类型更糟糕。对我来说,代码重复量似乎差不多。

标签: dynamic dart flutter google-cloud-firestore


【解决方案1】:

一种选择是创建一个抽象状态类。像这样的:

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

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多