Polymer Dart Strong Mode和Mixins迫使奇怪的代码设计

时间:2017-08-18 19:19:36

标签: polymer dart polymer-1.0 dart-polymer

我们开始使用Dart强力模式和我们的聚合物飞镖码,老实说它看起来很糟糕。看起来很糟糕,我需要就此事提出第二意见。它看起来很丑陋,老实说不能。

所以我们使用一些混合输入来创建一堆PolymerDart视图用于通用代码。这个通用代码在任何地方都可以重复使用,因此我们为什么要将它作为mixin。

我们的旧设计:

abstract class MyModel{ ... }
class SubModel extends MyModel with JsProxy{ ... }


@behavior
abstract class MyBehavior implements PolymerBase {
  @Property(notify:true)
  MyModel model = null;
  // ....
}

@PolymerRegister("my-component")
class MyViewModel extends PolymerElement with MyBehavior {
  @Property(notify:true)
  SubModel model = null;
// ...
}

目的是使用通用模型来表示信息,并在行为中利用它。由于SubModel扩展了它,我们可以正常插入任何地方,行为也可以。我的同事说这是一个巨大的 NO ,我很困惑为什么。他说这是一个聚合物问题,所以当我们离开Polymer时,它将能够完成。

然后,他在代码库中推出了一个重构器,因此它可以工作。

@PolymerRegister("my-component")
class MyViewModel extends PolymerElement with MyBehavior {
  @Property(notify:true)
  MyModel model = null;  // <-- changed to parent type from Behavior

  //example reference
  void test(){
    int id = (model as SubModel).id;  // <-- using AS to explain what it really is.
  }
}

现在他把这个放在了所有地方,用model.id更新了(model as SubModel).id的所有引用。我认为这很丑陋而且完全错了。 (当然,我对PolymerDart的所有内容都有这种感觉。)

在与Mixins打交道时,这真的是这样做的吗?由于mixin已经有了这个定义,我们也不应该在MyViewModel代码中使用它。

有人可以向我解释为什么根据强模式这是正确的吗?为什么必须发生这种变化?虽然我相信我的同事,但似乎有些东西似乎已经消失了,我希望有更深入的了解。我相信,他是正确的,也许是因为完全归功于Polymer Dart,但也许有办法绕过所有属性重命名,并在任何地方使用(.. as Whatever)

analysis_options.yaml:

analyzer:
  strong-mode: true

编辑:原因在于,由于模型被定义为行为中的属性,因此它是不可变的。我们无法覆盖MyViewModel类中的类型。由于SubModel扩展了MyModel,因此应该允许存在。

0 个答案:

没有答案