Pregunta

He estado buscando por la web en busca de una definición para la declarativa y la programación imperativa que arroje algo de luz para mí.Sin embargo, el lenguaje que se usa en algunos de los recursos que he encontrado es de enormes proporciones, por ejemplo en Wikipedia.¿Alguien tiene un ejemplo de la vida real que podrían mostrarme que podría traer un poco de perspectiva a este tema (tal vez en C#)?

¿Fue útil?

Solución

Un gran ejemplo de C # declarativa contra imperativo de programación es LINQ.

imperativo programación, se indica al compilador lo que desea que suceda, paso a paso.

Por ejemplo, vamos a empezar con esta colección, y elegir los números impares:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

Con la programación imperativa, que había un paso a través de este, y decidir lo que queremos:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

Aquí, estamos diciendo:

  1. Crear una colección de resultados
  2. Paso a través de cada número en la colección
  3. Compruebe el número, si es impar, agregarlo a los resultados

declarativa programación, por el contrario, se escribe código que describe lo que quiere, pero no necesariamente cómo conseguirlo (declarar los resultados deseados, pero no el paso a paso) :

var results = collection.Where( num => num % 2 != 0);

En este caso, estamos diciendo "Danos todo donde es raro", no "Paso a través de la colección. Confirmar este artículo, si es impar, agregarlo a una colección de resultados."

En muchos casos, el código será una mezcla de ambos diseños, también, lo que no siempre es blanco y negro.

Otros consejos

La programación declarativa es cuando se dice lo que desea y lenguaje imperativo es cuando se dice ¿Cómo para obtener lo que desea.

Un ejemplo 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)

El primer ejemplo es declarativa, porque no se especifica ningún "detalles de la implementación" de la construcción de la lista.

Para atar en un ejemplo de C #, por lo general, utilizando los resultados de LINQ en un estilo declarativo, porque no se está diciendo ¿Cómo para obtener lo que quiere; solo está diciendo lo que desee. Se podría decir lo mismo de SQL.

Uno de los beneficios de la programación declarativa es que permite que el compilador para tomar decisiones que podrían resultar en un mejor código de lo que podría hacer a mano. Correr con el ejemplo de SQL, si tuviera una consulta como

SELECT score FROM games WHERE id < 100;

SQL "compilador" puede "optimizar" esta consulta porque sabe que id es un campo indexado - o tal vez no está indexado, en cuyo caso se tendrá que iterar sobre todo el conjunto de datos de todos modos. O tal vez el motor de SQL sabe que este es el momento perfecto para utilizar los 8 núcleos para una búsqueda paralela rápida. , como programador, no se ocupa de alguna de estas condiciones, y usted no tiene que escribir el código para manejar cualquier caso especial de esa manera.

declarativo vs. imperativo

programación paradigma es un estilo fundamental de la programación de computadoras. Hay cuatro paradigmas principales:. Imperativo, declarativa, funcional (que se considera un subconjunto del paradigma declarativo) y orientado a objetos

declarativa programación: es un paradigma de programación que expresa la lógica de un cálculo (Qué hacer) sin describir su flujo de control (Como hacer). Algunos ejemplos bien conocidos de los lenguajes específicos de dominio (declarativas DSLs) incluyen CSS, expresiones regulares, y un subconjunto de SQL (consultas SELECT, por ejemplo) Muchos lenguajes de marcado tales como HTML, MXML, XAML, XSLT ... son a menudo declarativa. El intento de programación declarativa para difuminar la distinción entre un programa como un conjunto de instrucciones y un programa como una afirmación acerca de la respuesta deseada.

: es un paradigma de programación que describe el cálculo en términos de sentencias que cambian de un estado del programa. Los programas pueden ser declarativas dualmente considerados como los comandos de programación o afirmaciones matemáticas.

La programación funcional: es un paradigma de programación que trata el cálculo como la evaluación de funciones matemáticas y evita estado y los datos mutables. Se hace hincapié en la aplicación de funciones, en contraste con el estilo de programación imperativo, que hace hincapié en los cambios de estado. En un lenguaje funcional puro, como Haskell, todas las funciones están exentos de efectos secundarios, y los cambios de estado solamente se representan como funciones que transforman el estado.

El siguiente ejemplo de programación imperativa en MSDN , bucles a través de los números del 1 al 10, y encuentra los números pares.

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);

