ワープロやドローイングソフトなどの編集ソフトを作る上での一般的な考え方を考える「一般的な編集ソフトの作り方」です。
はじめに、ここで取り上げる内容、つまり、編集ソフトを作る上で共通的な部分について考えました。
具体的には、以下の3箇所です
・メモリ上に、要素(編集しているもの)をもつ
・イベント発生時の動き
・画面の構成
今は「メモリ上に、要素(編集しているもの)をもつ」ということについて考えていて、その表現法としての連結リストをやっています。
今日は連結リストの保存と読み込みです。
■なにが問題なのか?
連結リストには、前、後のところに、(Cの場合)ポインタ、(Javaの場合)オブジェクトが入っています。XMLで保存するような場合、これを、そのまま入れても。。。??となってしまいます。
そこで、ポインタを何かに置き換えないといけません。
■そこでIDを使う
そこで、IDを使います。各要素は、
public class Item {
int id;
Item prev = null;
Item next = null;
}
ってことで、共通してIDをもってます。このIDを、prev,nextの代わりにセットします。
■方法-オブジェクト生成時
なので、オブジェクト生成時、一意になるように、IDを振ります。
具体的にはドキュメント(ファイルを保存する単位)でstaticかなんかでID(の最高値)を持っていて、オブジェクト生成時に、IDを1つ加えて、そのオブジェクトのIDとします。
ドキュメント生成時は、IDは0になります。読み込みの場合は、後述しますが、IDも保存してあります。
■保存するとき
1.まず、ドキュメントで持っているID(の最高値)をもとに、配列を用意します(要素をすべてnullで初期化して置きます)。
2.その配列に、IDをもとに、オブジェクトをセットしていきます
3.IDを振りなおします
→これをやんないと、IDが、どんどん増えていき、
削除追加を永遠と繰り返すといつかは桁あふれする。
ただし、それはずーっと先の話なので、
そこまで考えないならふりなおさないでよい
ドキュメントで持っているID(の最高値)を0にして、
配列をみていき、もし、オブジェクトがあったら1上げてそ
の番号を振りなおし、nullだったら、次へ。。を繰り返し、
最後まで。
4.書き出し用のDomなり、なにかシリアライズするものなりを用意し、
1つ1つの要素を配列を見ながらセットします。
そのときに、prevのところは、リンクをたどって、そのIDを、
nextのところも、リンクをたどって、そのIDを、いれます
(NULLは、0)
5.書き出し時には、4のものと一緒に
ドキュメントで持っているID(の最高値)も書き出します。
注意:IDを振りなおした場合、この操作後、
書き出し前とIDは、変わっています。
■読み込み
1.書き出しの4に相当する、Domなり、シリアライズされた
オブジェクトを読み込みます
2.ファイルに保存されている
ドキュメントで持っているID(の最高値)を読み込み、
メモリ上のオブジェクト用の配列を作成し、
その分、prevとnextはまだ埋めないで、
そのオブジェクトを配列に入れます
3.1のオブジェクトをもとに2のオブジェクトをセットします
そのときprev,nextは、ID=配列番号をもとに、オブジェクトを
セットします。
もっといい方法はあるかもしれません。
でも、とりあえず、これで、まあ、読み込み、書き出しはできます。
ってことで、今回はここまで