Algum idioma foi aplicado à separação entre comandos e consultas?

5

Conforme descrito aqui , uma função pode ser considerada uma consulta quando retorna um valor e um comando quando modifica um valor. Também afirma que uma função não deve ser ambas.

Que uma consulta não deve ser um comando parece ser popularmente aplicada pela programação funcional, na medida em que é uma função pura.

Existe uma linguagem onde, se e somente se a função não for nula, ela não pode mudar de estado?

    
por Chris Wohlert 02.01.2018 / 10:31
fonte

2 respostas

8

Sim, o SQL possui comandos distintos para consultas (leituras) e comandos (atualizações).

O SQL possui comandos diferentes para DML (Data Manipulation Language) para executar INSERT, UPDATE, DELETE.

Para leituras, use DQL (Data Query Language) para executar SELECTs (leituras).

Idiomas como o C # são baseados em OO. O melhor que você pode fazer com uma linguagem como o C # é colocar guardas de segurança.

Por exemplo, uma interface de consulta:

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

Uma interface de comando:

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

Também é possível tornar o objeto imutável para garantir que ele não possa ser alterado uma vez instanciado.

Mas, os desenvolvedores podem ignorar as grades de proteção, portanto, se a Consulta de Comando estiver sendo implementada em uma linguagem como C #, provavelmente o novo código adicionado deve ser revisado por código para garantir que o padrão seja seguido.

    
por 02.01.2018 / 17:59
fonte
-3

Até onde eu sei, não existe essa linguagem porque, em alguns casos, há casos específicos em que você precisa modificar um valor e retornar um valor ao mesmo tempo.

Por exemplo, em c # há um padrão comum usado chamado TryGet. Nesse caso, você gera um valor modificado de algum parâmetro usando a palavra-chave “out”, enquanto retorna um bool para armazenar se a modificação foi bem-sucedida.

Então, algo parecido com este exemplo simples. (Digite no telefone desculpe se houver erros)

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

Use a função assim:

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

Portanto, há alguns casos em que você quer fazer as duas coisas! Embora eu ache que isso deve ser usado apenas em casos muito específicos.

    
por 02.01.2018 / 17:19
fonte