Ambos ejemplos dió el mismo resultado, y uno no es ni mejor ni peor que el otro. El primer ejemplo se requiere más código, pero el código es comprobable, y el enfoque imperativo le da un control total sobre los detalles de implementación. En el segundo ejemplo, el código es posiblemente más legible; Sin embargo, LINQ no le da el control sobre lo que sucede detrás de las escenas. Debe confiar en que LINQ proporcionará el resultado requerido.

Voy a añadir otro ejemplo que rara vez aparece en / discusión de programación imperativo declarativa: la interfaz de usuario

En C #, se puede construir una interfaz de usuario mediante diversas tecnologías.

En el extremo imprescindible, se podría usar DirectX u OpenGL para dibujar muy imperativamente sus botones, casillas de verificación, etc ..., línea por línea (o en realidad, triángulo triángulo). Es hasta usted decir cómo dibujar la interfaz de usuario.

Al final declarativa, tiene WPF. Es, básicamente, escribir algo de XML (sí, sí, "XAML" técnicamente) y el marco hace el trabajo por ti. Usted dice lo que las miradas de interfaz de usuario le gusta. Corresponde al sistema para averiguar cómo hacerlo.

De todos modos, más que otra cosa que pensar. El hecho de que un idioma es declarativa o imperativa no quiere decir que no tiene ciertas características de los otros.

Además, una ventaja de la programación declarativa es que el propósito es generalmente más fácil comprensión de la lectura del código imperativo mientras que le da un mayor control sobre la ejecución.

La esencia de todo esto:

declarativa -> what que quiere hacer

Imperativo -> how quiere que se haga

Todo lo anterior respuestas y otros mensajes en línea mención siguiente:

  • declarativa programación, se escribe código que describe lo que quiere, pero no necesariamente la forma de conseguirlo
  • Usted debe preferir la programación declarativa sobre la programación imperativa

Lo que no nos han dicho es cómo lograrlo . Por parte del programa a ser más declarativa, otras partes deben proporcionan la abstracción para ocultar los detalles de implementación (que son los imperativas los códigos).

  • por ejemplo., LINQ es más declarativa de bucles (por, al tiempo, etc.), por ejemplo, puede utilizar list.Where() para obtener una nueva lista filtrada. Para que esto funcione, Microsoft ha hecho todo el trabajo pesado detrás de la abstracción LINQ.

De hecho, una de las razones de programación funcional y bibliotecas funcionales son más declarativa es porque han abstraído de distancia bucles y lista de creaciones, ocultando todos los detalles de implementación (probablemente códigos imperativos con bucles) detrás de la escena.

En cualquier programa, usted siempre tendrá tanto imprescindible y códigos declarativas, lo que usted debe apuntar para es ocultar todo imperativo los códigos detrás de las abstracciones, de modo que otras partes del programa pueden utilizarlos < strong> declarativa .

Por último, aunque la programación funcional y LINQ puede hacer que su programa sea más declarativa, siempre se puede hacer aún más declarativa proporcionando más abstracciones. Por ejemplo:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

Me gusta una explicación de un curso de Cambridge + sus ejemplos:

  • declarativa - especificar lo para hacer, no cómo para hacerlo
    • ej .: HTML describe lo que debe aparecer en una página web, no la forma en que debe constituirse sobre la pantalla
  • Imperativo - especificar tanto lo y ¿Cómo
    • int x; - lo (declarativa)
    • x=x+1; - cómo
  

programación imperativa exige a los desarrolladores definir paso a paso cómo   código debe ser ejecutado. Para dar instrucciones de forma imperativa,   usted dice: “Ir a la calle 1, gire a la izquierda en Main, conducir dos bloques,   gire a la derecha de arce, y parada en la tercera casa a la izquierda.”El   Versión declarativa puede sonar algo como esto: “Drive a Sue   . Casa”Uno dice cómo hacer algo; el otro dice lo que tiene que ser   hecho.

     

El estilo declarativo tiene dos ventajas sobre el estilo imperativo:

     
      
  • No obliga al viajero a memorizar una larga serie de instrucciones.
  •   
  • Permite el viajero para optimizar la ruta cuando sea posible.
  •   

Calvert, C Kulkarni, D (2009). LINQ esencial. Addison Wesley. 48.

