2010-07-01 58 views
1

我有一個叫做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方法送達沒有明顯的目的。我重寫了這個方法,使它看起來更像是一個來自現實世界的方法。

回答

0

在其他的答案中指出:

  1. public staticList s爲不好的做法
  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); 
     } 
     ... 
    } 
} 
2

對象類型來自哪裏?將字符串值作爲某種類型傳遞是非常不明智的。考慮不同的選項:

  1. 爲這些值創建一個枚舉並使用它。如果需要,您可以隨時從字符串解析它或將其打印爲字符串。
  2. 也許有一些具體的方法是合理的:FeedObjectType1(object obj)等?這些變化的頻率如何?

如果沒有看到代碼的其餘部分,確實很難給出明確的答案。

從DataStructures類暴露公共靜態列表在大多數情況下不是一個好的設計。首先,我會考慮將它們設置爲私有,並提供一些方法來訪問所需的實際功能。我會考慮用addObject方法包裝列表,這樣就不必將列表作爲參數傳遞。但是我不知道你的情況是否合理。

2

您似乎使用DataStructures就像某種全局存儲。我不知道你在那裏存儲什麼,所以我會假設你有這個全球存儲的很好的理由。

如果是這樣,我會用一種新的對象替換每個列表,該對象處理數據的添加並執行與其相關的檢查。

是這樣的:

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

每個對象存儲類型得到此派生和提供它們自己的邏輯。或者它可以從Collection<T>或類似的東西,如果集合語義是有道理的。就像你現在的例子,我看不到ObjectFeed的用途,它作爲一個奇特的屬性訪問器。

選擇通過一個字符串訪問哪個屬性聽起來如果對我有用。這很容易出錯;我寧願使用Type -object中的任何對象通過GetType-methodtypeof()構造可用的對象。

但是,整個設置感覺有點不對我,DataStructures等。

首先,測試你的靜態類將很困難。我會繞過這些商店,而不是需要它們的類型。用其他東西替換它們也很困難,使用接口至少不會將您與具體的實現聯繫起來,但如果您想使用其他位置將對象存儲在其他代碼中,該怎麼辦?你的靜態類不再相關,你需要改變很多代碼。

也許這些東西超出了你的控制範圍,我不知道,示例代碼在這個意義上有點含糊。