代码之家  ›  专栏  ›  技术社区  ›  Leong

Dart:如何分解具有不同返回类型的函数

  •  0
  • Leong  · 技术社区  · 2 年前

    我的项目中有一些类似的函数,它们的工作原理相同,但返回类型不同。我有可能把它们分解成一个函数来减少代码的减少吗?

    下面是我的代码示例:

    class A {
        final String code;
        final String name;
    }
    
    class B {
        final String name;
        final String leaveDate;
    }
    
    List<A> testFunc(String value, List<A> list) {
      List<A> result = [];
    
      for (var E in list) {
        if (E.name!.toLowerCase().contains(value)) {
          result.add(E);
        }
      }
      return result;
    }
    
    List<B> testFun1(String value, List<B> list) {
      List<B> result = [];
    
      for (var E in list) {
        if (E.name!.toLowerCase().contains(value)) {
          result.add(E);
        }
      }
      return result;
    }
    

    我累得昏倒了 List<dynamic> 但它似乎对我的项目有效。

    2 回复  |  直到 2 年前
        1
  •  1
  •   jamesdlin    2 年前

    一些选项:

    • 制作 A B 两者都源自一个公共的基本接口,该接口提供 name 吸气剂:

      abstract interface class HasName {
        String get name;
      }
      
      class A implements HasName {
        final String code;
      
        @override
        final String name;
      
        A({required this.code, required this.name});
      }
      
      class B implements HasName {
        @override
        final String name;
      
        final String leaveDate;
      
        B({required this.name, required this.leaveDate});
      }
      
      List<T> testFunc<T extends HasName>(String value, List<T> list) {
        List<T> result = [];
      
        for (var e in list) {
          if (e.name.toLowerCase().contains(value)) {
            result.add(e);
          }
        }
        return result;
      }
      
    • 或者,让您的泛型函数使用getter的回调:

      List<T> testFunc<T>(String value, List<T> list, String Function(T) getName) {
        List<T> result = [];
      
        for (var e in list) {
          if (getName(e).toLowerCase().contains(value)) {
            result.add(e);
          }
        }
        return result;
      }
      

      然后用类似的东西来称呼它 testFunc('foo', listOfA, (a) => a.name) .

    如果你想放弃静态类型安全,转而使用duck类型,你可以处理 List 元素为 dynamic :

    List<T> testFunc<T>(String value, List<T> list) {
      List<T> result = [];
    
      for (var e in list) {
        if ((e as dynamic).name.toLowerCase().contains(value)) {
          result.add(e);
        }
      }
      return result;
    }