Haxe: 条件付きコンパイル記述を型宣言部分に利用
前回の記事を書いておきながら、条件付きコンパイル記述を行わないと厳しい箇所が出てきたため 部分的に利用していく事に。今後まだまだ揺れそうですが一つの方針としてメモしておきます。
前回の記事) Haxe: CreateJS と Flash API 共通する箇所は interface を作成して記述を簡略化
http://www.dango-itimi.com/blog/archives/2013/001174.html
条件付きコンパイル記述における懸念点の一つとして、以下がありました。
・条件付き記述で囲まれた行はリファクタリングの対象とはならない
例として、以下の様なソースコードを挙げました。
package shooting.enemy; #if flash import flash.display.DisplayObjectContainer; #elseif js import createjs.easeljs.Container; #end class Enemy { private var view:View; public function new( #if js layer:Container #elseif flash layer:DisplayObjectContainer #end ){ view = new View(); layer.addChild(view); } }
これを以下のように変更する事にします。
package shooting.enemy; #if flash import flash.display.DisplayObjectContainer; #elseif js import createjs.easeljs.Container; #end class Enemy { private var view:View; public function new( layer:#if js Container #elseif flash DisplayObjectContainer #end ){ view = new View(); layer.addChild(view); } }
このようにすることで、layer 変数はリファクタリングの対象となり、Rename での名前変更対象ともなります。
問題点としましては、ソースコードが見にくいという点と、エディタ IntelliJ IDEA 上でエラー表示がされてしまう、という点が挙げられます。上記例ではエラー表示はなされませんが、以下の様な記述ではエラー表示がなされます。
・フィールド変数での記述
private var layer:#if js Container #elseif flash DisplayObjectContainer #end;
・メソッド引数での Class 型指定
public function new(viewClass:Class<#if js Container #elseif flash DisplayObjectContainer #end>){ }
エディタ上でエラー表示はされてしまいますが、コンパイルは通ります。