Re[4]: Entity Framework за! и против!
От: Vladek Россия Github
Дата: 18.08.14 13:19
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Приведи пример такого кода.


G>Для начала простой кейс как в StackOverflow:

G>1) Показывать посты по дате добавления
G>2) Показывать посты по количеству оценок за день (самые популярные)
G>3) Показывать посты по комментов за день (самые обсуждаемые)
G>Еще обязательно пейджинг.

G>Я предполагаю что получится такой набор методов в репозитариях:


G>
G>IEnumerable<PostData> GetPostsByDate(int start, int pageSize);
G>IEnumerable<PostData> GetPostsByComments(int start, int pageSize);
G>IEnumerable<PostData> GetPostsByScore(int start, int pageSize);
G>


Я в репозиторий передаю наследников такого класса:

  DataFetch.cs
public class DataFetch
{
    public static readonly int[] AvailablePageSizes = new[] { 10, 20, 50, 100 };

    private int? pageSize;

    public DataFetch()
    {
        this.PageSize = NormalizePageSize(null);
    }

    public bool? Ascending { get; set; }

    public int Page { get; set; }

    public int? PageSize
    {
        get
        {
            return this.pageSize;
        }
        set
        {
            this.pageSize = NormalizePageSize(value);
        }
    }

    public bool? Reset { get; set; }

    public string SortBy { get; set; }

    private static int NormalizePageSize(int? pageSize)
    {
        if (pageSize == null)
            return AvailablePageSizes.Min();

        return AvailablePageSizes.Aggregate((x, y) => Math.Abs(x - pageSize.Value) < Math.Abs(y - pageSize.Value) ? x : y);
    }
}


G>Потом внезапно требуется сделать фильтр по тегам, придется править все три метода. В итоге у нас "нижние" слои приложения страдают от изменений деталей представления. Значит расслоение сделано неверно.

G>В сценарии интернет-магазина или CRM может быть куча фильтров и сортировок и таких методов в репозитарии будет очень много. Поэтому цена изменения станет огромной.

При изменении требований я добавляю поля в наследника (PostFetch) и изменяю реализацию метода GetPosts в репозитории (в единственном экземпляре).

IEnumerable<PostDetails> GetPosts(PostFetch fetch)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.