2011-06-09 132 views
5

這聽起來有點愚蠢,但我仍然對社區的想法感到好奇。
所以我有一個WebService返回一個UpdateInfo類。
現在考慮下面的定義C#類型設計問題

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK 
} 
public class FileUpdateInfo 
{ 
    public string FileName; 
    public string FileDownLoadURI; 
    public TTCFileType FileType; 
} 
public class UpdateInfo 
{ 
    public FileUpdateInfo fuInfo; 
    //Other 
} 

這裏是問題,如果TTCFileType的值爲對勾標記,然後我需要另一個枚舉即對勾標記類型(BIZ邏輯要求這些信息)。我想知道什麼是最好的方式來表達。我不想在這裏我有一些像

UpdateMethod(UpdateInfo ui, TickMarkType tt) 

,我檢查是否ui.fuInfo.FileType == TTCFileType.TICKMARK
我想我試圖找到一個半優雅的方式至少代表爲獲得第二塊的條件要求TT的方法簽名信息了(在很多方面,這讓人想起了VARIANTS,如果var.VT == VT_ [thingy]然後使用vt。[thingy]和是的,我知道c#開發人員對工會的感受如何:-)
無論如何,好奇的是,如果有漂亮的方法來做到這一點 謝謝

+0

你可以使用'可空'又名'TickMarkType?',那麼你可以通過在如果不使用它,而不是隨機的'TickMarkType'。雖然我不確定這究竟是什麼。 – 2011-06-09 07:10:18

+0

嗯不知道這是否是我想要的,在很多方面,像我說的,我只是覺得它有趣,它不是一些火箭科學類型的問題,我只能說,是的,你將不得不採取一種類型的價值,你會除非另一個參數等於某個值,否則忽略。WIN32 API充滿了這樣的東西,如果dwParamthing是-1,那麼pszPointer將被忽略,等等,所以它沒有錯,這只是想知道是否有更好的 – Rahul 2011-06-09 07:13:23

回答

0

理想情況下,你需要兩個額外的結構(S)

public enum TickmarkType 
{ 
    TYPE1=0, 
    TYPE2 
} 

public class TickMarkFileUpdateInfo : FileUpdateInfo 
{ 
    public TickmarkType type; 
} 

,然後閱讀有關polymorphism in web services

1

只包括TickMarkType字段FileUpdateInfo課?

+0

yup看起來雖然最簡單,儘管如果第一個枚舉值不是TICKMARK。我知道我知道浪費並不多:-)。在所有誠實中,這可能是我會與:-) – Rahul 2011-06-09 07:15:21

0

將枚舉值存儲爲int。爲第二枚枚舉值(例如1000)添加一些偏移量,以便如果該值來自第一枚枚舉,則該枚舉值爲0..2,如果它來自第二枚枚舉值則爲1000.1010或其他值。然後你可以設置2個屬性,一個返回一個可爲空的TTCFileType,另一個返回一個可空的TickType,以讀取和寫入到int字段中的值。

+0

嗯有趣的非常有趣。我確實相信這很聰明 – Rahul 2011-06-09 07:16:20

1

我會忍不住去的東西,如:

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK_TYPE1 = 100, 
    TICKMARK_TYPE2 = 101, 
    TICKMARK_TYPE3 = 102 
} 

等。取決於你的代碼在更廣泛的範圍內會有多少和可以管理多少。

+0

我也會這樣做。我們對日誌條目類型有很大的枚舉 - 我們按照上面的方法對它們進行分類(儘管在1000,2000,3000條的情況下) – christofr 2011-06-09 07:30:31

0

看起來你試圖只使用數據結構,當使用面向對象的功能(如繼承)可能會幫助你。也許這個示例代碼給你一些想法:

public class Update 
{ 
    // ... ? 
} 

public class FileUpdate : Update 
{ 
    public virtual string Name { get; set; } 
    public virtual string DownloadUri { get; set; } 
    public virtual bool IsTickMarked { get; set; } 
} 

public class ApiFileUpdate : FileUpdate 
{ 
    // ... 
} 

public class BookmarkFileUpdate : FileUpdate 
{ 
    // ... 
} 

你仍然可以序列化這些,給定正確的序列化屬性。

實際上,您可以在這些不同的類上定義(可能是虛擬的)方法,並且實際使用它們來實現您的程序。

過分隔離您的數據和代碼稱爲Anemic Domain Model Anti-Pattern