2010-05-13 61 views
6

最近我開始注意到我的一些代碼中有重複。當然,一旦你注意到重複,它就會變成光柵。這就是爲什麼我問這個問題。這個概念是否有一個術語,它是否存在於靜態類型語言中?

想法是這樣的:有時你寫同一類的不同版本:原始版本,鎖定版本,只讀外觀版本等。這些是對類的常見事情,但翻譯是機械強度高。使用鎖定獲取/釋放等方法來環繞所有的方法。在動態語言中,你可以編寫一個函數,這個函數對一個類的實例做了這樣的事情(例如迭代所有的函數,用一個獲取/釋放鎖。)。

我認爲我的意思是一個很好的術語是'反映階級'。你創建一個接受一個類的轉換,並返回一個想要修改的類。同步是最簡單的情況,但還有其他一些:使一個類不可變[包裝方法,以便它們克隆,變異克隆,並將其包含在結果中],使類只讀[假定您可以識別變異方法],創建一個類似乎與類型A而不是類型B一起工作等。

重要的部分是,理論上這些轉換在編譯時是有意義的。即使ActorModel具有依賴於T而改變的方法,但它們以在編譯時可知的特定方式依賴於T(ActorModel <T >方法將返回原始結果類型的未來)。

我只是想知道這是否已經實現了一種語言,它叫什麼。

回答

2

如果我沒有理解好了,你想能夠通過現有類型的轉換來生成新的類/類型。像

class Synchronized<T> { 
    Object invocation(Object ... args) { 
     synchronize(this) { 
      return original.invocation(args); 
     } 
    } 
} 
... 
Foo f; 
Synchronized<Foo> f2; 
f.bar(); 
f2.bar(); // would be valid for the type-system 

,其中invocationoriginal東西將是這本小說抽象的關鍵詞。

新的類型可以被看作是一個代理/包裝/適配器周圍的原始類型。那麼新型是否仍然代表原件的一個子類型是另一個問題。提取多少支持改變返回類型也是另一個問題。

雖然字節碼檢測,AOP或自定義類加載器可以實現這一部分,但我認爲精神上最接近的匹配是動態代理。動態代理的代碼看起來非常糟糕,類似於我上面寫的代碼。 Here,herehere是我用動態代理解決的情況。當然,動態代理不是靜態的,而是如名稱所示,是動態的。

我擔心您描述的一般問題 - 如何創建現有類型的變體 - 太寬泛。類型系統擴展的命題已經針對特定情況進行了,例如,如何從接口X創建一個適配器到Y,這樣X的所有具體實現也可以看作是Y的實現。

也許看看這些文章(我沒有看過他們所有,但我打算):

對於最後一個,抽象的說:

我們討論的介紹, 標準術語的確切好處和我們的擴展的 成本,並說明 均勻可用 代理的有效性通過實現未來的方法 安全地調用和 透明。

,這是你的問題之一。

酷問題btw,我希望你的問題的一個通用的解決方案存在。我不會假裝成爲這個主題的專家,所以甚至可能會有一個,但我不知道。

1
+0

它聽起來很相似,涵蓋了一些情況。但是,使用方面,我可以參加一個班,讓方法返回期貨而不是正常值嗎? – 2010-05-13 15:55:30

+0

您通常不能用AOP更改返回類型,有一點重要的是使用它的代碼不知道這些方面。 – 2010-05-26 13:10:21

0

難道你不能用模板做到這一點嗎?這將是輕微的hackish,但類似:

#define LOCKED = true; 
#define UNLOCKED = false; 

template<bool lock> 
void doStuff(){ 
    if(lock){ 
     // get lock 
    } 
    // other code 
    if(lock){ 
     // release lock 
    } 
} 
+0

我不知道。我從來沒有真正探索過C++模板的極限。他們可以創建一個其方法基於子類方法的類嗎? – 2010-05-13 15:53:21

+0

你可以創建一個你的子類的實例作爲成員變量,然後使用它的方法?或者如果它們是靜態函數,你可以使用它們作爲SubclassName :: functionName()' – 2010-05-15 22:37:08

0

Python有decorators這與您所談論的內容有關。

+0

我認爲裝飾器適用於類的定義而不是實例化。另外,我特別詢問了靜態情況,因爲動態語言使這些轉換變得相對容易。 – 2010-12-11 21:25:05

+0

@Strilanc:我比我應該更快地閱讀你的問題。但裝飾器只是適用於類的函數,你原則上可以裝飾一個類並在本地實例化一個對象。 – 2010-12-11 21:31:06

相關問題