ワープロやドローイングソフトなどの編集ソフトを作る上での一般的な考え方を考える「一般的な編集ソフトの作り方」です。
いま、メモリ上に、要素を展開するには?という話をしています。
その方法として、連結リストを使う場合、
共通要素として
public class Item {
int id;
Item prev = null;
Item next = null;
}
のような形で持っていて、各要素、たとえば、ドローイングソフトなら、
四角形を
public class Shikaku extends Item {
/*
* 座標と幅、高さ
*/
int x;
int y;
int width;
int hight;
/*
* 線の色
*/
byte line_r;
byte line_g;
byte line_b;
/*
* 中の色
*/
byte fill_r;
byte fill_g;
byte fill_b;
}
のように、共通要素を継承して、各要素をつくるということは、第三回に書きました。
今回は、その個別要素のうち、属性の表現方法です。
■属性値とは
各要素における属性値とは、ドローイングソフトの四角形なら、
・位置
・大きさ
・中の色
・線の色
DTPソフトの文字なら
・文字コード
・フォント
・色
・位置
などなど、要素がもつ値をさします。
したがって、属性値は各要素によってことなりますし、バージョンによっても異なるときがあります(バージョン1では、文字の色はなかったが、バージョン2から文字に色が付けられるなど)。そして、下位バージョンでは、上位バージョンで、どのような仕様追加(属性追加)が起こるかわからない(上位バージョンは未来のことなので)という特徴?があります。
■単純に値を設定してしまう方法
このとき、一番簡単なのは、上記の例にあるように、全部、属性値を書き出してしまうことです。この場合、上位バージョンで新たに設定されたような内容は無視します。そのため、下位バージョンで開いて保存すると、上位バージョンでしか設定できない内容は、クリアされてしまいます。
この方法は、仕様変更が起こりやすいですが、簡単で、後述の方法より処理が早いことが期待されます。
■DOMやHashMapに入れる
もともとドキュメントがXMLで書かれている場合、項目の属性値もDomの中に入っています。そこで、その項目の属性値が入っているnode(というか、項目自体のNode)をもっておいて、
public class Shikaku extends Item {
Node itemInfo;
}
としてしまったり、属性値のキーと値をハッシュマップにいれて
public class Shikaku extends Item {
HashMap zokusei;
}
としてしまう方法があります。
この方法の場合、上位バージョンで設定された属性も、そのままの形でもち、それを保存するので、なにも操作しなければ、もんだいありません。
ただし、下位バージョンで、ある要素をコピーして、どこかに貼り、それを保存した場合、上位バージョンにしかない属性もコピーして保存できてしまうと、下位バージョンの見てくれとちがってしまいますし、じゃあ、上位バージョンの属性は落としてしまうと、上の方法と大して変わらないし。。。
という問題はあります。
なお、この場合、属性をHashMapにいれてしまうなら、すべての形は、
public class Item {
int id;
int kind; // 項目種別
Item prev = null;
Item next = null;
HashMap zokusei; // 属性
}
というように、すべて、同じ形で表現できます
(が、だから個々の要素のクラスがいらないかというと、
他の件で作ったほうがいい理由もある)
■折衷案
しかし、HashMapやDomにいれるものは、表示時、毎回、属性値のHashMapやDomをアクセスして探さないといけません。これは面倒です。
なので、良く使うような属性(位置や色など)は、値でもっていて
(この値を共通要素にいれるか、各要素のクラスにいれるかは、
その人の判断)
あんまり使わないようなものとか、上位バージョンでセットされたような
わけわかんない値を、HashMapにいれておく
というようにしたほうが、いいのかもしれません。
ま、好みですけどね。。
ということで、属性値の表現方法は終わり。