Общие методы эффективной обработки - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю над общим методом, который делает то же самое (пока), но может в конечном итоге потребовать расширения в будущем.

Скажем, этот метод GetProducts(), который вызывается на домашней странице и страница продуктов.

Итак, мой код выглядит следующим образом:

class HomePage
{
    public List<BaseInfo> LoadHomePage()
    {
         List<BaseInfo> baseInfo = new List<BaseInfo>();
         baseInfo.Add(GetProducts(5));

         return baseInfo;
    }

    public Products GetProducts(int count)
    {
         return apiProducts().Take(count).ToList();
    }
}

Затем в другом файле класса:

class ProductsPage
{
    public List<BaseInfo> LoadProductPage()
    {
       List<BaseInfo> baseInfo = new List<BaseInfo>();
       baseInfo.Add(GetProducts(100));

       return baseInfo;
    }

    public Products GetProducts(int count)
    {
        return apiProducts().Take(count).ToList();
    }
}

Теперь я подумал о перемещении этого GetProducts() в общий файл класса и наследуйте его на HomePage и ProductsPage.

class CommonMethods
{
   public Products GetProducts(int count)
   {
       return apiProducts().Take(count).ToList();
   }
}

Наследование:

class HomePage : CommonMethods 

class ProductsPage: CommonMethods

Но когда придет время, мне нужно изменить GetProducts для конкретной цели c на странице продукта и не хотите влиять на HomePage, каков наилучший подход для этого? Я хочу не ломать другие страницы, потому что я меняю общий метод.

Я попробовал сделать виртуальный GetProducts() и переопределить метод на ProductsPage. Это сработало бы, но я все еще думаю, есть ли здесь лучший подход. Есть ли какие-то шаблоны проектирования, которые я могу рассмотреть?

РЕДАКТИРОВАТЬ:

Основная проблема, которую я пытаюсь избежать, заключается в использовании общего метода, я не хочу чтобы нарушить функциональность страниц домашней страницы и продуктов при внесении изменений в GetProducts();

Например, на HomePage мне нужны только 2 данные (ID и имя)

Затем ProductsPage, я хочу расширить возвращаемые данные, скажем, цена, кол-во и т. Д. c. Пример способа сделать ниже, но я ищу лучшее решение:

public Products GetProducts(int count, string page)
    {
        if(page == "Home")
               return apiProducts().Select(x => new Products { Id = x.id, Name = x.name, Name = x.name }).Take(count).ToList();  
        elseif (page == "Products")  
               return apiProducts().Select(x => new Products { Id = x.id, Name = x.name, Name = x.name, Price = x.price, Qty = x.qty }).Take(count).ToList();  
    }

Спасибо всем.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Наследование не всегда ответ. Иногда это может сделать простой помощник, как показано ниже

internal static class ProductsHelper // -- STATIC
{
    // generic method that will work for all products 
    public static List<T> GetProducts<T>(IEnumerable<T> products, int count)
    {
        return products.Take(count).ToList();
    }
} 
2 голосов
/ 14 февраля 2020

Я думаю, вам просто нужно использовать декомпозицию и переместить ваш метод GetProducts в другой класс. Например, ProductsRepository Тогда вам просто нужно внедрить ваши ProductsRepository в ваши HomePage и ProductsPage классы, используя инжектор конструктора. Как это:

class ProductsPage
{
    private ProductsRepository _rep;
    public ProductsPage(ProductsRepository rep)
    {
       _rep=rep;
    }

    public List<BaseInfo> LoadProductPage()
    {
       List<BaseInfo> baseInfo = new List<BaseInfo>();
       baseInfo.Add(_rep.GetProducts(100));

       return baseInfo;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...