2009-04-21 47 views
0

我對Flex/ActionScript比較新,但我一直在使用一種模式,在我的util包中爲每個函數創建一個文件 - 文件的名稱與函數的名稱相同。就像如果文件convertTime.as:每個功能一個文件...真的嗎?

package util{ 
    public function convertTime(s:String):Date{ 
     ... 
    } 
} 

這樣我可以做很容易導入功能:

import util.convertTime; 
... 
convertTime(...); 

我喜歡這種方式不是導入的類對象,然後調用靜態方法更好掛了吧,像這樣:

import util.Util; 
... 
Util.convertTime(...); 

但是,我越這樣做,更多的文件,我會擁有,而且似乎也有點浪費/傻乎乎地把只有一個功能到一個文件特別是當功能很小。還有另外一種選擇嗎?或者這兩個選項是我擁有的唯一選項?

更新:經過一番研究,我也在下面發表了自己的回答。

+1

額外的實用程序不只是噪音。在一個適當的設計中,它會告訴你所調用的方法。說,DateUtils.convertTime()是不同於TimeMachine.convertTime(),和Quotes.random()是不同於RandomIntegerGenerator.random() – Hejazzman 2009-04-21 23:37:06

+0

好吧,如果你只關心一個random()函數,那麼對我來說額外的東西不過是垃圾。 – airportyh 2009-04-21 23:46:24

+0

如果你只根據你目前「關心」的內容進行編碼,那麼你沒有正確地思考你的程序結構。這並不意味着將事物過度設計成「未來的證明」,但是像正確的命名空間這樣的東西是必不可少的。 此外,這不是關於你 - 這是一個有用的線索,誰也可能最終使用你的代碼。即使你只是爲自己編程,這是一個很好的習慣。 – Hejazzman 2014-12-20 15:46:06

回答

5

是的,這些是實用程序庫的兩個主要選項。我們實際上將這兩種方法用於我們的通用實用功能。對於我們認爲應該實際構建的一小部分函數(比如map()),我們爲每個文件添加一個函數,以便我們可以直接使用函數。

對於更多隱晦/特殊效用函數,我們不想污染我們的全局命名空間,因此我們使它們成爲實用程序類的靜態函數。通過這種方式,我們確信當某人引用ArrayUtils.intersect()時,我們知道庫的intersect()來自哪裏,它大概是什麼(它與兩個數組相交)。

我建議儘可能使用後者的路線,除非你有一個功能,a)你非常頻繁地使用b)真的很明顯它的功能一目瞭然。

+0

謝謝Scotty!不僅僅是爲了一個好的答案,而且是爲了更好的=) – airportyh 2009-04-21 23:58:55

3

我終於遇到了一些其他的替代品,並認爲我會在這裏分享他們。

方案1 - 使用的傳承

這可能是一個明顯的答案,但是是有限的。你可以把你的靜態方法放到父類中,繼承它們以使它們進入子類。這隻適用於課程。另外,由於ActionScript是單一繼承,因此只能繼承一次。

方案2 - 別名的方法

你還是寫效用函數爲靜態方法掛UTIL類,但你的別名,讓您能有一個較短的名稱訪問它們,例如:

import mx.binding.utils.BindingUtils; 
var bind:Function = BindingUtils.bindProperty; 

現在,你可以叫

bind(...); 

,而不是比冗長

BindingUtils.bindProperty(...); 

您可以在類作用域和函數作用域內執行此操作,但不能在包範圍內執行此操作 - 因爲顯然您只能在包內部具有一個可見屬性。如果您在類範圍內執行此操作,則需要確保它與您的其他類屬性名稱不衝突。

方案3 - 使用包括

this flexonrails blog post描述,您可以使用包括模擬在ActionScript一個mixin。 include與導入的不同之處在於,它所做的全部操作都是複製包含的所有文件並將其粘貼到包含該文件的位置。因此,它完全沒有處理命名空間問題,你不能像導入那樣引用它的完整路徑名,如果你有名字衝突,那麼你自己用這個名字。與導入不同,它會創建相同代碼的不同副本。但是你可以用來做什麼,把任意數量的函數放在一個文件中,並將它們包含到另一個文件的類或函數範圍中。例:

// util/time_utils.as 
function convertTime(..){ 
    ... 
} 
function convertDate(..){ 
    ... 
} 

要包括:

include 'util/time_util.as'; // this is always a relative path 
... 
convertTime(...); 
0

@ an0nym0usc0ward

OOP是簡單地合併等,其可以被導入和使用的功能或性質成一個對象的方法。它只不過是你的代碼的一種組織形式,所有的代碼在處理器中最終都是程序執行的,OOP只是源代碼的組織。他在這裏做的事情可能不像你從書中學到的那樣是面向對象的,但它最終完成了同樣的事情,並且應該以同樣的尊重來對待。

任何真正瞭解OOP的人都不會天真地認爲OOP的批准和記錄形式是唯一可能的方式來反對您的代碼。

編輯:這本應該是an0nym0usc0ward的粗魯評論告訴他學習面向對象的評論迴應。但我想我把它輸入在錯誤的框中:)