ここ で説明したように、関数は値を返すときにqueryであり、command値を変更するとき。また、関数は両方であってはならないことも述べています。
クエリがコマンドであってはならないということは、純粋に関数であるという点で、関数型プログラミングによって一般的に強制されているようです。
関数がvoidでない場合にのみ状態を変更できない言語は存在しますか?
はい、SQLには、クエリ(読み取り)とコマンド(更新)に異なるコマンドがあります。
SQLには、INSERT、UPDATE、DELETEを実行するためのDML(データ操作言語)用のさまざまなコマンドがあります。
読み取りの場合、DQL(データクエリ言語)を使用してSELECT(読み取り)を実行します。
C#のような言語は、OOに基づいています。C#のような言語で実行できる最善の方法は、ガードレールを配置することです。
たとえば、クエリインターフェース:
public interface IQuery<in TIn, out TOut>
{
TOut Execute(TIn queryInput);
}
コマンドインターフェイス:
public interface ICommand<in TIn>
{
void Execute(TIn commandInput);
}
また、インスタンス化されたオブジェクトが変更されないように、オブジェクトを不変にすることもできます。
ただし、開発者はガードレールを無視できるため、Command-QueryがC#などの言語で実装されている場合は、追加された新しいコードをコードレビューして、パターンが最初に設計されたとおりになっていることを確認する必要があります。