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

时间:2010-07-01 16:05:58

标签: c# design-patterns refactoring

我有一个名为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 个答案:

答案 0 :(得分:2)

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

  1. 为这些值创建枚举并使用它。如果需要,您始终可以从字符串中解析它或将其打印为字符串。
  2. 也许有一些特定的方法是有意义的:FeedObjectType1(object obj)等?这些变化多久会发生变化?
  3. 如果没有看到剩下的代码,很难给出明确的答案。

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

答案 1 :(得分:2)

您似乎像某种全局存储一样使用DataStructures。我不知道你在那里存储了什么,所以我将假设你有充分的理由来存储这个全局存储。

如果是这样,我会用一种新的对象替换每个列表,该对象处理数据的添加并进行与之相关的检查。

类似的东西:

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

每个对象存储类型都将从此派生并提供自己的逻辑。或者,如果集合语义有意义,它可以从Collection<T>或类似的东西派生。就像你现在的例子,我看不到ObjectFeed的使用,它作为一个奇特的属性访问器。

选择通过字符串访问哪个属性听起来不对我说。它很容易出现错别字;我宁愿使用Type - 通过GetType-methodtypeof()构造从C#中的任何对象获得的对象。

然而。整个设置对我来说有点不对劲,DataStructures等等。

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

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

答案 2 :(得分:0)

正如其他答案所指出:

  1. public static List是不好的做法
  2. 由于addObject方法对于每个数据结构都是相同的,因此应将其实现为数据结构访问器。
  3. 为此,我将数据结构的实例化移动到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);
            }
            ...
        }
    }