代码之家  ›  专栏  ›  技术社区  ›  Amichai

一种发送要添加到适当数据结构的对象的设计

  •  1
  • Amichai  · 技术社区  · 16 年前

    我有一门课叫 DataStructures public static 存储对象的数据结构。将对象添加到数据结构是一个复杂的过程,需要执行大量检查、记住过程和重新排列数据。在另一个叫做 Foo ,我需要向数据结构添加对象。 ObjectFeed 它将对象和对象的标签作为参数。标签将告诉方法应该将对象添加到哪些数据结构中。我还有一个方法叫做 addObject 将要附加的对象和适当的目标数据结构作为参数:

    Public Class DataStructures
    {
        public static List<obj> object1Storage = new List<obj>();
        public static List<obj> object2Storage = new List<obj>();
        ...
    }
    
    Public Class Foo
    {
        public void ObjectFeed(/* PARAMETERS */)
        {
          //Code that generates an object called inspectionObject
          //inspection object has an associated enum Type
            if(objectType == Type.Type1)
            {
                 addObject(inspectionObject, DataStructures.object1Storage);
            }
            if(objectType == Type.Type2)
            {
                 addObject(inspectionObject, DataStructures.object2Storage);
            }
            ...
        }
    
        private void addObject(obj inspectionObject, List<obj> objStorage)
        {
            objStorage.Add(inspectionObject);
            //And a lot more code
        }
    }
    

    编辑:

    在我最初设计的示例中,ObjectFeed方法没有明显的用途。我重写了这个方法,使它看起来更像现实世界中的一个方法。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Grzenio    16 年前

    对象类型来自哪里?传递一个字符串值作为一种类型的东西很少是一个好主意。考虑不同的选择:

    1. 为这些值创建一个枚举并使用它。如果需要的话,您可以从字符串中解析它或将它打印到字符串中。
    2. 也许有几个特定的方法是有意义的:FeedObjectType1(objectobj)等。?多久更换一次?

    不看代码的其余部分就很难给你一个明确的答案。

    从DataStructures类中公开公共静态列表在大多数情况下都不是一个好的设计。首先,我会考虑将它们私有化,并提供一些方法来访问所需的实际功能。我会考虑用addObject方法包装列表,这样就不必将列表作为参数传递。但我也不确定这对你来说是否有意义。

        2
  •  2
  •   Skurmedel    16 年前

    你好像用了 DataStructures 就像某种全球存储。我不知道你在那里存储了什么,所以我假设你有充分的理由使用这个全局存储。

    比如:

    interface IObjectStorage
    {
       void Add(object obj);
       void Remove(object obj);
    }
    

    Collection<T> 或者类似的东西,如果集合语义有意义的话。正如您现在的示例所示,我看不出ObjectFeed的用途,它充当了一个奇特的属性访问器。

    在我看来,选择通过字符串访问哪个属性是不确定的。它很容易出错;我宁愿用 Type GetType-method typeof()

    然而。我觉得整个设置有点不对劲, 等。

    首先,测试静态类会很困难。我会把这些商店转给需要它们的人。用其他东西替换它们也很困难,使用接口至少不会将您绑定到具体的实现,但是如果您想使用另一个位置在其他代码中存储对象呢?您的静态类不再相关,您需要更改许多代码。

    也许这些事情超出了你的控制,我不知道,示例代码在这个意义上有点模糊。

        3
  •  0
  •   Amichai    16 年前

    正如其他答案所指出的:

    1. 这个 public static List 这是坏习惯
    2. 自从 addObject

    为此,我将数据结构的实例化移到了Foo中,并将addObject方法从Foo移到了一个名为StorageLibrary的新类中,该类更准确地表示了数据结构体系结构。

    private class StorageLibrary 
    {
        private List<obj> storedObjects = new List<obj>();
        public void addObject(obj inspectionObject)
        {
            storedObjects.Add(inspectionObject);
            //And a lot more code
        }
    }
    
    public class Foo : StorageLibrary
    {
        //Declaration of libraries
        public static StorageLibrary storage1 = new StorageLibrary();
        public static StorageLibrary storage2 = new StorageLibrary();
        ...
    
        private void ObjectFeed(/* PARAMATERS */)
        {
            //generate objects
    
            if (objectType == Type.Type1)
            {
                storage1.addObject(inspectionObject);
            }
            if (objectType == Type.Type2)
            {
                storage2.addObject(inspectionObject);
            }
            ...
        }
    }