繁体   English   中英

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

[英]A design for sending objects to be added to the appropriate data structure

我有一个名为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方法没有明显的用途。 我重写了这个方法,看起来更像是来自现实世界的方法。

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

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

如果没有看到其余的代码,很难给出明确的答案。

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

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

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

就像是:

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

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

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

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

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

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

正如其他答案所指出:

  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);
        }
        ...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM