开发者

C# type design Question [closed]

Closed. This question is opinion-based. It is not currently accepting answers.

Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.

Closed 4 years ago.

Improve this question

This might sound a little stupid but I am still curious about what the community thinks.

So I have a WebService returning a UpdateInfo class.

Now consider the following definitions

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 
}

Here is the issue, if the TTCFileType has the value TICKMARK then I need another enum viz Tickmark Type( the biz logic demands this information). I am wondering what is the best way to represent that. I dont want a method signature where I have something Like

UpdateMethod( UpdateInfo ui, TickMa开发者_如何转开发rkType tt)

where I examine tt if ui.fuInfo.FileType == TTCFileType.TICKMARK

I guess I am trying to find an semi elegant way at least to represent the conditional requirement for getting the second piece of information out ( in many ways this so reminds of VARIANTS , if var.VT == VT_[thingy] then use vt.[thingy] and yes I know how c# developers feel about unions :-)

Anyway curious if there is a nifty way to do this Thanks


Just include TickMarkType field to FileUpdateInfo class?


I'd be tempted to go with something like:

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

and so on. Depending on how many there are and how manageable it would feel within the wider context of your code.


Ideally, you need two additional structure(s)

public enum TickmarkType 
{ 
    TYPE1=0,
    TYPE2
}

public class TickMarkFileUpdateInfo : FileUpdateInfo
{
    public TickmarkType type;
}

And then read about polymorphism in web services


Store the enum value as an int. Add some offset to the value for your second enum (e.g., 1000) so that if the value is from the first enum it's 0..2 and if it's from the second enum it's 1000.1010 or whatever. Then you can set 2 properties, one that returns a nullable TTCFileType and the other that returns a nullable TickType, to read and write the values into the int field.


It seems like you're trying to use only data structures, when using OO features (such as inheritance) might help you. Maybe this example code gives you some ideas:

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
{
    // ...
}

You can still serialize these, given the proper serialization attributes.

In fact, you can define (potentially virtual) methods on these various classes, and actually use them to implement your program.

Overly segregating your data and code is known as the Anemic Domain Model Anti-Pattern.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