2012-03-05 4 views

答えて

3

プロパティにプリミティブ型(文字列、数値、ブール値)または不変オブジェクトへの参照(String,Number)がある場合、呼び出し元が行うことはできないため、値/参照を直接返すことですそれによってオブジェクトの状態が変更されます。

プロパティが変更可能なオブジェクト(配列、ObjectDate、他のもののとてもたくさん)への参照型を持つ場合、それはあなたが呼び出し側は上のプロパティを変更できるようにしたいかによって異なりあなたのオブジェクトのコピー。そうした場合は、参照を返します。そうでない場合は、クローンしてください。例えば

は、のプライベート配列し、その配列に対して実行できるいくつかの操作でオブジェクトを想定してみましょう:

var obj = (function() { 
    var o = {}; 
    var theArray = []; 

    o.addItem = function(item) { 
     theArray.push(item); 
    }; 

    o.getItemAt = function(index) { 
     return theArray[index]; 
    }; 

    return o; 
})(); 

(これは、オブジェクト設計の栄光の一例であることを意味するものではないことに注意してください。: - ))

これで、getArray操作を追加します。あなたは配列への参照を返すことができ

::次の2つの方法でそれを行うことができます(のようにそれから項目を削除するには、物事のすべての種類を行うことができ、発信者を意味

o.getArray = function() { 
    return theArray; 
}; 

を...、オブジェクトが以前サポートしていなかった操作)は、オブジェクトの状態を変更します(以前のプライベート配列に直接アクセスできるようにしているため)。

それとも、配列のクローンを返すことができます。

o.getArray = function() { 
    return theArray.slice(0); 
}; 

...プライベート配列に何もできない発信者を意味し、彼らはそれだけのコピー上で動作することができますそれらを与えた。

0

これは、プライベートプロパティが不変かどうかによって異なります。それが不変の場合、変更することはできず、それを返すことに害はありません。しかし、それが変更可能ならば、それを返すことは情報隠蔽のOOP原則を破るでしょう。

それは原始的な不変のint型/数だ場合、それは二つのことを達成しているので、その後、私有財産を返すことは結構です:

  • あなたは私有財産を隠し、インタフェース、およびの実装に変更を提供それはプリミティブ型だと

しかし、もし値によって渡されるため、私有財産は、あなたのように簡単に

  • (この場合の値)返されたオブジェクトは、呼び出し側で変更することはできませんインターフェイスを壊さないであろう可変部を返すメソッドから配列し、あなたの言語がオブジェクトを参照渡しする場合、呼び出し元がこの内部オブジェクトを変更する可能性があるという事実を受け入れる必要があります。これにより、内部コードが破損する可能性が非常に高くなります。

    これらの理由から、変更可能なオブジェクトにコピーを返す予定の場合は、そのコピーを作成し、元のオブジェクト自体は返しません。

  • 0

    一般に、プロパティを使用する場所は、プロパティ値を変更できないはずです。これはOOPの重要な原則、すなわちカプセル化を満たす。

    関連する問題