Flexとオブジェクト

Flexの様な便利なツールで開発をしていると、つい基本的な事を忘れてしまう。

先日、ArrayCollectionを参照するAdvancedDataGridを扱っていて、ArrayCollectionの値を更新して反映させると言う事をやっていた。

AdvancedDataGridの側ではAdvancedDataGridRendererProviderのrendererに対して、ClassFactoryを使って独自のDataRendererを当てると言う微妙に複雑なことをやっていたのだが、更新した筈なのに、更新する都度何故か同じデータで全てが更新されてしまう。

これは開発中のシステムなので、全く違う例えで説明するが、例えば、既にAさんの出身地に福岡県と言う情報がある場合、Bさんの情報に対して佐賀県という出身地を追加して更新すると言う感じだ。

この時に、Bさんは当然佐賀県となるのだが、Aさんも佐賀県と設定されてしまっている。

更新対象の検索に関する部分を調べたがバグは無さそうなので、DataRenderer辺りにバグがあるのかと思い調べていたがこちらもバグらしいものは無くハマっていた。

結局、原因は、追加しているオブジェクトにあった。

実は追加する情報は出身地だけではなく他の情報、好きな食べ物、生年月日等いくつかあって、これをオブジェクトとして1固まりの情報として追加していたのだが、このオブジェクトを作るときにうっかり new Object()をやって初期化していなかったのだ。

内容はAさんBさんの都度変更していても、元のオブジェクト(箱)が同じなので、後から変更される情報に全て変更されてしまう筈だ。

このオブジェクトは他からも参照するので、宣言のスコープを広くしていたが、宣言の時にnew Object()はしていても、内容を変更する時にはやってなかった。

僕はてっきり、Aさんの情報を保存するオブジェクトとBさんの情報を保存するオブジェクトはそれぞれ異なる宣言をしている(異なる箱を確保している)ので、単にそこにデータを追加しても、その時点で縁が切れる(出身地などの情報がコピーされて、その箱に入る)絶対アドレスだと思っていたが、そうでは無く、最終的に追加する為のオブジェクトを参照している相対アドレスだと言う事を知らなかった。

つまり、出身地などの情報が入る箱は一つで、Aさんの情報を保存している箱の中にはその箱の場所だけが入っていたと言う事だ。
それなら、参照している情報は1つしか無いので参照先も情報も変わる筈だ。

こんな事はCなんかやっていた時は常に意識していた事なのだが、今更初歩的なバグで恥ずかしい限りだった。

カテゴリー: Flash Builder, 仕事   パーマリンク

コメントは受け付けていません。