O estilo de programação imperativa foi praticado no desenvolvimento web desde 2005 até 2013.
Com a programação imperativa, escrevemos código que listava exatamente o que nosso aplicativo deveria fazer, passo a passo.
O estilo de programação funcional produz abstração através de maneiras inteligentes de combinar funções.
Há menção de programação declarativa nas respostas e, em relação a isso, direi que a programação declarativa lista algumas regras que devemos seguir. Em seguida, fornecemos o que chamamos de estado inicial de nosso aplicativo e permitimos que essas regras definam como o aplicativo se comporta.
Agora, essas descrições rápidas provavelmente não fazem muito sentido, então vamos percorrer as diferenças entre programação imperativa e declarativa, percorrendo uma analogia.
Imagine que não estamos construindo software, mas fazemos tortas para ganhar a vida. Talvez sejamos padeiros ruins e não sabemos como fazer uma torta deliciosa do jeito que deveríamos.
Então, nosso chefe nos dá uma lista de instruções, o que sabemos como receita.
A receita nos dirá como fazer uma torta. Uma receita é escrita em um estilo imperativo assim:
- Misture 1 xícara de farinha
- Adicione 1 ovo
- Adicione 1 xícara de açúcar
- Despeje a mistura em uma panela
- Coloque a panela no forno por 30 minutos e 350 graus F.
A receita declarativa faria o seguinte:
1 xícara de farinha, 1 ovo, 1 xícara de açúcar - Estado inicial
Regras
- Se tudo estiver misturado, coloque na panela.
- Se tudo não estiver misturado, coloque na tigela.
- Se tudo na panela, coloque no forno.
As abordagens imperativas são caracterizadas por abordagens passo a passo. Você começa com o passo um e vai para o passo 2 e assim por diante.
Você acaba com algum produto final. Então, fazendo esta torta, pegamos esses ingredientes, misturamos, colocamos em uma panela e no forno e você conseguiu seu produto final.
Em um mundo declarativo, é diferente. Na receita declarativa, separaríamos nossa receita em duas partes separadas, comece com uma parte que liste o estado inicial da receita, como as variáveis. Portanto, nossas variáveis aqui são as quantidades de nossos ingredientes e seu tipo.
Tomamos o estado inicial ou os ingredientes iniciais e aplicamos algumas regras a eles.
Portanto, tomamos o estado inicial e as repassamos repetidamente por essas regras até prepararmos uma torta de morango pronta para comer ou qualquer outra coisa.
Portanto, em uma abordagem declarativa, precisamos saber como estruturar adequadamente essas regras.
Portanto, as regras que podemos examinar nossos ingredientes ou declarar, se misturados, colocá-los em uma panela.
Com o nosso estado inicial, isso não corresponde porque ainda não misturamos nossos ingredientes.
A regra 2 diz que, se não estiverem misturados, misture-os em uma tigela. Ok, sim, esta regra se aplica.
Agora temos uma tigela de ingredientes misturados como nosso estado.
Agora aplicamos esse novo estado às nossas regras novamente.
Então a regra 1 diz que se os ingredientes forem misturados, coloque-os em uma panela, ok, sim, agora a regra 1 se aplica, vamos fazê-lo.
Agora temos esse novo estado em que os ingredientes são misturados e em uma panela. A regra 1 não é mais relevante, a regra 2 não se aplica.
A regra 3 diz que se os ingredientes estiverem em uma panela, coloque-os no forno, ótimo essa regra é o que se aplica a esse novo estado, vamos fazê-lo.
E acabamos com uma deliciosa torta de maçã quente ou o que seja.
Agora, se você é como eu, pode estar pensando: por que ainda não fazemos uma programação imperativa? Isso faz sentido.
Bem, para fluxos simples, sim, mas a maioria dos aplicativos da Web possui fluxos mais complexos que não podem ser capturados adequadamente pelo design de programação imperativa.
Em uma abordagem declarativa, podemos ter alguns ingredientes iniciais ou estado inicial textInput=“”
, como uma única variável.
Talvez a entrada de texto comece como uma sequência vazia.
Tomamos esse estado inicial e o aplicamos a um conjunto de regras definidas em seu aplicativo.
Se um usuário digitar texto, atualize a entrada de texto. Bem, agora isso não se aplica.
Se o modelo for renderizado, calcule o widget.
- Se textInput for atualizado, renderize novamente o modelo.
Bem, nada disso se aplica; portanto, o programa irá esperar um evento acontecer.
Então, em algum momento, um usuário atualiza a entrada de texto e, em seguida, podemos aplicar a regra número 1.
Podemos atualizar isso para “abcd”
Assim, acabamos de atualizar nossas atualizações de texto e de texto, a regra número 2 não se aplica, a regra número 3 diz que se a entrada de texto for atualizada, o que acabou de ocorrer, em seguida, renderizamos novamente o modelo e, em seguida, voltamos à regra 2, que diz que o modelo é renderizado , calcule o widget, ok vamos calcular o widget.
Em geral, como programadores, queremos lutar por projetos de programação mais declarativos.
O imperativo parece mais claro e óbvio, mas uma abordagem declarativa é muito bem dimensionada para aplicativos maiores.