2016-06-02 10 views
0

Например, для целочисленного массива может быть метод max.Является ли принцип всегда иметь самые абстрактные параметры, и если у него есть имя?

public static int Max(int[] ints) 
{ 
    var max = ints[0]; 
    foreach(var i in ints) 
    { 
     if(i > max) 
     { 
      max = i; 
     } 
    } 
    return max; 
} 

Но на самом деле мы не использовали тот факт, что были, были с помощью массива, только что мы могли бы перебрать их, и мы не нуждались в Интс, мы просто нужен объект, который знает, как себя сравнивать , Таким образом, более мощный метод может быть:

public static T MyMax<T>(IEnumerable<T> ts) where T : IComparable<T> 
{ 
    var max = ts.First(); 
    foreach(var i in ts) 
    { 
     if(i.CompareTo(max) > 0) 
     { 
      max = i; 
     } 
    } 
    return max; 
} 

И я думаю, приведенным выше обесцениваю факт, что IEnumerable<T> может быть бесконечным, которое вызвало бы это зависнуть, но тогда почему вы пытаетесь найти Макс Фо бесконечного истребитель в первую очередь.

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

Заранее спасибо.

+0

общего назначения, общий и т. Д. – sstan

+0

@sstan: Хотя я согласен, что результат включает в себя дженерики или является более общей целью, мне интересно, нет ли названия для принципа, в котором хотелось бы активно искать наиболее возможно общее решение. Я думаю, что даже это можно было бы сделать более общим, поскольку мы могли бы просто использовать оператор агрегирования с переданным Макс. – user420667

+0

Первый linq реализует тот же метод, но, учитывая другие вещи. Я думаю, вы должны взглянуть на [it] (http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,b7b87afe6c3fc715), ищите (Макс. ). Я не знаю о имени шаблона для этого подхода. Я думаю, что это очень близко к функциональному языку или декларативному программированию, но не к способу написания этой функции, а скорее к тому, как это будет использоваться, если это имеет смысл. –

ответ

1

Я бы назвал это Программирование на интерфейс.

Принцип проектирования программирования в интерфейсе чаще всего упоминается в контексте объявления переменных, и именно так в знаменитой книге «Банда четырех» вводится принцип; но он одинаково хорошо применим к объявлению параметров метода.

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

Термин переменные здесь можно рассматривать в широком смысле, что включает в себя параметры метода.