Декларативный и императивный
Парадигма программирования является фундаментальным стилем программирования. Существует четыре основных парадигмы: императивная, декларативная, функциональная (которая считается подмножеством декларативной парадигмы) и объектно-ориентированная.
Декларативное программирование : это парадигма программирования, которая выражает логику вычислений (что делать) без описания потока управления (как это делается). Некоторые хорошо известные примеры декларативных доменных языков (DSL) включают CSS, регулярные выражения и подмножество SQL (например, запросы SELECT). Многие языки разметки, такие как HTML, MXML, XAML, XSLT ... часто являются декларативными. Декларативное программирование пытается стереть различие между программой как набором команд и программой как утверждением о желаемом ответе.
Императивное программирование : это парадигма программирования, которая описывает вычисления в терминах операторов, которые изменяют состояние программы. Декларативные программы можно рассматривать как команды программирования или математические утверждения.
Функциональное программирование: это парадигма программирования, которая рассматривает вычисления как оценку математических функций и избегает состояния и изменчивых данных. Он подчеркивает применение функций, в отличие от императивного стиля программирования, который подчеркивает изменения в состоянии. В чистом функциональном языке, таком как Haskell, все функции не имеют побочных эффектов, а изменения состояния представлены только как функции, которые преобразуют состояние.
В следующем примере императивного программирования в MSDN циклы по числам от 1 до 10 и поиск четных чисел.
var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{ if (number % 2 == 0)
{
evenNumbers.Add(number);
}
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);
Оба примера дают одинаковый результат, и один не лучше и не хуже другого. В первом примере требуется больше кода, но код тестируемый, а императивный подход дает вам полный контроль над деталями реализации. Во втором примере код, возможно, более читабелен; однако LINQ не дает вам контроля над тем, что происходит за кулисами. Вы должны верить, что LINQ предоставит запрошенный результат.