簡體   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