0

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

例子:

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

我尝试过的/我的想法:

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

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

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

4

2 回答 2

3

对 Singleton 的仇恨是当之无愧的。我建议永远不要养成使用它的习惯,所以当你发现维持它是多么可怕时,你不必打破这个习惯。

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

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

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

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

于 2012-09-01T15:11:42.143 回答
2

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

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

此外,Singletons 通常会引起相当多的争论,在你愤怒地使用 Singletons 之前可能值得理解(因为你说你是 OOP 的新手,我假设你以前没有这样做过)。

于 2012-08-31T23:38:34.047 回答