È stata applicata la separazione Comando-query da qualsiasi linguaggio?

5

Come descritto qui , una funzione può essere definita come una query quando restituisce un valore e un comando quando modifica un valore. Dichiara anche che una funzione non dovrebbe essere entrambe.

Quella che una query non dovrebbe essere un comando sembra essere popolarmente applicata dalla programmazione funzionale, in quanto è una pura funzione.

Esiste una lingua, dove se e solo se la funzione non è nulla, non può cambiare stato?

    
posta Chris Wohlert 02.01.2018 - 10:31
fonte

2 risposte

8

Sì, SQL ha comandi distinti per querys (letture) e comandi (aggiornamenti).

SQL ha comandi diversi per DML (Data Manipulation Language) per l'esecuzione di INSERT, UPDATE, DELETE.

Per le letture, usa DQL (Data Query Language) per l'esecuzione di SELECT (letture).

Lingue come C # sono basate su OO. Il meglio che puoi fare con un linguaggio come C # è quello di installare i guardrail.

Ad esempio un'interfaccia di query:

public interface IQuery<in TIn, out TOut>
{
    TOut Execute(TIn queryInput);
}

Un'interfaccia di comando:

public interface ICommand<in TIn>
{
    void Execute(TIn commandInput);
}

Si può anche rendere immutabile l'oggetto / i per garantire che non possano essere modificati una volta istanziati.

Ma gli sviluppatori possono ignorare i guardrail, quindi se Command-Query viene implementato in un linguaggio come C #, probabilmente il nuovo codice che viene aggiunto dovrebbe essere sottoposto a revisione del codice per garantire che il modello venga seguito come inizialmente progettato.

    
risposta data 02.01.2018 - 17:59
fonte
-3

Per quanto ne so, non esiste un linguaggio del genere perché in alcuni casi vi sono casi specifici in cui è necessario modificare un valore e restituire un valore contemporaneamente.

Ad esempio, in c # c'è un modello comune usato chiamato TryGet. In questo caso, si emette un valore modificato di alcuni parametri utilizzando la parola chiave "out", mentre si restituisce un valore bool per memorizzare se la modifica ha avuto esito positivo.

Quindi qualcosa come questo semplice esempio. (Digitato sul telefono, scusa se ci sono errori)

bool TryGetFifthCharacter(string origString, out char fifthChar) {
    bool itWorked;
    if (length < 5) {
        ItWorked = false;
    }
    else {
        fifthChar = origString[5];
        itWorked = true;
    }
    return itWorked;
}

Usa la funzione in questo modo:

string orig = “hello”;
char fifth;
if (TryGetFifthCharacter(orig, out fifth)) {
    print(fifth);
}
else {
    print(“failed”);
}

Quindi ci sono alcuni casi in cui vuoi fare entrambe le cose! Anche se penso che questo dovrebbe essere usato solo in casi molto specifici.

    
risposta data 02.01.2018 - 17:19
fonte

Leggi altre domande sui tag