我正在开发一个自然语言处理项目(在C#中),我需要通过它们的索引而不是字符串本身来引用单词以加快速度。例如,句子"i am what i am"
应存储为"0 1 2 0 1"
。
在这个项目中,有很多类以这种方式存储句子。为了解决这个问题,我最初计划为它实现一个名为Codebook
的单例类,这样在我的项目中的任何地方,每当我需要将一个单词的字符串转换为它的索引(或者通过索引获取字符串)时),我需要说的是Codebook.Instance.Convert(n)
或类似的东西。
然而,这会导致麻烦,因为我需要有几个Codebook
用于不同的用途(例如,一个用于中文,一个用于英语,甚至一个用于词性标注标签),所以我想另一种方式。在项目结构的最顶层,我创建了一个Codebook
的实例,然后我将它传递给所有人。这样,几乎每个处理句子的方法都会有一个Codebook
参数。因为在C#中,传递一个对象是以引用的形式而不是它的真实内容,所以Codebook
个对象的所有外观都指向同一个。
所以我的问题是,如果Codebook
对象多次传递,第二种方法会导致问题吗?我很担心,因为在我的项目中使用索引而不是字符串本身。我知道单身方法可以解决我的问题,但正如我所说,我不允许使用它。所以我需要知道第二种方法是否可以,比方说,有一长串方法调用,同一个Codebook
对象应该通过。
答案 0 :(得分:1)
通常我会通过构造函数来使用Depedency注入。只需将代码簿传递给构造函数,即可在类中保留只读引用。这样您就可以确保在所有课程中都拥有正确的代码簿。单身方法也可以解决问题,但是测试和维护会更难。
public class MyBusiness{
public MyBusiness(Codebook codebook){
Codebook = codebook;
}
private readonly Codebook Codebook;
...
}
答案 1 :(得分:0)
您在上面的一条评论中说过,因为您需要使用不同语言的代码簿,所以不能使用单例。如何创建另一个类并将CodeBook列表(或者以语言为键的字典,以便您可以适当地获取它)作为其属性之一,并将新类作为单例。这样你总能获得相同的对象,但也有一组Codebook。