4D v17のオブジェクト、v16プロジェクトからの移行時の注意
v16からv17に移行したプロジェクトの場合、データベース設定の「互換性」に次の項目がある。
1)オブジェクト記法を使用してオブジェクトのプロパティにアクセスする
2)オブジェクトではISO日付フォーマットの代わりに日付型を使用する
v17で新規作成したプロジェクトにこれらの項目はない。
オブジェクト型の変数はv15から使えていて、その当時は次のコード1のような使い方だった。
コード1:
C_OBJECT($obj)
OB Set($obj;”sl_id”;String(1))
…
$sl_id:=Num(OB Get($obj;”sl_id”))
ところがv17では次のコード2のように使う。
コード2:
C_OBJECT($obj)
$obj:=New object
$obj.sl_id:=1
…
$sl_id:=$obj.sl_id
両方とも使ってみたが生産性が違う。単なる表記の違いではなく機能が違う。コード1では、オブジェクトのプロパティに”sl_id”のように文字列を指定しているが、ダブルクオーツで囲むためカラーシンタックスが働かない。カッコ、ダブルクオーツ、セミコロンで囲まれているためか、フィールド名が違っていても気づきにくい。また、一部サポートされていないデータ型があるため、当社では上記のようにすべて文字列としてプロパティに値を代入していた。その結果としてオブジェクト内部ではデータ型は失われていたことになる。型チェックは働かない。
コード2では、ドットに続く表記はフィールド名になる。カラーシンタックスが働く。オブジェクト内部でデータ型が維持される。型チェックが働く。いいことしかない。
OB Setの記述を見つけたら、今のうちに全部置き換えておこう。OB Setは、コードの見た目も良くないし、v15からの実装という新しめのコマンドながら、すぐに博物館行きになりそうだ。ちなみにOB Setでセットされたプロパティの内容は、ドット表記でも参照できるし、その逆も可能だが、混在はやめたほうが良い。たいした手間ではないのでドット表記に統一しておくことをおすすめする。