2

私の問題を説明する素晴らしい例を挙げましょう。

多くのユーザーがさまざまな種類の「投稿」(写真、ステータスなど) を投稿できるアプリケーションを構築しているとします。この場合、写真とステータスだけを使用しましょう。

私が現在どのようにデータをモデリングしているか、またこれを改善できるかどうか (および私が間違っていること) を示します。

私は一般的な Post クラスを持っています:

public class Post<T>
{
    public Guid Id { get; set; }

    public User Owner { get; set; }

    public DateTime CreatedDate { get; set; }

    public PostType Type { get; set; }

    public T Data { get; set; }
}

それから私は PostType 列挙型を持っています:

public enum PostType
{
    Photo,
    Status
}

次に、それぞれの写真とステータスのクラスがあります

public class Photo
{
    public string Url { get; set; }

    public int Width { get; set; }

    public int Height { get; set; }
}

public class Status
{
    public string Text { get; set; }
}

このデータをモデル化するための現在のソリューションを追求すると、問題が発生することはわかっています。

タイプに関係なく最新の25件の投稿を返す方法や、投稿のタイプを指定せずにIDで特定の投稿を返す方法などすでにいくつかの問題点にぶつかっています(ユーザーは気にする必要がないため.

私のデータのモデリングは完全に間違っていますか? もしそうなら、改善のための提案はありますか?

4

2 に答える 2

1

両方の問題は、投稿タイプに依存しない基本クラスを持つことで解決できます。

public abstract class Post
{
    public Guid Id { get; set; }

    public User Owner { get; set; }

    public DateTime CreatedDate { get; set; }

    public PostType Type { get; set; }
}

クラスPostはそれから継承できます。

public class Post<T> : Post
{
    public T Data { get; set; }
}

任意のタイプの投稿を返す必要があるメソッドは、正しいタイプを返すことができますが、呼び出し元はそれらに基本Postタイプとしてアクセスし、必要に応じてキャストします。

Post GetPostById(int id);
IEnumerable<Post> GetLatestPosts(int count);
于 2012-11-19T05:57:09.540 に答える
0

タイプに関係なく、最新の 25 件の投稿を返すにはどうすればよいですか

あなたの設計では aPhotoと a の間に共通点がなくStatus、ジェネリックPost<T>がありますが、ここではTs をバッチで処理できないため、できません。より良い設計は、次のようなものになります。

public interface IPostable
{
    Guid Id { get; set; }

    public DateTime CreatedDate { get; set; }

    PostType PostType { get; }
}

public class Photo : IPostable
{
    //special properties for photo
    public string Url { get; set; }

    //implement the interface
    public PostType PostType { get { return PostType.Photo; } }
}

public class Status : IPostable
{
    public string Text { get; set; }
    public PostType PostType { get { return PostType.Status; } }
}

次に、常にIPostableバッチで処理します。

Id で特定の投稿を返すにはどうすればよいですか

上記の設計によれば、IPostableid はそのプロパティの 1 つであるため、id によってインスタンスを簡単に取得でき、そのプロパティを判断して厳密に型指定されたインスタンスを返すことができPostTypeます。

public IPostable GetPost(Guid id)
{
    //id is a property of IPostable, so everything is easy
}

//you can easily get the real type
public T GetPost<T>(Guid id)
{
    IPostable post = GetThePostFirst();
    if (post.PostType == PostType.Photo) return (Photo)IPostable;
    //etc.
}
于 2012-11-19T06:14:55.620 に答える