我在自己负责的大型代码库中遇到了一些类似的问题,我一直在努力实现两个主要目标:
- 使视图尽可能小,并通过组合重用它们
- 分解特定于视图的代码和后端功能(数据处理、服务器端请求等)
可重用视图
当构建一个视图是另一个视图(可能是管理员和用户)的超集时,我一直在尝试构建由相似组件组成的单独视图。管理视图可能会“包装”用户视图并添加它需要的任何功能。当这可行时(并非总是如此),这意味着我不必处理太多状态,因为一个视图只是另一个视图的包装器。
当包装不起作用时,我会尝试找到共同的功能部分来分别构建每个视图。
例如:管理员和用户可能有登录控制,但没有访客。这些将是一个单独的 MXML 组件,然后我将其包含在 Admin 和 User 视图中。所有 3 个共有的其他控件可能是另一个 MXML 组件,它将包含在所有 3 个视图中。这种技术需要做更多的工作,你需要小心不要发疯(例如,每个 Flex 容器/控件都使用一个 MXML 文件),但这意味着我可以重用某些可视化组件而无需复制和粘贴。这也意味着每个视图都可以根据需要自定义它们的显示方式。
我在我的视图中使用了继承,但只有当它们明确具有 IS-A 关系并且更改其中一个代码时,才需要更改另一个。我还使用状态来控制单个视图中的较小更改,但我尝试将它们限制在一个或两个状态,这样它就不会像你提到的那样变得非常笨拙。
解耦功能
我使用presenters 来帮助解耦视图与其数据的连接。每个视图都有一个 Presenter 对象,它绑定到它的数据。这使得视图中的 SCRIPT 标记非常小,因为视图只需要知道要绑定演示者中的哪些数据以及调用其控件时要调用的方法。
这些演示者也可以在视图之间共享。
以下是用户/管理员登录项目中的示例:
------------------
| User View | ----------------------- ---------------
| Login Button |------- | Presenter | | Model/ |
------------------ | Login Click Handler |-------| Controller/ |
----------------------- | ... |
| ---------------
------------------ |
| Admin View | |
| Login Button |------------------
------------------
User 和 Admin 视图相当简单:它们是可视控件(HBox、滑块、按钮等)的集合,用 MXML 编写,我可以管理尽可能少的 ActionScript 代码(尽管它们通常有一些)。每个都被赋予一个演示者对象(用 ActionScript 编写并由框架注入),它具有视图可以调用的可绑定属性/数据和函数。演示者还能够以某种方式将属性/数据的更改中继到应用程序的后端(例如,通过控制器、事件等)。它们通过其可绑定的属性/数据将数据的任何更新转发回视图。
为了促进这一点,我一直在使用Parsley,尽管有许多other 框架也有助于这种类型的解耦。
这使得创建新视图相当容易,因为后端功能主要是编写的。如果没有写出来,我会针对我正在创建的视图编写一个新的演示者,或者尝试通过继承或组合重用现有的演示者。
我认为这将使迁移到 Flex 4 变得更容易一些(我正在推动我们的项目尽快完成):所有与视图相关的主要更改都应该限制在 MXML 文件中,并且演示者应该更改很少。除了在视图中,我不会追逐需要在任何地方更改的视觉组件。
这里有两篇很好的文章也讨论了分解视图: