[英]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方法没有明显的用途。 我重写了这个方法,看起来更像是来自现实世界的方法。
对象类型来自哪里? 将字符串值作为一种类型传递很少是一个好主意。 考虑不同的选择:
如果没有看到其余的代码,很难给出明确的答案。
在大多数情况下,从DataStructures类公开公共静态列表并不是一个好的设计。 首先,我会考虑将它们设为私有,并提供一些方法来访问所需的实际功能。 我会考虑使用addObject方法包装列表,这样您就不必将列表作为参数传递。 但是我再也不确定你的情况是否合理。
您似乎像某种全局存储一样使用DataStructures
。 我不知道你在那里存储了什么,所以我将假设你有充分的理由来存储这个全局存储。
如果是这样,我会用一种新的对象替换每个列表,该对象处理数据的添加并进行与之相关的检查。
就像是:
interface IObjectStorage
{
void Add(object obj);
void Remove(object obj);
}
每个对象存储类型都将从中派生出来并提供自己的逻辑。 或者如果集合语义有意义,它可以从Collection<T>
或类似的东西派生。 就像你现在的例子,我看不到ObjectFeed的使用,它作为一个奇特的属性访问器。
选择通过字符串访问哪个属性听起来对我来说。 它很容易出现错别字; 我宁愿通过GetType-method
或typeof()
构造使用C#中任何对象提供的Type
-objects。
然而。 整个设置对我来说有点不对, DataStructures
等。
首先,测试你的静态类将很难。 我会将这些商店转移到需要它们的类型。 用其他东西替换它们也很难,使用接口至少不会将你绑定到具体的实现,但是如果你想使用另一个位置将对象存储在其他代码中呢? 您的静态类不再相关,您需要更改大量代码。
也许这些事情是你无法控制的,我不知道,在这个意义上,示例代码有点模糊。
正如其他答案所指出:
public static
List
是不好的做法 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.