Actionscript OOP 多方法调用架构问题

Posted

技术标签:

【中文标题】Actionscript OOP 多方法调用架构问题【英文标题】:Actionscript OOP multiple method call architecture issue 【发布时间】:2012-08-26 14:26:16 【问题描述】:

我有一个类:DatabaseService.as 这个类创建一个本地 sqlite 连接并在它们不存在时创建表。连接链接将被其他几个类使用。一些类将在启动时调用其他类在用户交互时。 “DatabaseService”类在打开数据库连接时调度事件。其他类初始化“DatabaseService”类并等待“DatabaseReadyEvent”。 这很好用,但是当我需要多次调用同一个类的函数/方法时该怎么办?

例子:

我在 mxml 组件中创建了一个“PrefService”类的实例。 “PrefService”在其构造函数中创建一个新的“DatabaseService”类。然后它等待“DatabaseReadyEvent”并执行 sql 查询(这工作正常)。但随后我还需要在“PrefService”类中调用“addDir”方法(以及其他一些方法),并且尚未设置 sqlConnection 属性导致错误。我该如何处理?我是 OOP 的新手,所以我可能遗漏了一些非常简单的东西......

我的尝试/我的想法:

    我可以检查“PrefService”类中是否存在 sqlConnection,但我认为这是不好的做法,仍然需要某种延迟机制。

    我还可以为每个方法创建一个“DatabaseService”类的新实例并添加一个新的事件侦听器,但这对于每个方法调用的 2 个函数来说非常麻烦,更不用说事件了。

在这种情况下最好的选择是什么?

【问题讨论】:

【参考方案1】:

在没有看到任何代码的情况下提出建议很棘手,但可能值得考虑将 DatabaseService 类设置为 Singleton 并在启动例程中初始化它(和数据库连接)一次(即之前使用它的类被实例化)。这将确保使用DatabaseService 的类都共享到数据库的单个连接链接,并且当他们使用它时该链接可用。

ActionScript 中的单例引起了相当多的争论,因为在其他语言中,该模式依赖于将类构造函数的访问修饰符设置为私有的能力(这在 ActionScript 3.0 中无法做到)。但是,您可以从here 详细介绍的几种方法中进行选择。

此外,Singleton 通常会生成a fair bit of debate,在您使用它之前可能值得理解(因为您声明您是 OOP 的新手,我假设您以前没有这样做过)。

【讨论】:

感谢您的回复。我担心我必须更深入地研究设计模式:) 看起来很讨厌单例,会更多地阅读设计模式,也许我会使用代理,谢谢! 你不会后悔花时间学习设计模式;请记住,它们只不过是针对常见编程问题的久经考验的解决方案。在这个阶段,我不会太担心单例模式的负面影响(我只是认为我不提它是我的疏忽);如果它有助于解决您的问题,那么我建议您使用它,如果没有,请使用另一种方法(代理模式可能很适合)。 我可能会为 DatabaseService 使用单例,因为它只需要一个实例,像其他模式一样的代理模式对于 OOP 新手来说并不是那么简单:) -1 表示单例。没有任何借口 - 永远 - 使用一个。作为菜鸟使用它并不容易,它会教你非常糟糕的编程习惯。 -1 似乎很苛刻,特别是因为我已经在我的回答中承认了单例模式的问题。我不得不不同意你的观点;我不相信它有什么本质上的错误,尽管它经常被滥用,但它是一种模式。我认为在这种情况下(需要管理的单个实例资源)它是合理的,并且考虑到提出问题的人在他的 OOP 旅程中所处的阶段,可以说是一个比实现 MVC 框架更合理的建议。跨度> 【参考方案2】:

讨厌单例的是well-deserved。我建议永远不要养成使用它的习惯,所以当你发现它是多么可怕时,你不必改掉它。

您最大的错误是让您的视图创建和执行您的服务。不幸的是,FB 服务生成代码的工作方式鼓励了这一点。相反,您想要的是更像是类似于 Robotlegs 等框架所鼓励的类型的 MVCS(模型-视图-控制-服务)。

要了解如何从紧耦合架构转变为松耦合架构,请从 this example 开始。请注意,Service 是一个静态类,就鼓励紧密耦合而言,它几乎具有作为 Singleton 的所有问题。即使只有一个类使用该服务,想象一下如果您有一个大型项目,其中数十或数百个类都在引用它会发生什么。现在想象有些事情需要改变。艾克。

现在看一下项目,refactored,以便视图只是生成一个导致调用服务的事件。该服务仍然是静态的,但在此 万一只有一件事知道它(Mate),所以如果你想让它不是静态的或者有时使用不同的服务,你现在可以轻松地做到。

事实上,你可以很容易地改变事情,this is the project,重构为使用 Robotlegs。您不必像我那样使用框架——您可以看到核心类中涉及的基本结构并不关心如何处理事件或数据如何进入视图。如果您不习惯使用框架,请按自己的方式处理。但是框架已经存在了一段时间,它们已经解决了很多你还没有想到的问题。

【讨论】:

+1 好建议。 puremvc.org 也可能是一个值得考虑的框架(非常成熟,得到很好的支持并且适用于其他语言)。使用框架也是正确使用设计模式的一个很好的介绍(值得注意的是,几乎所有的设计模式都使用了单例模式)。 我喜欢 RobotLegs,如果它不会让我感到困惑和失去动力,我会尝试实施它(到目前为止,它对我来说有点陌生,但并不过分复杂),感谢您的深入了解回答! @net.uk.sweet PureMVC 现在对我来说可能有点多:) 当然 PureMVC 使用 Singleton,Cairngorm 的旧变体也是如此。这就是人们远离他们的主要原因。 @AmyBlankenship - 你有什么证据表明人们正在远离 PureMVC?或者你的意思是一般的单身人士 只是像 360Flex 这样的讨论是关于 Robotlegs 和 Cairncorm 3,没有提到 PureMVC。这就是行业领导者正在做的事情,这就是我的想法。现在,我们几乎不会以遵循过时做法的人为榜样,对吗?

以上是关于Actionscript OOP 多方法调用架构问题的主要内容,如果未能解决你的问题,请参考以下文章

java面试提问:啥是OOP?

Actionscript 3 中的接口和游戏架构

OOP学习的第二次BLOG

ActionScript 3 调用Javascript / JS方法

如何从 javascript 调用 flash actionscript 回调方法?

多线程详解