8

私たちが知っているように、メメントパターンはカプセル化に違反することなく、オブジェクトの内部状態をキャプチャして外部化し、元の状態を知らなくても後で回収できます。

私の質問は、プライベート変数をシリアル化し、オブジェクトの状態をファイルに書き込むと同時に、プライベート変数の値が世界に公開され、カプセル化がここで失敗しているように見えるjava.io.Serializableため、このパターンの下でどのようになるかです。

4

3 に答える 3

4

Memento パターンに関するウィキペディアの記事では、カプセル化については何も言及されていません。実際、そこに示されている例は、Memento のプライベート変数に保持されている状態を正確にキャプチャしています。

カプセル化 (「オブジェクトのコンポーネントの一部へのアクセスを制限するための言語メカニズム」) は、オブジェクトの内部状態を変更するためにコードを記述する方法を指します。

ただし、オブジェクトの内部状態は、文字列の内容が読み取られたファイルまたはネットワークから受信されたデータに依存するなど、外部入力によって決定される可能性があります。チェックボックスの状態は、ユーザーがチェックしたかどうかによって異なりますが、クラスの対応するフィールドにはプライベート アクセスがあり、状態は他のクラスに対して読み取り専用である可能性があります。

フィールドをプライベート アクセス下に置くことでフィールドを保護することは、開発者がオブジェクトの状態を一貫した状態に保つのに役立つことを意味します。つまり、フィールドがそのクラスの外部のコードから一貫性のない状態に設定されるのを回避します (たとえば、フィールドの値がオブジェクトにA依存する場合)。フィールドの値B)。

このデータは秘密であると見なされるという意味で、「プライバシー」とは何の関係もありません。もちろん、シリアル化されたプライベート フィールドを読み取って別のクラスで公開する別のクラスを作成することも、シリアル化されたファイルを編集することもできますが、これから何が得られるかはわかりません。

于 2011-07-07T11:33:32.847 に答える
1

私の理解では、Mementoパターンは、Memento/トークン自体のフォーマット/不透明度/セキュリティについて何も指定していません。mementoの形式(人間が読める形式、完全に暗号化された形式、またはその間の任意の場所)は、パターン自体とは無関係です。

シリアル化(XMLまたはバイナリ)はMemento実装の良い例であると私は主張します。オブジェクトの内部を公開しているという事実は、それがプロジェクトに最適な実装ではないことを意味している可能性があります。ただし、それでもパターンの有効な実装です。:)

于 2011-07-07T17:32:12.723 に答える
0

ウィキペディアのカプセル化の記事から:プログラミング言語では、カプセル化は 2 つの関連するが異なる概念のいずれかを参照するために使用され、場合によってはそれらの組み合わせを参照します。

  • オブジェクトの一部のコンポーネントへのアクセスを制限するための言語メカニズム。
  • データを操作するメソッド (または他の関数) とデータのバンドルを容易にする言語構造。

不透明なオブジェクトの記事から:コンテンツは不透明であり、通常、受信者が Cookie (または私たちの目的ではオブジェクト)データを送信者または後で別のプログラムに戻すまで解釈されません。

カプセル化は壊れていません。memento パターンは、世話人オブジェクトが memento オブジェクトを変更するのを防ぎます。これにより、作成者はロールバックやその他のユーティリティのために memento オブジェクトを取得できます。

于 2011-07-07T12:05:35.037 に答える