我有一个类:DatabaseService.as这个类创建一个本地sqlite连接并创建表(如果它们不存在)。连接链接将被其他几个类使用。一些类将在启动其他类用户交互时调用。 “DatabaseService”类在打开数据库连接时调度事件。其他类初始化“DatabaseService”类并等待“DatabaseReadyEvent”。 这很好用,但是当我需要多次从同一个类调用一个函数/方法时,我该怎么办?
示例:
我在mxml组件中创建了一个“PrefService”类的实例。 “PrefService”在其构造函数中创建一个新的“DatabaseService”类。然后它等待“DatabaseReadyEvent”并执行sql查询(这很好)。但是我还需要在“PrefService”类中调用“addDir”方法(以及其他几个),并且尚未设置sqlConnection属性,从而导致错误。我怎么处理这个?我是OOP的新手所以我可能错过了一些非常简单的事情......
我尝试了什么/我的想法:
我可以检查“PrefService”类中是否存在sqlConnection,但我认为这样做不好,仍然需要某种延迟机制。
我还可以为每个方法创建一个新的“DatabaseService”类实例,并添加一个新的事件监听器,但这对于每个方法调用的2个函数来说非常麻烦,更不用说事件了。
这种情况下最好的选择是什么?
答案 0 :(得分:3)
单身人士的仇恨是well-deserved。我建议不要养成使用它的习惯,所以当你发现维持它的可怕程度时,你不必打破这种习惯。
您最大的错误是让View创建并执行您的服务。不幸的是,FB服务生成代码的工作原理鼓励了这一点。相反,你想要的东西更像是像Robotlegs这样的框架所鼓励类型的MVCS(模型 - 视图 - 控制 - 服务)。
要了解如何从紧密耦合的架构转变为松散耦合的架构,请从this example开始。请注意,Service是一个静态类,它几乎具有作为Singleton的所有问题,只要鼓励紧耦合。即使只有一个使用该服务的类,想象一下如果你有一个大型项目会有数十或数百个类引用它会发生什么。现在想象一些事情需要改变。 ICK。
现在查看项目refactored,以便View只生成一个导致调用服务的事件。该服务仍然是静态的,但在此 如果只想知道一件事情(Mate),那么如果你想让它不是静态的,或者有时候使用不同的服务,你现在可以轻松地做到。
事实上,你可以很容易地改变事物this is the project,重构使用Robotlegs。您不一定非必须像我一样使用框架 - 您可以看到核心类中涉及的基本结构并不关心如何处理事件或数据如何进入视图。如果您不习惯使用Framework,请按照自己的方式处理它。但Frameworks已经存在了一段时间,他们已经解决了许多你还没有想到的问题。
答案 1 :(得分:2)
在没有看到任何代码的情况下建议是很棘手的,但是考虑将DatabaseService
类设为Singleton并将其初始化(和数据库连接)作为启动例程的一部分可能是值得考虑的(即,在使用它的类之前实例化)。这将确保使用DatabaseService
的所有类共享一个到数据库的单个连接链接,并且当它们使用它时链接可用。
ActionScript中的单例产生了一些争论,因为在其他语言中,模式依赖于将类构造函数的访问修饰符设置为私有的能力(在ActionScript 3.0中无法做到)。但是,您可以从详细here的几种方法中进行选择。
此外,单身人士一般会生成a fair bit of debate,在你愤怒地使用之前可能值得理解(因为你说你是OOP的新手,我假设你之前没有这样做过)。