私はSession
オブジェクトを持っています。そのうちの1つのグローバルインスタンスsession
が現在のセッションを保持しています。現在のセッションは、サーバーに永続化し、やり直しのやり直しなどを処理できます。
セッションは、Objects
のインスタンスを保持します。この例では、基本的にCars
オブジェクトのセットです。ユーザーが変更したとき車の位置を表す地図上のマーカー。対応するCar
オブジェクトを更新し、セッションを保存してやり直してサーバーに永続化できるようにします。
不完全な図:
コード:
function Session(sessionId, objectsSave){
this.objects = new Objects();
if (objectsSave !== undefined)
this.objects.restore(objectsSave);
Session.prototype.saveSession = function() {
var save = this.objects.save();
// persist to server and add to redoStack
}
function Objects() {
this.objects = [];
}
Objects.prototype.restore = function(save){
var objects = [];
save.forEach(function(obj) {
objects.Push(Car.prototype.restore(obj));
});
this.objects = objects;
};
function Car(){
this.markerOnMap = new Marker();
this.markerOnMap.onDrag = this.setLocation;
this.markerOnMap.onDragEnd = session.saveSession; // here using the global variable, does not work when instantiating Session with a save object
Car.prototype.setLocation = function(e) {
this.location = e.location;
}
var session = new Session();
Session
をインスタンス化するときに、(「悪いデザイン」の感覚以外に)問題が発生します。サーバーからのデータ。 Session
コンストラクターで新しいObjects
インスタンスを作成し、それをsaveで復元すると、Car
オブジェクトが作成され、グローバル変数session
の関数を参照しようとします。ただし、このコードはsession
のコンストラクターから呼び出されたため、Session
はまだ割り当てられていません。たとえば、それを次のように変更しました:
this.markerOnMap.onDragEnd = function(){session.saveSession()};
または、this
コンストラクタからSession
のコンストラクタまで、Car
を渡します。私はグローバル変数、すべての循環参照を持つために何が悪いのかわかりません、またはより良い解決策がありますか?
実際、構築プロセスには設計上の欠陥があります。Car
は作成時にSession
を必要とします。この依存関係は、Car
を使用してSession
をデシリアライズすると問題になります。
問題は 単一の責任の原則: を尊重しないためです。Car
を作成するときは、オブジェクトを作成するだけで、コンテナーに挿入しないでください。この2番目の手順は、特定の目的でCar
をインスタンス化する関数/オブジェクトの責任です。
あなたの場合、 ビルダーのデザインパターン を検討することをお勧めします。この設計では、複雑なオブジェクト(ここではセッション)の構築を、その部品の構築と組み立てに分けています。これには、パーツを独立して構築できることが必要です。
あなたの「悪いデザイン」の感覚は正当化されます。グローバル変数を介してオブジェクト間で通信することは、間違いなくコードのにおいです。
Session
コンストラクターでCar
インスタンスへの参照を提供することは、私にとってそれほど悪いことには聞こえません。または、Car
は、saveSession()
を直接呼び出すのではなく、save
イベントを発生させることができます。次に、イベントリスナーをSession
にアタッチするためにファクトリ関数が必要になりますが、Car
はSession
に直接依存しません。