ワープロやドローイングソフトなどの編集ソフトを作る上での一般的な考え方を考える「一般的な編集ソフトの作り方」です。
いま、メモリ上に、要素を展開したとき、必要なメソッドは何で、どこにおくか?という話をしています。
必要なメソッドは、
<<メソッド>>
・insert
・delete
・read
・write
・print(表示)
・位置決め
で、今まで、insert,delete,printはやったので、今回はread,writeについてです。
■配列に入れる方法と、親子ツリーをそのまま保存する方法
といっても、以前これはやりました(ここ)。
ただ、あのときは、配列を用意し、IDを振って、そのIDどおりに入れていきました。
もうひとつの方法として、親子関係をそのまま書き出してしまう方法があります。
たとえば、こんなかんじ
<ページ>
<ページ番号>1</ページ番号>
<枠>
<id>1</id>
<X>0</X>
<Y>100</Y>
<WIDTH>100</WIDTH>
<HIGHT>100</HIGHT>
<TEXT>一番目の枠です</TEXT>
</枠>
<枠>
<id>2</id>
<X>120</X>
<Y>100</Y>
<WIDTH>100</WIDTH>
<HIGHT>100</HIGHT>
<TEXT>二番目の枠です</TEXT>
</枠>
<枠>
<id>3</id>
<X>220</X>
<Y>100</Y>
<WIDTH>100</WIDTH>
<HIGHT>100</HIGHT>
<TEXT>三番目の枠です</TEXT>
</枠>
</ページ>
のように、ページの中に枠があるとき、子の要素を順番に書くものです。
■ツリーなら、親子関係のほうが楽
で、XMLにあらわせるような、ツリー関係なら、上記の親子関係のほうが楽です。しかし、親子関係が複雑に入り混じってしまうと、わけ分からなくなってしまっています。たとえば、ある子に親が2つある場合や、フローチャートのIF文のように、いくつかが集まって1つのところに来る場合、どれを先に保存すればいいのか、良くわかんなくなってしまいます。
その場合は、配列のほうが楽です。
■実際には
実際には、親子だけ、配列だけというのではなく、親子関係で書いているけど、子の順番は、配列のように並べて書くなど両方の中間に位置した書き方になります。
■メソッドのある場所
親子関係のようなものの場合、自分のシリアル化(ファイルに書き出せるように、クラスの中身を文字列で表現する)だけを行い、親は、子から集まってきた情報をまとめて、自分の情報もあわせて書いて、自分のシリアル化にします。
たとえば、子供がVector childLisに入っていたとすると、
この保存用データのシリアル化、saveDataは
String saveData()
{
StringBuffer retBuf = new StringBuffer();
// 自分書き出し
retBuf.append("<ページ>);
retBuf.append("<ページ番号>" + pgno + "</ページ番号>");
// 子供の書き出し
for(int i = 0 ; i <childList.size(); i++)
みたいな形で書きます。
こっちの書き方のほうが、全部配列に入れるより、一般的だと思います。
ってことで、読み書きもおしまい