1

嗯,所以我的标题有问题,但这是我最好的镜头!

情况:我正在编写一个库,以便我可以轻松地在未来的项目中重用我的代码,而无需考虑内部结构。该库应该能够在运行时创建对象,然后通过方法访问它们以执行任务。所有这些都通过使用易于使用的标识符来实现。

像这样的东西:

class Manager
{
    Object[] Foo;
    // Other stuff + initialization logic

    CreateFoo(/*Some parameters here + Identifier*/)
    {
        // Create a new Foo here;
    }
    AddBar(/*Moar parameters + Foo identifier*/)
    {
        Foo[StoID(identifier)].AddBar(/*Params*/);
    }

}

class Software
{
    Software()
    {
        // Create a lot of Foos.
        while(1)
        {
             manager.CreateFoo(/*Params*/);
        }
    }
    void OhHai()
    {
        // This method can be called a LOT (100 times per update) or not at all       
        // depending on circumstances.
        manager.AddBar(/*Params*/);
    }
}

免责声明:不,这实际上不是我的代码愚蠢!

问题:我可能很想访问我的 Foo 对象,性能很重要,但可管理性和易用性也很重要。例如,我的第一个想法是使用字符串和数组索引来创建一个小型的动态转换库。然而,这将意味着大量的迭代 - 取决于创建了多少 Foos - 和字符串比较。

例子:

class Software
{
    Manager manager;
    Software()
    {
        manager.CreateFoo("Lol", /*Parameters*/);
        manager.CreateFoo("Cat", /*Parameters*/);
    }
    void OhHai()
    {
        manager.AddBar("Lol", /*Parameters 1*/;
        manager.AddBar("Cat", /*Parameters 2*/;
    }
}

用索引直接访问 Foo 的性能肯定比先把字符串转为 id 好很多。然而,字符串很容易由人类管理,因此易于使用将是完美的。

我要问的是:这些事情通常是如何处理的,有人对我应该如何设计这个有建议吗?

编辑:基本上我试图找到一种简单的方法让我的经理知道要向哪个 Foo 添加 Bar !:)

4

3 回答 3

2

我可能在这里遗漏了一些东西,但看起来您想要用作后备存储的是字典对象而不是数组。

索引到字典的时间是 O(1)。你无法打败恒定的时间。:)

好吧,如果你的常数时间真的很长,你可以,但它不是用于字典检索。只要确保您的 GetHashCode 方法产生良好的哈希值,您就应该是黄金。

于 2010-06-30T15:31:03.287 回答
0

这种方法有点味道……但这只是我的看法。

我认为您尝试做的很多事情都可以通过像 Spring.NET 这样的 DI 框架来完成。它将允许您通过“友好名称”创建对象并将其注入代码中,而不必担心它们的精确类型(只要它们实现某个接口或扩展某个基类)。

于 2010-06-30T15:36:55.110 回答
0

你为什么不在这里改变你的班级

class Manager
{
    Foo CreateFoo(/*Some parameters here + Identifier*/)
    {
        // Create a new Foo here AND return it
    }
    void AddFoo(Foo foo)
    {
     // adds to yor collection
    }
    AddBar(/*Moar parameters + Foo instance*/)
    {
        foo.AddBar(/*Params*/);
    }

}
于 2010-06-30T15:39:50.380 回答