Декларативний проти імперативного
парадигма програмування є фундаментальним стилем програмування. Існує чотири основні парадигми: імперативна, декларативна, функціональна (яка вважається підмножиною декларативної парадигми) та об'єктно-орієнтована.
Декларативне програмування : це парадигма програмування, яка виражає логіку обчислення (що робити), не описуючи його потік управління (How do). Деякі відомі приклади декларативних мов, специфічних для домену (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 надасть запитуваний результат.