2013-12-20 26 views
0

我正在開發一個自然語言處理項目(在C#中),我需要通過它們的索引來引用單詞而不是字符串本身來加快速度。例如,句子"i am what i am"應存儲爲"0 1 2 0 1"單身人士比傳遞同一個物體更好嗎?

在這個項目中,有很多類以這種方式存儲句子。爲了解決這個問題,我最初計劃爲它實現一個名爲Codebook的單例類,以便在我的項目的任何地方,每當我需要將一個單詞的字符串轉換爲其索引(或通過索引獲取字符串)時,需要說的是Codebook.Instance.Convert(n)或類似的東西。

但是,這會導致麻煩,因爲我需要有幾個Codebook s用於不同的用途(例如,一個用於中文,一個用於英語,甚至一個用於詞性標籤標籤),所以我想到了另一種方式到它。在我的項目結構的最頂端,我創建了一個Codebook的實例,然後我將它傳遞給所有人。這樣,幾乎每個處理句子的方法都會有Codebook參數。由於在C#中,傳遞對象的形式是引用形式而不是其實際內容,所有Codebook對象的外觀都指向同一個對象。

所以我的問題是,第二種方法會導致問題,如果Codebook對象多次傳遞?我擔心,因爲在我的項目中使用索引而不是字符串本身是密集型的。我知道單身模式可以解決我的問題,但正如我所說的,我不能使用它。所以我需要知道第二種方法是否可以,比如說,有一長串的方法調用,同一個Codebook對象應該沿着這個方向調用。

+0

一個單身人士總是聽起來很舒服。想想你會節省的所有時間!問題是,它規避了面向對象設計的結構化方法,並且最終會讓你的頭被束縛在一起。如何做一個單身人士的圖表?它是關聯還是組合? – Gusdor

回答

1

通常我會通過構造函數使用Depedency injection。只需將代碼簿傳遞給構造函數,即可在您的課堂中保留只讀引用。這樣你就可以確保你的所有課程都有正確的代碼書。單件方法也可以處理這個問題,但是測試和維護會更困難。

public class MyBusiness{ 
    public MyBusiness(Codebook codebook){ 
     Codebook = codebook; 
    } 

    private readonly Codebook Codebook; 

    ... 
} 
0

您在上面的一條評論中說過,因爲您需要不同語言的代碼書,所以不能使用單例。如何創建另一個類,並將CodeBook列表(或帶有語言作爲關鍵字的字典,以便您可以適當地獲取它)作爲其屬性之一,並將新類作爲單例。通過這種方式,你總能得到相同的對象,但也有一批碼書。