予期しない/予期しない副作用を増やす可能性があるため、in-outパラメータが混乱したコードにつながることは間違いありません。Javaでは必ずin-outパラメータを使用しないでください。
ので、多くの良いプログラマは言う:
は、変更可能なメソッドのパラメータを変更するためのイン・アウトのパラメータを避けてください。パラメータを変更しないでください。
コードが最もきれいで理解できると思われる完璧主義プログラマにとって、この「ルール」はすべての場合に適用する必要がありますか?例えば
、単純なリストに要素を追加するための基本的な方法を想定、二つの方法があります:(イン・アウトのパラメータを持つ)
最初の方法は:
private void addElementsToExistingList(List<String> myList){
myList.add("Foo");
myList.add("Bar");
}
と、発信者であること:
List<String> myList = new ArrayList<String>();
//.......Several Instructions (or not) .....
addElementsToExistingList(myList);
outパラメータなし第二の方法:
private List<String> addElementsToExistingList(List<String> originalList){
List<String> filledList = new ArrayList<String>(originalList); //add existing elements
filledList.add("Foo");
filledList.add("Bar");
return filledList;
}
と発信者ビーイング:第二の方法の
List<String> myList = new ArrayList<String>();
//.......Several Instructions (or not) .....
myList.addAll(addElementsToExistingList(myList));
長所:
パラメータは、新しいコード・リーダのための予期しない副作用の=>危険変更されないされません。第二の方法の
短所:
非常に詳細な、非常に読みにくく...もちろん
は、あなたはこの1のような単純なコードのために、第一の方法は本当に便利であることを私に言うだろう。
しかし、コンセプト/コードの難しさを考慮しなければ、私は読者(初心者でもない)にとってもより論理的で明白な第2の方法を敬遠します。
しかし、戻り値の型を持ち、副作用のない副作用や潜在的な副作用を伴うvoid戻り値を持つ "command"メソッドを考慮したCQSの原則に違反します。
だから、動機づけプログラマーはどのように採用すべきですか?コードケースに合わせた2つのミックス?または、「法律」を常にイン・アウト・パラメーターを避けることを期待してください。
(もちろん、要素を追加する方法は例を説明するための名前であり、実際のコードでは悪い選択です)。
私はあなたに非常に同意しますが、それはいくつかの(実験されていない常に)行う方法の最も一般的なスタイルを表しています:)実際、私は働いている場所で悪い名前で、 – Mik378