Что я должен использовать в следующем контексте - перегрузка метода или использование обобщений? - PullRequest
1 голос
/ 19 июня 2019

У меня есть два подхода ниже, я хочу знать, какой мне следует использовать?

Подход 1. Использование перегрузки

public Color GetColor(int? Id)
        {
            return db.Colors.Find(Id);
        }
        public Color GetColor(string Name)
        {
            return db.Colors.Where(m => m.Name == Name).FirstOrDefault();
        }

Подход 2: Использование дженериков

 public Color GetColor<T>(T value)
        {
            var type = value.GetType();

            if (type == typeof(Int32))
            {
                return db.Colors.Find(value); // Data fetched using Id
            }
            else if (type == typeof(string))
            {
                return db.Colors.Where(m => m.Name == value.ToString()).FirstOrDefault();  // Data fetched using name
            }
            return null;
        }

Оба вышеприведенных подхода дают желаемый результат, я просто хочу знать плюсы и минусы обоих, и что мне лучше выбрать?

Ответы [ 3 ]

5 голосов
/ 19 июня 2019

Обобщения полезны, когда вы хотите написать кусок кода, ну, в общем, но сохраните безопасность типов. Например, добавление в список имеет одинаковый код независимо от того, что содержит этот список, но вы можете добавить только строку в список строк.

Во втором фрагменте, которым вы поделились, код не является универсальным - он явно проверяет тип передаваемого ему аргумента (во время выполнения!) И обрабатывает только строки и целые числа. У этого фрагмента нет никаких преимуществ, и вам лучше придерживаться перегруженного варианта, такого как ваш первый фрагмент.

4 голосов
/ 19 июня 2019

Я знаю, что не все подходят к написанию кода таким образом, но я чувствую, что код должен демонстрировать намерения программиста, где это возможно.Сигнатуры методов обычно должны предлагать достаточно информации, без каких-либо комментариев и т. Д., Чтобы указать, что метод делает.

Мое возражение против использования таких обобщений заключается в том, что он не передает такую ​​информацию.Поскольку он принимает неограниченный универсальный параметр, T, можно заключить, что любой объект может быть передан вашему универсальному методу и что он будет возвращать цвет.Действительно, если бы этот код находился в библиотеке с закрытым исходным кодом, как вызывающий мог узнать, что делает реальная реализация?

Методы перегрузки превосходят в этом отношении.Они четко выражают намерения и работают так, как вы ожидаете, без необходимости углубляться в их исходный код, чтобы выяснить, как они работают.

Что касается производительности, то перегрузки будут превосходными, поскольку будет выбрана перегрузка метода.в время компиляции .Для сравнения, универсальный метод будет ограничен проверкой предоставленных типов в runtime , что будет медленнее.

0 голосов
/ 19 июня 2019

мы обычно используем перегрузку, если нам нужно выполнить одну и ту же операцию по-разному, т.е. для разных входов.

Я думаю, что лучше делать операцию с разными входами

public int add(int a, int b)  //two int type Parameters method  
{    
    return a + b;    

}    
public int add(int a, int b,int c)  //three int type Parameters with same method same as above  
{    
    return a + b+c;    

}    
public float add(float a, float b,float c,float d)  //four float type Parameters with same method same as above two method 
{    
    return a + b+c+d;    

}  

Generics в C # является его наиболее мощной функцией. Это позволяет вам определять типобезопасные структуры данных. Это приводит к значительному повышению производительности и качественному коду, поскольку помогает повторно использовать алгоритмы обработки данных без репликации кода, специфичного для типа.

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

 public class GenericRepository<TEntity> where TEntity : class
{
    internal BlogContext blogContextlog;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(BlogContext context)
    {
        this.blogContextlog = context;
        this.dbSet = context.Set<TEntity>();
    }

    public virtual IEnumerable<TEntity> Get()
    {
        IQueryable<TEntity> query = blogContextlog.Set<TEntity>().ToList();
    }

    public virtual TEntity GetByID(object id)
    {
        return blogContextlog.Find(id);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...