在模型类中重用setter

时间:2020-03-10 13:25:08

标签: flutter dart

我有用于查询数据库的模型类。一切正常,没有问题。我现在正在尝试优化模型类中的代码。这是代码

class HumanFilter {
  double age, maxAge, minAge, weight, minWeight, maxWeight, tall, minTall, maxTall, waist, minWaist, maxWaist;

set setMaxAge(String s) {
  if (s != null) {
    double parsed = double.tryParse(s) != null ? double.parse(s) : maxAge;
    minAge = minAge != null && parsed != null
        ? parsed <= minAge && minAge != 0 ? parsed - 1 : minAge
        : null;
    maxAge = parsed;
    age = parsed != null ? null : age;
  } else {
    maxAge = null;
  }
}

set setMinAge(String s) {
if (s != null) {
  double parsed = double.tryParse(s) != null ? double.parse(s) : minAge;
  minAge = parsed;
  maxAge = maxAge != null && parsed != null
      ? parsed >= maxAge ? parsed + 1 : maxAge
      : null;
  age = parsed != null ? null : age;
} else {
  minAge = null;
}
}

set setAge(String s) {
if (s != null) {
  double parsed = double.tryParse(s) != null ? double.parse(s) : age;
  age = parsed != null ? parsed : age;
  minAge = parsed != null ? null : minAge;
  maxAge = parsed != null ? null : maxAge;
} else {
  age = null;
}
}
// another setters for the rest of the parameters which are same as the code above
}

其余参数的设置器与我为年龄提供的设置器完全相同。例如,重量设置器与年龄设置器相同,但是设置minWeight,maxWeight和weight而不是minAge,maxAge和age。与minTall和minAge等相同。

我想创建3个方法,这些方法将使用最小值,最大值和标称值,然后返回可以在setter方法中分配的3个值的列表或映射,但是随后我还注意到min和max setter几乎是相同,因此也许也可以重用。我只是找不到合适的方法来重用(优化)代码

1 个答案:

答案 0 :(得分:1)

分解此重复项的一种方法是提取类中的最小/最大/当前值:

class Interval {
  double min;
  double max;
  double current;
}

这意味着您将在setMinAge上拥有其中之一,而不是setMaxAge + Interval + ...

class Interval {
  double min;
  double max;
  double current;

  set setMax(String s) {
    if (s != null) {
      var parsed = double.tryParse(s) != null ? double.parse(s) : max;
      min = min != null && parsed != null
          ? parsed <= min && min != 0 ? parsed - 1 : min
          : null;
      max = parsed;
      current = parsed != null ? null : current;
    } else {
      max = null;
    }
  }

  // setMin
  // setCurrent
}
相关问题