2012-08-31 112 views
0

我有一個類:DatabaseService.as該類創建一個本地sqlite連接並創建表(如果它們不存在)。連接鏈接將被其他幾個類使用。有些類會在用戶交互時啓動其他類。 「數據庫服務」類在數據庫連接打開時調度事件。其他類初始化「DatabaseService」類並等待「DatabaseReadyEvent」。 這很好,但我需要多次調用同一個類中的函數/方法時該怎麼辦?Actionscript OOP多方法調用體系結構問題

實施例:

創建在MXML組件 「PrefService」 類的實例。 「PrefService」在其構造函數中創建一個新的「DatabaseService」類。然後等待「DatabaseReadyEvent」並執行sql查詢(這工作正常)。但是接下來我還需要在「PrefService」類中調用「addDir」方法(以及其他幾個方法),並且sqlConnection屬性尚未設置,從而導致錯誤。我該如何處理這個問題?我是新來OOP,所以我可能失去了一些東西很簡單......

我已經試過/我的想法:

  1. 我可以檢查是否在SqlConnection的「PrefService」類,但我存在認爲這將是不好的做法,仍然需要某種延遲機制。

  2. 我也可以爲每個方法創建一個「DatabaseService」類的新實例,並添加一個新的事件偵聽器,但這對於每個方法調用不提及事件的2個函數都會非常麻煩。

這種情況下最好的選擇是什麼?

回答

2

建議在看不到任何代碼的情況下很難處理,但可能值得考慮使DatabaseService類爲Singleton,並將其初始化(和數據庫連接)作爲啓動例程的一部分(即在類之前使用它被實例化)。這將確保使用DatabaseService的類全部共享一個到數據庫的連接鏈接,並且鏈接在它們使用它時可用。

ActionScript中的單例產生了一些爭議,因爲在其他語言中,模式依賴於將類構造函數的訪問修飾符設置爲私有(在ActionScript 3.0中無法實現)的功能。但是,您可以從幾種方法中選擇詳細的here

另外,單身人士通常會生成a fair bit of debate,這在你使用憤怒之前可能是值得理解的(因爲你聲明你是OOP的新手,我假設你之前沒有這麼做)。

+0

感謝您的回覆。我擔心我將不得不深入研究設計模式:)看起來像是對單身人士很討厭的東西,會更多地閱讀設計模式,也許我會使用代理,謝謝! – DominicM

+1

你不會後悔花時間學習設計模式;只要記住它們只不過是針對常見編程問題的嘗試和測試解決方案。在這個階段,我不會過分擔心Singleton模式所帶來的不好的壓力(我只是認爲這不應該提及它)。如果它有助於解決您的問題,那麼我會建議您使用它,如果不是,則使用另一種方法(代理模式可能很適合)。 –

+0

我可能會使用單例作爲DatabaseService,因爲它只需要一個實例,像其他模式的代理模式對於OOP noob來說並不是那麼簡單:) – DominicM

3

對辛格爾頓的仇恨是well-deserved。我建議你永遠不要養成使用它的習慣,所以當你發現維護有多可怕時,你不必違背這種習慣。

你最大的錯誤是讓你的視圖創建和執行你的服務。不幸的是,FB服務生成代碼的工作方式鼓勵了這一點。相反,你需要的是更像MVCS(模型 - 視圖 - 控制 - 服務)的類型,如Robotlegs所鼓勵的類型。

要了解如何從緊耦合架構轉換爲鬆耦合架構,請從this example開始。請注意,該服務是一個靜態類,幾乎所有的問題都作爲一個單例,直到鼓勵緊密耦合。即使只有一個使用該服務的類,想象一下,如果您有一個大型項目,其中有幾十個或幾百個類引用它,會發生什麼。現在想象一下需要改變的地方。伊克。

現在查看項目refactored,以便View僅生成導致調用服務的Event。該服務仍然是靜態的,但在這種情況下,只有一件事情知道它(伴侶),所以如果你想讓它不是靜態的,或者有時使用不同的服務,那麼現在就可以輕鬆實現。

事實上,你可以很容易地改變周圍的東西,this is the project,重構使用Robotlegs。像我一樣,您不一定非要使用框架 - 您可以看到,核心類中包含的基本結構並不關心如何處理事件或數據如何進入視圖。如果你不習慣使用框架,請按照自己的方式處理它。但框架已經有一段時間了,他們已經制定了很多你還沒有想到的問題。

+1

+1好的建議。 http://puremvc.org/也可能是一個值得考慮的框架(非常成熟,得到很好的支持並適用於其他語言)。使用框架也是設計模式正確使用的一個非常好的介紹(值得注意的是幾乎所有的都使用了Singleton模式)。 –

+0

我很喜歡RobotLegs,如果它不會讓我感到困惑和激動,我會嘗試實現它(到目前爲止,它對我來說有點外國,但不是太複雜),感謝您的深入解答! @ net.uk.sweet PureMVC現在對我來說可能有點多:) – DominicM

+0

當然PureMVC和Cairngorm的老版本一樣使用Singleton。這是人們離開他們的主要原因。 –