回答:
procedural
またはfunctional
パラダイムでプログラミングしているかどうかに依存します。前者にはミュータブルな状態が必要であり、後者には障害があります。これはリンゴとオレンジです。彼らは両方ともバイリウィックで正しいです!
単一の割り当てやその他の機能的手法を命令型の手続き型言語に適用できます。不変状態では並行プログラミングがより確定的になりますが、JavaやC ++などの言語ですべてのオブジェクトを不変にすることは、そのメモリモデルがこのパラダイムを簡単にサポートしないため、ほとんど不可能です。
私があなたの質問を正しく理解している場合、パラメーターまたはクラス変数/メンバー/フィールド/などの使用を修飾する条件は何ですか?関数ではなくメソッドを参照していると思います。これが特にC ++に関するものである場合は、質問をスタックオーバーフローに移動することをお勧めします。
長いパラメーターリストは、メソッドをより詳細なものにリファクタリングする必要があることを示している可能性があります。一般に、パラメーターを使用すると、コードの結合が緩くなります。これが最近のほとんどのオブジェクト指向言語に当てはまるかどうかはわかりませんが、特に多くのクラス変数が関係している場合は、オブジェクトの作成にコストがかかる可能性があります。したがって、クラス変数がオブジェクトであり、プログラムで頻繁に参照されている場合、それらはクラス変数であると正当化される可能性があります。
また:
いいえ、状態変数自体は副作用を引き起こしません。
(他の場所に表示されるデータ構造で)セッターメソッドを呼び出すと、副作用が発生します。
データ構造を使用して、長いパラメーターリストと非表示を非表示にすることができますが、それに応じて構築すると、副作用を回避できます。以下に小さな例を示します(Javaの場合、テストされていません)。
class ManyParams {
final String theName = null;
final int theAge = 0:
ManyParams() {}
ManyParams(String a, int b) { theName=a; theAge = b; }
public withName(String n) {
return new ManyParams(n, this.theAge);
}
public withAge(int i) {
return new ManyParams(theName, i);
}
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));
もちろん、ManyParamsのコンストラクターは、この方法でも長いパラメーターリストを保持します。しかし、その隠された。