「メソッドは値を返すか副作用があるはずですが、両方ではありません」の起源


12

私は一度、メソッドには戻り値があり(参照的に透過的)、または副作用がありますが、両方ではないことを読みました。このルールへの参照は見つかりませんが、それについてもっと学びたいです。

このアドバイスの起源は何ですか?どの人またはコミュニティからそれが生じましたか?

追加クレジット:このアドバイスに従うことの利点は何ですか?


1
@gnatはい、主に歴史についてです。私は、余分な信用の部分があまりに主観的すぎて単独で立つことができず、歴史が閉鎖を逃れる可能性が高いことを恐れました。タグを追加します。
ウェインコンラッド

積み重ねられた答えのいくつかは、このアドバイスの著者によって主張された利益について尋ねるか、まったく主張できるすべての利益のリストを尋ねるかどうか疑問に思いましたか?
-gnat

@gnat私は著者が主張する利益について(もう一度、閉鎖を恐れる)について尋ねますが、私は確かに山積みの理由を気にしません-彼らは私が実際に尋ねたい質問に答えてます。質問から「主張」を削除し、パイルオンの回答をトピックにすると、質問は主観的なものになりすぎますか?
ウェインコンラッド

「パイルオンの理由」は、質問を広範すぎるとしてクローズするように促す可能性があります。あなたは「開放側に滞在する」ことを好む場合は、私は著者が主張された利益のためにそれを絞り込むために、より安全なことだと思う
ブヨ

利点の1つは、コードの量によって支払いが行われると、余分なコードが生成されることです。「doSomething; GetResultOfSomething; HandleErrorsFromSomething;」
Ⴖuі15年

回答:


13

グレッグヤングによると、このアイデアはBertrand Meyerから生まれました:コマンドとクエリの分離

すべてのメソッドは、アクションを実行するコマンド、または呼び出し元にデータを返すクエリのいずれかである必要がありますが、両方ではないことを示しています。言い換えれば、質問をすることで答えが変わることはありません1 より正式には、メソッドは参照的に透明であり、したがって副作用がない場合にのみ値を返す必要があります。

1:Eiffel:ソフトウェアエンジニアリングスライド43-48の言語

ドメインドリブンデザインでは、これはグレッグヤングによって命名されたコマンド-クエリ-読み取り分離/分離(CQRS)に似ています。

このCQRS記事でMartin Fowlerが言及したように、グレッグヤングはバートランドのCQSのアイデアを取り入れてCQRSを命名しました。

利点

  • 読み取り(クエリ)部分は、書き込み(コマンド)部分とは異なる方法でスケーリング/微調整できます。2つを分離すると、最適化/パフォーマンスが重要な場合に、どちらかが互いに邪魔になるのを防ぐことができます。

詳細については、Martin Fowlerリンクの記事を参照してください。


1
当然のことながら、多くの状況で有用な結果を生成し、同時にいくつかの変更行うことは、2つのハードウェアを別々に行うよりも高価ではありません。
デュプリケータ

1
@Deduplicator InterlockedCompareExchangeである決まり文句の例?
Ⴖuі15年

1
このアドバイスは、戻り値がコマンドで行われた内容に関する情報である場合には明らかに適用されませんが、データセットから行を削除する方法は、データセットの状態をかなり変更し、指定された基準に従って指定された行を削除できます。その後、削除された行数、またはその行を含むリストを返します。
T. Sar

4

どこから来たのかわかりませんが、良いアドバイスであり、理解するのはかなり簡単です。

適切に設計されたプログラムは、さまざまな部分に分割され、さまざまな方法で結合および構成されます。特定の部分が何をするのかを推論するのが難しいほど、プログラムが予測可能な方法で反応することを確認するのが難しくなります。

副作用を引き起こす部分を分離することで、残りの部分の推論、テスト、デバッグが容易になります。副作用を生成する各部品の副作用の数を減らすと、同じ方法でその部品を操作しやすくなります。

さらに分解すると、戻り値が効果になります。副作用は効果です。関数が持つ入力と効果の数が多いほど、実際に何をするのかを推論するのが難しくなるため、関数は1つの効果(可能な場合)のみを生成します。


このdoen'tはさえ見、質問が尋ね対処しようと回答する方法
ブヨ

主な質問(「」)、余分なクレジット(「なぜ)んではない、このアドレス余分なクレジット一部:?私の質問@gnat二つの部分に来た
ウェインコンラッド

私の読書(「主張された利益」)ごとに、why-partは引用の著者によって提案されたものであると予想されます。質問はすべての可能な利点のリストを求めているようには見えません
-gnat

2
@gnat私は質問をこのアドバイスを理解しようとする試み、その背後にある理由とそれが与えられた文脈の両方として理解しました。質問の一部だけを取り上げるのは不適切だとは思わない。
モルゲン

1

追加クレジット:このアドバイスに従うことで最初に主張される利点は何ですか?

戻り値を副作用から分離することの利点の1つは、短絡評価によって引き起こされる可能性のある潜在的な問題を取り除くことです。

bool FooWithSideEffect() {
    // do query
    // do side effect
    return resultOfQuery;
}

bool BarWithSideEffect() {
    // do query
    // do side effect
    return resultOfQuery;
}

void BadShortCircuitEvaluation()
{
    // the programmer's intent is to have side effects of both functions
    if (FooWithSideEffect() && BarWithSideEffect() ) {
        // do something
    }

    // in case FooWithSideEffect() returns true, 
    // then BarWithSideEffect() is not called at all
    // because of short-circuit evaluation
}

これはアドバイスの著者によって主張された利点ですか?
ブヨ

@gnat私は歴史的で実用的なものを混ぜ合わせました、私は恐れます。
ニックアレクセエフ

1
コメントとコードが一致せず、FooWithSideEffectsがfalse
jkを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.