こんにちは。
以下は単に僕の考えであり、ベストプラクティスかどうかはわからない、ということを念頭に置いて読んでいただければなと思います。
また、プログラミングの知識があることを前提に書いています。その点もご了承ください。
まず、ご提示された方法では問題が発生する場合があるかと思われます(ただしMOG_WeatherEXのコードは確認していないため、このプラグインで問題が発生するかどうかは未確認)。
ご提示の方法は
・$gameSystem._weatherEX_Dataの値が未定義ならば、初期化処理を再度やり直す
というものになるかと思います。
この方法が問題なのは
「チェックしているのは$gameSystem._weatherEX_Dataなのに、別の値まで一緒に初期化されてしまう」という現象が発生するためです(最初にも述べた通り、この挙動がMOG_WeatherEXにおいて問題となるかどうか僕は知りません。たまたま他の値を初期化していないなら(あるいはしていても)うまく行くかもしれませんし、行かないかもしれません)。
上記が最も問題となる部分ですが、次に
「$gameSystem._weatherEX_Dataが未定義であるかどうかを$gameSystem._weatherEX_Dataを使用するあらゆる箇所でチェックしなければならなくなる」という問題が発生します。
これは$gameSystem._weatherEX_Dataを使用する箇所が増えるたびにコードが汚れていくことを意味します。
そこで僕が好んで使用する方法の一つは
・getterを用意して、そこで初期化がなされているかどうかのチェックをおこなう
というものです。
これはGame_System(や他のセーブデータに保存するGame_XXX系のクラス)に対する処理として結構いい感じなのではないかなと思っています(他にもっといい案があれば教えて下さい)。
具体的には以下の通りとなります(length云々でエラーが発生しているということなので、配列として初期化しています。
もし生成した配列に対する初期化処理が必要なら、ここでその処理を実行してください)。
コード: 全て選択
Game_System.prototype.weatherExData = function() {
return this._weatherEX_Data || [];
};
あとは$gameSystem._weatherEX_Dataとして直接プロパティにアクセスしていた場所をgetterに置き換えます($gameSystem.weatherEX_Data())。
こうすると、実行時に初期化されているかどうかをチェックしてから$gameSystem._weatherEX_Dataを返すようになるため、エラーは発生しなくなるかと思われます。
なお当たり前ですが、未定義でも動作するような書き方をしていない限り、上記のgetter作成は_weatherEX_Dataだけではなく、全てのメンバに対しておこなう必要が出てきます。
以上となります。
なにか参考になりましたら幸いです。