Ho creato questo Wiki di comunità perché alcuni potrebbero pensare che sia aperto al dibattito e altri potrebbero pensare che si tratta di utilizzare le parole per indicare cosa loro davvero significano (in altre parole, è una questione di opinione se è una questione di opinione).WF, WCF e Servizi dichiarativi (oppure: Cosa significa "dichiarativo" per Microsoft?)
C'è uno general question on SO about declarative programming, che ha alcune ottime risposte.
Ma io sono un po 'lanciato da this blog post da un evangelista Microsoft.
Uno dei vantaggi di dichiarativa programmazione è che è possibile indicare ciò che si vorrebbe fare, ma non come farlo.
Finora, così buono - che è esattamente d'accordo con la risposta accettata sulla domanda SO, in effetti.
Ma poi controllare la parte di "Servizio di attuazione",
È possibile Basta guardare a qualche decina di righe di XAML codice ed essere in grado di determinare come il servizio WCF è configurato e come il flusso di lavoro corrispondente è definito.
Dopo aver esaminato alcuni esempi, vorrei rispondere brevemente dicendo "No, non posso". Ma piuttosto che respingere con dispiacere questa roba, facciamo look at the docs.
C'è voluto un po 'di tempo ma alla fine lo reality has caught up with satire ... ma non è questo il punto - certo non stanno seriamente suggerendo di farlo per esporre qualcosa di banale come l'aggiunta. Né mi lamento della ridicola verbosità e della strana idea che qualcuno possa mai scrivere qualcosa di simile a mano - sembra più l'output di un compilatore che un linguaggio leggibile dall'uomo.
L'enigma per me è che si afferma che sia "dichiarativo". Eppure il nucleo di esso è una dichiarazione di assegnazione.
servizi dichiarative sono definiti dichiarativo in XAML e fornire un altro strato di astrazione. Fondamentalmente, si crea un modello del servizio definendo ciò che si desidera fare del servizio piuttosto che come farlo . L'intero servizio può essere definito in modo dichiarativo , compresa l'implementazione delle operazioni.
Quindi se diciamo dichiarativa o dichiarativo tre volte, che lo rende dichiarativa. Gotcha. E se diciamo la frase magica "cosa vuoi fare piuttosto che come farlo" allora possiamo trascurare di notare che nella frase successiva, specificheremo "l'implementazione delle operazioni" dopotutto, e quindi noi diranno esattamente come farlo.
L'esempio in quella pagina è:
<wma:Sequence>
<wma:WriteLine Text ='[String.Concat(String.Concat(String.Concat(String.Concat("Add(", CType(op1, Object)), ","), CType(op2, Object)), ") called")]' />
<wma:Assign x:TypeArguments="xs:Int32" To="[result1]" Value="[op1 + op2]" />
</wma:Sequence>
vale a dire, il tutto (compresa una tonnellata di spazzatura ho tagliato fuori dall'esempio WF) è esattamente equivalente a:
void Add(int op1, int op2, out int result1)
{
Console.WriteLine("Add(" + op1 + ", " + op2 + ") called");
result1 = op1 + op2;
}
Quindi - un blocco di istruzioni, da eseguire nell'ordine in cui appaiono e con effetti collaterali. Ci sono naturalmente elementi di attività del flusso di lavoro per il ciclo (e puoi scrivere le tue attività se WF non ha già la tua dichiarazione imperativa preferita). Apparentemente, "riscrivere il tuo codice in un formato illeggibile" è la stessa cosa di "aggiungere uno strato di astrazione".
Per ribadire, non è la follia insana illegibile di cui mi lamento - è il fatto che è chiaramente la programmazione imperativa completa di Turing nell'implementazione del servizio, quindi qual è il punto? Prima che tu lo sappia, passeremo attraverso i nostri flussi di lavoro nel debugger, cercando di capire quale dichiarazione di assegnazione ha mutato quale valore, o perché il ciclo continua a girare per sempre.
(L'ironia è che nella versione C#, è un po 'più dichiarativa, perché non abbiamo specificato come i pezzi di spago dovrebbero essere concatenati, consentendo in tal modo il compilatore di generare un minor numero di chiamate al metodo Concat
.)
Quindi scrivere qualcosa in XML lo rende dichiarativo (oltre che meno leggibile)?
"dichiara come mettere insieme" - ma solo nel senso che un corpo del metodo in C# "dichiara" come implementare il metodo. E nota l'aspetto della parola "come", che è ciò che la programmazione dichiarativa dovrebbe evitare. Qual è la linea tra dichiarativo e imperativo, dato che le attività del flusso di lavoro svolte da un servizio sono in genere passaggi imperativi (comunque pesanti) e devono quindi operare in una sequenza imperativa e incollate da attività WF pronte all'uso immediate? ? –