[英]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.