J'ai cherché sur le Web à la recherche d'une définition déclarative et impérative qui me permettrait de mieux comprendre. Cependant, la langue utilisée pour certaines des ressources que j'ai trouvées est décourageante - par exemple sur Wikipédia . Est-ce que quelqu'un a un exemple concret qu'ils pourraient me montrer qui pourrait apporter une certaine perspective à ce sujet ... peut-être en C #.
Réponses
Trop de publicités?Un excellent exemple en C# de déclaratif vs la programmation impérative est de LINQ.
Avec l' impératif de la programmation, de vous dire au compilateur que vous souhaitez réaliser, étape par étape.
Par exemple, nous allons commencer avec cette collection, et de choisir les nombres impairs:
List<int> collection = new List<int> { 1, 2, 3, 4, 5 };
Avec la programmation impérative, nous avions étape à travers ce, et de décider ce que nous voulons:
List<int> results = new List<int>();
foreach(var num in collection)
{
if (num % 2 != 0)
results.Add(num);
}
Ici, nous sommes en train de dire:
- Créer une collection de résultat
- Étape à travers chaque numéro dans la collection
- Vérifier le nombre, si c'est bizarre, l'ajouter aux résultats
Avec déclaratif de programmation, d'autre part, vous écrivez du code qui décrit ce que vous voulez, mais pas nécessairement la façon de l'obtenir (déclarer vos résultats souhaités, mais pas l'étape-par-étape):
var results = collection.Where( num => num % 2 != 0);
Ici, nous sommes en disant: "Donnez-nous de tout où c'est bizarre", pas de "parcourir la collection. Vérifiez ce point, si c'est bizarre, l'ajouter à une collection de résultat."
Dans de nombreux cas, le code sera un mélange des deux modèles à la fois, trop, de sorte qu'il n'est pas toujours noir et blanc.
Programmation déclarative, c'est quand vous dites ce que vous voulez, et de l'impératif de la langue, c'est quand vous dire comment obtenir ce que vous voulez.
Un exemple simple en Python:
# Declarative
small_nums = [x for x in range(20) if x < 5]
# Imperative
small_nums = []
for i in range(20):
if i < 5:
small_nums.append(i)
Le premier exemple est déclarative, parce que nous ne spécifiez pas les "détails de mise en œuvre" de la construction de la liste.
D'attacher dans un exemple en C#, en général, à l'aide de LINQ résultats dans un style déclaratif, parce que vous n'êtes pas en disant: comment obtenir ce que vous voulez; vous êtes seulement de dire ce que vous voulez. On pourrait dire la même chose au sujet de SQL.
Un des avantages de la programmation déclarative, c'est qu'il permet au compilateur de prendre des décisions qui pourraient aboutir à un code de meilleure qualité que ce que vous pourriez faire à la main. En cours d'exécution avec le SQL exemple, si vous aviez une requête du genre
SELECT score FROM games WHERE id < 100;
le SQL "compilateur" peut "optimiser" cette requête, car il sait que id
est un champ indexé -- ou peut-être qu'il n'est pas indexé, auquel cas il devra effectuer une itération sur l'ensemble des données de toute façon. Ou peut-être le moteur SQL sait que c'est le moment idéal pour utiliser toutes les 8 coeurs pour une rapide recherche parallèle. Vous, en tant que programmeur, ne sont pas concernés par l'un quelconque de ces conditions, et vous n'avez pas à écrire votre code pour gérer les cas particuliers.
Déclarative vs Impératif
Un paradigme de programmation est un élément fondamental de style de la programmation informatique. Il existe quatre principaux paradigmes: impératif, déclarative, fonctionnelle (qui est considéré comme un sous-ensemble de l'ensemble des déclarations paradigme) et orientée objet.
Programmation déclarative : est un paradigme de programmation qui exprime la logique d'un calcul(Ce qui n') sans décrire ses flux de contrôle(Comment faire). Quelques exemples bien connus de déclarative spécifique au domaine des langues (Dsl) comprennent les CSS, les expressions régulières, et un sous-ensemble de SQL (requêtes SELECT, par exemple) De nombreux langages tels que HTML, MXML, XAML, XSLT... sont souvent déclarative. La programmation déclarative essaie de brouiller la distinction entre un programme comme un ensemble d'instructions et un programme comme une affirmation à propos de la réponse souhaitée.
La programmation impérative : est un paradigme de programmation qui décrit le calcul en termes de déclarations que de modifier un programme de l'état. Le déclaratif des programmes peuvent être doublement considérées comme des commandes de programmation mathématique ou affirmations.
Programmation fonctionnelle : est un paradigme de programmation qui traite de calcul de l'évaluation des fonctions mathématiques et évite d'état et de données mutable. Il met l'accent sur l'application de fonctions, contrairement à l'impératif de style de programmation, qui met l'accent sur les changements dans l'état. Dans un langage purement fonctionnel, comme Haskell, toutes les fonctions sont sans effets secondaires, et les changements d'état ne sont représentés comme des fonctions qui transforment l'état.
L'exemple suivant de la programmation impérative dans MSDN, boucles à travers les nombres de 1 à 10, et trouve le même nombre.
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);
Les deux exemples donner le même résultat, et l'un n'est ni meilleure ni pire que les autres. Le premier exemple nécessite plus de code, mais le code est testable, et l'impératif approche vous donne le plein contrôle sur les détails de mise en œuvre. Dans le deuxième exemple, le code est plus lisible; cependant, LINQ ne vous donne pas de contrôle sur ce qui se passe en coulisses. Vous devez faire confiance que LINQ fournira le résultat voulu.
Je vais ajouter un autre exemple que rarement apparaît dans déclarative/programmation impérative de discussion: l'Interface Utilisateur!
En C#, vous pouvez construire une INTERFACE utilisateur à l'aide de différentes technologies.
Sur l'impératif à la fin, vous pouvez utiliser DirectX ou OpenGL pour très impérativement attirer votre boutons, cases à cocher, etc... ligne par ligne (ou vraiment, triangle par triangle). C'est à vous de dire comment dessiner l'interface utilisateur.
Au déclarative fin, vous disposez de WPF. En gros, vous écrire du XML (ouais, ouais, "XAML" techniquement) et le cadre fait le travail pour vous. Vous de dire ce que l'interface utilisateur ressemble. C'est le système pour savoir comment le faire.
De toute façon, juste une autre chose à penser. Juste parce qu'une langue est déclarative ou impérative ne signifie pas qu'il n'a pas certaines fonctionnalités de l'autre.
Aussi, un des avantages de la programmation déclarative, c'est que le but est généralement plus facile à comprendre à partir de la lecture du code alors que l'impératif vous donne plus de contrôle sur l'exécution.
L'essentiel de tout cela:
Déclarative -> what
que vous voulez faire
Impératif -> how
vous voulez qu'il fait
La programmation impérative, les développeurs doivent définir, étape par étape comment le code doit être exécuté. De donner des instructions dans le mode impératif, vous dites, "Aller à la 1re Rue, tournez à gauche sur la main, le lecteur de deux blocs,l' tourner à droite sur Maple, et s'arrêter à la troisième maison sur la gauche". L' déclarative version peut sembler quelque chose comme ceci: "Lecteur de Sue maison". On dit comment faire quelque chose; l'autre dit ce qui doit être fait.
Le déclaratif style a deux avantages par rapport à l'impératif de style:
- Il ne force pas le voyageur de mémoriser une longue série d'instructions.
- Il permet au voyageur d'optimiser l'itinéraire lorsque cela est possible.
Calvert,C Kulkarni,D (2009). Essentiel LINQ. Addison Wesley. 48.