La diferencia tiene que ver principalmente con el nivel general de abstracción. Con declarativa, en algún momento, que está tan lejos de los distintos pasos que el programa tiene una gran cantidad de libertad en cuanto cómo llegar a su resultado.


Se podría mirar cada pieza de la instrucción como caer en alguna parte de un continuo:

grado de abstracción:

Declarative <<=====|==================>> Imperative

declarativa Ejemplo real:

  1. bibliotecario, por favor, compruebe mi una copia de Moby Dick. (Bibliotecario, a su discreción elige el mejor método para realizar la solicitud)

Imperativo Ejemplo real:

  1. Ir a la Biblioteca
  2. Encuentra libro Sistema de Organización (tarjeta de Catálogo - Old school)
  3. Investigación de cómo utilizar la tarjeta de Catálogos (Se le olvidó también, derecha)
  4. Figura cómo estantes están etiquetados y organizados.
  5. Figura cómo se organizan los libros en un estante.
  6. Referencia cruzada ubicación libro del catálogo de fichas con el sistema de organización para encontrar dicho libro.
  7. Tome el libro a la salida del sistema.
  8. Salida libro.

programación imperativa está diciendo a la computadora de forma explícita qué hacer y cómo hacerlo, al igual que el orden y tal

especificando

C #:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

declarativa es cuando usted le dice al ordenador qué hacer, pero no realmente cómo hacerlo. Registro de datos / Prolog es el primer lenguaje que viene a la mente en este sentido. Básicamente todo es declarativa. Realmente no se puede garantizar el orden.

C # es un lenguaje de programación mucho más imprescindible, pero ciertas características de C # es más declarativa, como LINQ

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

Lo mismo se podría escribir imperativamente:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(ejemplo de Wikipedia Linq)

  

En informática, la programación declarativa es un paradigma de programación que expresa la lógica de un cálculo sin describir su flujo de control.

http://en.wikipedia.org/wiki/Declarative_programming

en pocas palabras el lenguaje declarativo es más simple porque carece de la complejidad del flujo de control (bucles, si las declaraciones, etc.)

Una comparación bueno es el modelo de ASP.Net 'de código subyacente'. Tiene archivos declarativos '.ASPX' y luego los archivos de código imperativo 'aspx.cs'. A menudo me encuentro que si puedo hacer todo lo necesario en el medio de la escritura declarativa muchas más personas puedan seguir lo que se está haciendo.

El robo de Philip Roberts aquí:

  • La programación imperativa le dice a la máquina cómo hacer algo (lo que queremos que suceda)
  • La programación declarativa le dice a la máquina, ¿qué te gustaría pasar (y el equipo descubre cómo hacerlo)

Dos ejemplos:

1.Duplicación de todos los números en una matriz

Imperativamente:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

De forma declarativa:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2.La suma de los elementos en una lista

Imperativamente

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

De forma declarativa

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

Nota cómo el imperativo ejemplos implican la creación de una nueva variable, la mutación, y devolver que el nuevo valor (es decir, cómo hacer que algo suceda), mientras que la declarativa ejemplos ejecutar en un determinado entrada y devolver el valor nuevo basado en la entrada inicial (es decir, lo que queremos que suceda).

programación imperativa < br> Un lenguaje de programación que requiere la programación de la disciplina como C / C ++, Java, COBOL, FORTRAN Perl y JavaScript. Los programadores que escriben en estos idiomas deben desarrollar un orden adecuado de las acciones con el fin de resolver el problema, basado en un conocimiento de procesamiento de datos y la programación.

La programación declarativa < br> Un lenguaje de programación que no requiere escribir la lógica de la programación tradicional; Los usuarios se concentran en la definición de la entrada y la salida en lugar de los pasos del programa requeridos en un lenguaje de programación procesal como C ++ o Java.

ejemplos de programación declarativos son CSS, HTML, XML, XSLT, RegX.

Sólo para poner otro ejemplo, en términos de desarrollo de aplicaciones móviles. En iOS y Android tenemos Constructores interfaz, donde podemos definir la interfaz de usuario de las aplicaciones.

La interfaz de usuario dibuja usando estos constructores son declarativa en la naturaleza, en el que arrastrar y soltar los componentes. El draeing real se lleva a cabo por debajo y por el marco y el sistema.

