0

これは設計上の質問です。オープンエンドとしてフラグを立てないように、可能な限り絞り込みます。

問題

同じデータを保持するクラスを1つまたは2つ設計する効果的な方法が必要ですが、1つは暗号化された文字列としてデータフィールドを持ち、もう1つは復号化された文字列またはintとしてデータフィールドを持ちます。暗号化されたデータを受け取り、一度復号化して、アプリケーションが復号化されたバージョンを使用できるようにします。

私が持っているもの

はさまざまな解決策を思いついたが、それらのどれにも満足していなかった。これは私が試したものです:

  1. ブールフラグが`encrypted`の1つのクラス。最初は`true`に設定され、データが復号化された後に設定が解除されます。短所、同じフィールドは多目的に使用され、プライベートフラグがある場合でも安全ではないように聞こえます。別の欠点として、一部のフィールドは復号化されると異なるタイプになります。たとえば、IDです。理想的には、復号化されたバージョンを正しい最終タイプにしたいので、同じクラスに新しいフィールドを追加しても機能しないため、面倒で複雑になります。データバインディングなどの他のタスク
  2. デコレータパターンについて考えましたが、それが機能する方法は、デコレータとサブジェクトクラスに同じインターフェイスを実装させることですが、ここでも、復号化後にリターンタイプが異なります。
  3. 2つのクラスを用意することを考えました。1つはクラスの復号化バージョン用で、もう1つは暗号化バージョン用です。ただし、このアプローチではコードの再利用は放棄され、復号化されたバージョンで暗号化されたバージョンを拡張し、復号化後にタイプを変更しない暗号化フィールドのゲッターを再利用するという考えを修正しますが、タイプを変更するフィールドはオーバーライドできません
  4. 復号化後もデータを文字列形式のままにして、クラス外の整数に変換することを考えましたが、これは冗長であり、クラスの整数フィールドを使用する必要があるときはいつでも、コードがばかげたコードフラグメントで乱雑になります

この設計上の問題を解決する方法について何かアイデアはありますか?

4

2 に答える 2

1

それらを分離してください。暗号化されたクラスをメッセージクラスとして扱い、復号化されたクラスをエンティティオブジェクトとして扱います。データ型のバリエーションと将来適用するフィールド検証は、管理がはるかに簡単になります。フィールド幅のような単純なものでも、暗号化すると大きくなる可能性があります。

于 2012-11-13T22:21:03.360 に答える
1

フィールドを暗号化する最良の方法は、オブジェクトインスタンスをシリアル化し、結果のストリームを暗号化することです。復号化されたオブジェクトインスタンスを取得するには、ストリームを復号化し、オブジェクトを逆シリアル化します。

于 2012-11-14T00:30:26.553 に答える