web-dev-qa-db-ja.com

純粋な機能と不純な機能の違いは?

純粋な関数は常に戻り値の型(つまりvoidであってはならない)である必要があり、オブジェクトの状態に関係なく同じ出力が必要であり、Impure関数はオブジェクトの状態を変更するか、またはオブジェクトの状態。

しかし、私が使用する教科書は次のように述べています:

通常、アクセサーにはreturnステートメントが含まれますが、オブジェクトの状態に関する情報を出力するメソッドもアクセサーとして分類できます。

よくわかりません。どちらが正しいか?

[〜#〜]編集[〜#〜]

少し明確にしておきますが、私に尋ねるのはこの質問です。 

最後の質問は「使用する関数のタイプを与える」であり、そこにコメントした人々は、それが印刷しているので不純な関数であると述べました。

この関数は純粋ですか、それとも不純ですか?

15
Amith KK

this link から取得したコンテンツ

純関数の特性:

  1. 純粋な関数の戻り値は、その引数にのみ依存します。したがって、同じ引数のセットで純粋な関数を呼び出すと、常に同じ戻り値が返されます。

  2. ネットワーク呼び出しやデータベース呼び出しのような副作用はありません

  3. 渡される引数は変更されません。

不純な関数の特徴

  1. 不純な関数の戻り値は、その引数にのみ依存するわけではないため、同じ引数のセットで不純な関数を呼び出すと、異なる戻り値が返される場合があります。たとえば、Math.random()、Date.now()

  2. ネットワークやデータベースの呼び出しなどの副作用がある可能性があります

  3. 渡された引数を変更する場合があります

function impureFunc(value){
  return Math.random() * value;
}

function pureFunc(value){
  return value * value;
}

var impureOutput = [];
for(var i = 0; i < 5; i++){
   impureOutput.Push(impureFunc(5));
}

var pureOutput = [];
for(var i = 0; i < 5; i++){
   pureOutput.Push(pureFunc(5));
}

console.log("Impure result: " + impureOutput); // result is inconsistent however input is same. 

console.log("Pure result: " + pureOutput); // result is consistent with same input
29
A.T.

Wikipedia から-関数に関するこれらの両方のステートメントが次の条件を満たしている場合、関数はpure functionとして記述できます。

  1. 関数は常に、同じ引数値が指定された同じ結果値を評価します。関数の結果値は、プログラムの実行が進むにつれて、またはプログラムの異なる実行間で変化する可能性のある非表示の情報や状態に依存したり、I/Oデバイスからの外部入力に依存したりすることはできません。
  2. 結果の評価 意味的に観察可能なものを引き起こさない 可変オブジェクトの変更やI/Oデバイスへの出力などの副作用または出力。

したがって、コードと比較したときにどちらかのステートメントがfalseの場合、それは不純です。

8
Elliott Frisch

Mu。 アクセサは純粋な関数であると想定しているようです。これは必ずしもそうではありません- getgetメソッドのように、アクセサ(値を返すLinkedHashMap- accessorでも)は不純かもしれません アクセス順序モードの場合(要求されたエントリを反復順序の最後の位置に移動します)。

3
Jeffrey Hantin

両方のステートメントが正しいです。

呼び出される値を取得するためのメソッドを作成するときACCESSOR METHODS

例:

public String getName(){
    return this.name;
}

そして、値を設定するために[〜#〜] void [〜#〜]と呼ばれるメソッドを使用しますMUTATOR METHODSと呼ばれます

例:

public void setName(String n){
    this.name=n;
}
2
CoderCroc

純粋でない関数またはミューテーターメソッドは、オブジェクトの状態を変更し、インスタンス変数に格納されている値を変更します。

1
Amiya Upadhyay