Sin embargo, también podemos sacar todo los componentes de código, y que es imprescindible en la naturaleza.

Además, algunos de los nuevos lenguajes como JS angular se centra en el diseño de interfaces de usuario de forma declarativa y podemos ver una gran cantidad de otros idiomas que ofrecen el mismo soporte. Como Java doesnot tiene alguna buena manera declarativa para dibujar las aplicaciones de escritorio nativas en Java Swing o Java FX, pero en un futuro próximo que tal vez sí.

Programa declarativa es sólo un conjunto de datos para su poco más o menos "universal" imperativo aplicación / vm.

ventajas: especificando sólo de datos, en algún formato hardcoded (y marcado), es más simple y menos propenso a errores de especificar variante del algún algoritmo imperativo directamente. algunas especificaciones complejas simplemente no puede escribirse directamente, sólo en algún tipo DSL. mejores y frec utilizados en estructuras de datos es DSLs conjuntos y tablas. porque no tiene dependencias entre elementos / filas. y cuando te has de dependencias que tiene la libertad de modificar y facilidad de apoyo. (Compárese por ejemplo módulos con clases - con módulos feliz y con las clases que tiene problema de la clase base frágil) todos los bienes de declaratividad y DSL sigue inmediatamente de que los beneficios de las estructuras de datos (tablas y juegos). otro punto a favor - se puede cambiar implementación de VM lenguaje declarativo, si DSL es más o menos abstracta (bien diseñado). que la implementación en paralelo, por ejemplo. o portarlo a otro sistema operativo, etc. todo bien specifed las interfaces modulares de aislamiento o protocolos le da esa libertad y easyness de apoyo.

desventajas: aciertas. genérica (y parametrizado por DSL) imperativo algoritmo / vm aplicación puede ser más lenta y / o la memoria hambre que uno específico. en algunos casos. si que los casos es raro - simplemente olvidarse de él, que sea lento. si es frequient - siempre se puede ampliar su DSL / vm para ese caso. en algún lugar ralentizar todos los demás casos, seguro ...

P.S. Marcos está a medio camino entre DSL y un imperativo. y como todas las soluciones a medias ... que combina deficiencias, no beneficios. aspecto que no es tan seguro y no tan rápido :) al gato-de-todo-negocia Haskell - está a medio camino entre una fuerte sencilla ML y metaprog flexibles Prolog y ... la clase de monstruo que es. se puede ver en Prolog como Haskell con funciones / predicados booleanos-solamente. y lo simple que es su flexibilidad frente a Haskell ...

Me pregunto por qué nadie ha mencionado clases de atributos como una herramienta de programación declarativa en C #. La respuesta popular de esta página ha hablado de LINQ como una herramienta de programación declarativa.

De acuerdo a Wikipedia

  

lenguajes declarativos comunes incluyen los de lenguajes de consulta de bases de datos   (Por ejemplo, SQL, XQuery), las expresiones regulares, la programación lógica,   La programación funcional, y de gestión de configuración de sistemas.

Así LINQ, como una sintaxis funcional, es sin duda un método declarativo, pero las clases de atributos en C #, como una herramienta de configuración, son demasiado declarativa. Aquí es un buen punto de partida para leer mas sobre esto: rápida Descripción general de programación de C # Atributo

A mi entender, ambos términos tienen raíces en la filosofía, hay tipos declarativas e imperativas de conocimiento. El conocimiento declarativo son afirmaciones de la verdad, las declaraciones de hechos como axiomas matemáticos. Dice algo. Imperativo, o el conocimiento procedimental, Le indica paso a paso cómo llegar a algo. Eso es lo que la definición de un algoritmo es esencialmente. Si lo haría, comparar un lenguaje de programación informática con el idioma Inglés. frases declarativas afirman algo. Un ejemplo aburrido, pero aquí es una manera declarativa de mostrar si dos números son iguales entre sí, en Java:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

frases imperativas en Inglés, por el contrario, dar una orden o hacer algún tipo de petición. de programación imperativo, entonces, es sólo una lista de comandos (hacer esto, hacer eso). Aquí está una manera de mostrar imprescindible si dos números son iguales entre sí o no al aceptar la entrada del usuario, en Java:

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

Esencialmente, el conocimiento declarativo salta sobre ciertos elementos para formar una capa de abstracción sobre esos elementos. La programación declarativa hace lo mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top