我使用具有 [unit] 属性(枚举)的值对象。 我的枚举实现了一个接口,允许单位之间的转换(厘米到米,公斤到克等......)
像这样:
class Height {
final double value;
final DistanceUnit unit;
const Height({required this.value, this.unit = DistanceUnit.cm});
}
// Directly implementing Enum so that only enums can implement this ; important for another method.
abstract interface class Convertible implements Enum {
final double factor;
Convertible({required this.factor});
double getConversionFactor(covariant Convertible from, covariant Convertible to);
}
enum DistanceUnit implements Convertible {
cm(factor: 1/100),
m(factor: 1);
@override
final double factor;
const DistanceUnit({required this.factor});
@override
double getConversionFactor(covariant Convertible from, covariant Convertible to) {
return from.factor / to.factor;
}
}
这工作得很好,但由于我有很多单位(面积、距离、体积、时间、质量......),它变得非常冗长和重复。 getConversionFactor() 方法始终相同...所以我们离 DRY 建议还很远!
我知道枚举继承自 Enum 并且不能扩展另一个类。但是有其他方法可以防止这种情况并优化我的代码吗?
我更愿意为此延期。
class MyModel {
const MyModel(this.valueInCM);
///* in minimum unite, e.g for your domain level,
/// we can consider from cm, if needed you goes down too
final double valueInCM;
}
extension MyModelExt on MyModel {
double get toMeter => valueInCM / 100;
double get toKM => valueInCM / 1000;
}
您还可以在 dart 中查看
Duration
课程。
我无法在我的脑海中得到完整的案例,但如果正在寻找删除 getConversionFactor 最红的部分,你可以使用 mixin ,如下所示
class Height {
final double value;
final DistanceUnit unit;
const Height({required this.value, this.unit = DistanceUnit.cm});
}
// Directly implementing Enum so that only enums can implement this ; important for another method.
abstract interface class Convertible implements Enum {
final double factor;
Convertible({required this.factor});
}
enum DistanceUnit with Conver implements Convertible{
cm(factor: 1/100),
m(factor: 1);
@override
final double factor;
const DistanceUnit({required this.factor});
}
mixin Conver {
double getConversionFactor(covariant Convertible from, covariant Convertible to) {
return from.factor / to.factor;
}
}