Flex中的反向代码后台

3
为什么在Flex中,代码后台模式使用Actionscript类作为基类,而不是使用MXML组件呢? 我的意思是,我们为什么不在新的AS3类中扩展我们的MXML,而是扩展我们的AS3代码后台类呢?
使用这种方法似乎更自然,因为它是真正的扩展,我们正在向我们的MXML基础添加代码和功能。 使用代码后台模式是对OOP的一种hack,每次我们向MXML添加组件时,我们需要修改我们的AS3类,也就是说,如果我们修改了子级(MXML),我们也需要修改父级(AS3)。
相反的代码后台(“前端代码”)有什么问题吗?
4个回答

2
这就是为什么Adobe决定重新设计其组件架构并创建Spark组件集和相应的皮肤机制的原因。
在这种新的哲学中,您需要创建一个继承自SkinnableComponent或SkinnableContainer的ActionScript类,其中描述了组件的行为。然后,您可以创建一个MXML中的皮肤类,定义组件的外观(以及一些视觉行为,但不包括组件的基本行为)。
这样可以实现关注点的清晰分离。这不是代码后置的反面,而是一种不同的方法,一旦掌握,效果非常好。

是的,但为什么Adobe提出了“代码后台”而不是“代码前台”?为什么没有人使用这种方法(至少我在任何教程/指南中都没有看到)?我的意思是,“代码前台”模式为什么不存在?它有什么问题吗?我不使用代码后台,我想我也不会使用“代码前台”,但我很好奇为什么没有人将其作为解决方案提出(甚至比代码后台更好)。 - Enrique
在我看来,无论你是在后台编码还是在前端编码,这两个类都是紧密耦合的。使用任何一种方法的唯一原因是将MXML代码与AS代码分离。这与关注点分离无关,只是使您的类更易读。 - RIAstar
是的,但前面的代码是一个真正的扩展,后面的代码不是。我们有一个纯视图类MXML和一个纯AS3类,它扩展了那个MXML,因此,这两个类都可以使用,使用你的AS3类(基类)的后面的代码是没有用处的,如果你在子类(MXML)中更改了某些内容,你也需要更改父类(AS3)!也许我解释得不好,但我认为选择代码后面而不是代码前面必须有一个原因,这不是武断的,而是一种设计模式。代码前面必须有问题/缺点,但我看不出来。 - Enrique
1
我认为我发现了“前端代码”的一个劣势,使用“后端代码”可以在MXML中使用绑定,而使用“前端代码”则不能,因为您的变量/函数在AS3中,而您的MXML不知道它。也许这就是为什么“前端代码”从未被提出作为Flex的解决方案的原因。 - Enrique
好的发现。这就是为什么-在我开始使用Spark之前-我会为每个mxml组件创建一个单独的'presentation model'和'controller'类,而不是使用代码后置或前置。 - RIAstar

2
主要原因是工具的支持,代码背后之所以流行起来,是因为工具的支持。在Flex Builder 3设计环境中,你无法拖动基于AS3的组件。我尝试了各种解决方法,但都存在问题。事实上,这是我第一次博客写的内容: http://www.rogue-development.com/blog2/2007/03/code-in-front/ 我没有在Flash Builder 4中重新尝试过这个功能。主要是因为我意识到flex布局工具很糟糕,我很少使用它。因此,我最近的所有开发都是以代码为主。
如果需要绑定MXML中的变量,可以在MXML中定义该变量,然后通过继承在子类中使用。
对于单个外观的组件,我不是太喜欢spark皮肤。如果一个组件只有一个视觉外观,那么代码编写会更容易。(皮肤适用于需要多个外观的组件)

哇!谢谢Marc,现在我不是那么孤单了 :)。设计视图也是一个额外的问题,我不知道(无论如何,我也没有在FB4中测试过)。但我认为最重要的是绑定,如果您需要在MXML中定义变量以进行绑定,那么您需要将AS添加到您的MXML中(这就是我们试图避免的),更多地是如果您需要绑定一些getter。我认为这两个原因足以证明代码存在的必要性,并且不使用前端代码。如果您想要前端代码,请使用mediators,这是一种更好的模式(我正在使用它,但我很好奇为什么Adobe提出了代码后面的概念)。 - Enrique

1
“Code in front”是一种更自然的扩展和面向对象设计方式,因为我们在AS3中通过在MXML中添加功能来扩展它,并且每次改变子类时不需要更改父类。

但是它也有一个问题,我们无法在MXML中使用绑定,因为现在我们的MXML是基类,而我们的变量/函数在AS3子类中。


修改:代码在前端的另一个问题是你无法在设计模式中看到你的“AS3组件”(未在FB4+中进行测试,可能现在已经解决)。关于这个问题,请阅读Marc Hughes的回复。

0

我认为这是由于从Flash时代继承的传统组件架构,您可以拖入一个黑盒子组件,并在颜色/形状/字体级别上最多稍微调整一下外观,但不能(也不可能)触及其工作原理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接