2009-07-17 2 views
2

なぜ多くのプログラミング言語が、関数が渡されたオブジェクトをパラメータとして変更できるようにするのですか? 。例:関数をクリアにすると、そのパラメータを変更できます

SomeObject A(15), B 
B = DoSomething(A) 
print(A + " " + B + "\n) 

このコードを読むと、出力が "15 75"のようになると思います。つまり、Aはそれを構築したものです。しかし、ほとんどの言語はDoSomethingがAの値を変更することを可能にします.C++ではDoSomethingの宣言を見れば、そのパラメータが非const参照として定義されているかどうかを調べることができます。しかし、Pythonのような多くの言語では、関数のコードを読まずに、決して変更しないことを確認する方法は実際にありません。

私はこれを数回機会に噛まれましたこの動作を使用する他の人のコードでは、通常、行ごとにコード全体を調べて、パラメータを変更しようとする行を探します。

一般に、明示的な構文は必要ありません「このオブジェクトは変更可能です」と言う呼び出しによって、たとえば「B = DoSomething(inout A)」と言うことができますか?

「関数に渡されたパラメータを決して変更しない」以外に、問題の発生を防ぐのに役立つコーディング標準はありますか?

+1

言語を選択。 「非常に多くのプログラミング言語」は多くの言語であり、すべての言語の設計上の決定が異なります。 –

+0

Python、C、C++、Javaはすべて私の例に示されているように正確に行うことができるものであり、私はもっと知っていると思っています。 –

答えて

1

「コーディング基準」は、言語やユーザー/チームによって異なります。 C++には、const-correctnessがあります。これは、適切に使用されると、コーディング標準としてカウントされます。明らかなケースの場合、C#はoutrefのパラメータを持ちます。私は、広範囲の言語にわたる唯一の真実の一貫性は、関数の事後条件で常にパラメータの変更を文書化する必要があるということです。

+0

はい、関数に渡す前に、各変数のconst型にキャストするのはまれですが、私の例では、呼び出しコードから参照パスが見えないので、関数を見る必要があります(現代のIDEではそれほど難しくありませんが、コードを一瞥するのではなく、すべての機能をチェックする必要があります)。 ドキュメンテーションは、私の例のような少しのコードを見渡すときには目立つものではありません。 –

1

Javaを見ると、メソッドは実際にパラメータを変更できません(Javaは入力パラメータのみを持ちます)。しかし、パラメータはしばしば、使用するオブジェクトの参照にすぎません。つまり、このメソッドはオブジェクトを可能な限り変更することができます。これは、セマンティクス(ドキュメントを見ることなく)を難しく、関数プログラミングとは全く反対に推論させます。

あなたはこれが望ましくないことは間違いありませんが、短期間で簡単にできました。残念ながら、ほとんどの場合、短期間であるため、隠れた副作用をサポートする言語を使用しています。

+0

それでも規則があります。簡単な例として、getterはプログラムの状態を変更すべきではありません。したがって、コードを読んでいるときに一般にこれを仮定することができます。 –

+0

これは、PODタイプについても当てはまりません。 – scorpiodawg

0

これはコードスニペットを直接的にはっきりさせませんが、とにかく言いたいことがあります:私たちはあなたが望むものを正確に表示するために、パラメータの命名規則を使用しています。私たちは 'in'、 'out'、 'io'という接頭辞を使います。したがって、DoSomething宣言はDoSomething(ioSomeObject inA)のようになります。ビジュアルアシスタントを使用してVisual Studioで作業する場合は、パラメータのタイプと名前を示すポップアップが表示されます。これは可能な副作用を示しています。私の意見では、これは事後条件を文書化するよりも明らかです。

よろしく、

Sebastiaan

+0

これを行う必要がある場合は、少なくとも 'InAttribute'と' OutAttribute'を使用してください。しかし、実際には、それが予想されるケースであるため、 'in'パラメータを文書化する必要はありません。 –

+1

XMLのドキュメントもIntelliSenseに表示されます。その情報は非常に多くの情報が得られます。私はこの慣習に強く反対するだけでなく、CLIアプリケーションでのパラメータの命名規則に違反し、FxCopとStyleCopの両方を無効にします。 –

1

このための私の好ましい設計パターンは不変データクラスです。

変更可能なクラスでは、変更されるかどうかについて考える必要があります。

私の理解では、PythonはJavaとC(修飾子なし)のように値渡しです。しかし、あなたが渡しているのは、通常、変更可能なオブジェクトです。

(編集:。。ほとんどすべての主流の言語は現在、これらのセマンティクスに従って最も顕著な例外は、あなただけではなく、変更可能なオブジェクトを変更することができLispは、ですが、値が変数によって指さ再割り当て)

+0

Pythonは値渡しではなく、私の例ではPythonはAの内容を変更する可能性があります。SomeObjectが不変型でない場合、例えば呼び出すことができます(関数内でパラメータがaと呼ばれると仮定します)。 "a.SetValue (55) "となり、Aオブジェクトの値が変更されます。 –

関連する問題