2009年11月11日水曜日

if 文と switch 文の条件部分を関数で分ける。

Illustrator用のスクリプトを書いていて、if文の条件がやたらに長くなってしまい、どうしようかと思うことがあった。
例として、「塗りがC10、またはM10、またはY10のときは塗りを白に、塗りがC100,M100のときは塗りを黒にする」という変換を書いていたとする。
だいたいこんな感じになった。
#target "Illustrator"
var objs=app.activeDocument.selection;

for(var i=0;i<objs.length;i++){
var color=objs[i].fillColor;

if((Math.round(color.cyan)==10 && color.magenta==0
&& color.yellow==0 && color.black==0)
||(color.cyan==0 && Math.round(color.magenta)==10
&& color.yellow==0 && color.black==0)
||(color.cyan==0 && color.magenta==0
&& Math.round(color.yellow)==10 && color.black==0)){

color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=0;

}else if((color.cyan==100 && color.magenta==0
&& color.yellow==0 && color.black==0)
||(color.cyan==0 && color.magenta==100
&& color.yellow==0 && color.black==0)){

color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=100;
};

};
実際はもうちょっと複雑で、書きながらだからコードも汚い。見にくくてしょうがない。
ふと、「if文の答えは結局trueかfalseなんだから、その部分を分けてやればいいのでは?」と思い立ち、書いてみた。
下のような感じ。
#target "Illustrator"
// ----------if条件の定義----------
var check1=function(color){
var c=Math.round(color.cyan);
var m=Math.round(color.magenta);
var y=Math.round(color.yellow);
var k=Math.round(color.black);
var flag=false;
if(c==10 && m==0 && y==0 && k==0){
flag=true;
}else if(c==0 && m==10 && y==0 && k==0){
flag=true;
}else if(c==0 && m==0 && y==10 && k==0){
flag=true;
};
return flag;
};
var check2=function(color){
var c=Math.round(color.cyan);
var m=Math.round(color.magenta);
var y=Math.round(color.yellow);
var k=Math.round(color.black);
var flag=false;
if(c==100 && m==0 && y==0 && k==0){
flag=true;
}else if(c==0 && m==100 && y==0 && k==0){
flag=true;
};
return flag;
};
// --------------------
var objs=app.activeDocument.selection;
for(var i=0;i<objs.length;i++){
var color=objs[i].fillColor;

if(check1(color)){
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=0;
}else if(check2(color)){
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=100;
};

};
全体としては長くなったけれど、コードの役割がきちんと分割できて、ちょっと読みやすくなったと思う。
そこで「if文でできるならswitch-caseでもできるんじゃ?」と思って試す。
まずcaseの部分にfunctionを書き込んでみたが、上手くいかない。
switch-caseの場合はswitch(〜)の部分とcase 〜:の部分が同じかどうかをチェックして、trueなら処理をするという形だから。
ネットを探していると、phpの人がswitchに関数を使っているのを見つけた。
zuzara.com » PHPのswitchのcase文には関数が使える。
memo.xight.org - switch ,case文を読みやすくする
それで書いたのが以下のコード。
#target "Illustrator"

//----- check1、check2 は同上 -----

var objs=app.activeDocument.selection;
for(var i=0;i<objs.length;i++){
var color=objs[i].fillColor;

switch(true){ //trueで固定してしまう
case check1(color):
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=0;
break;
case check2(color):
color.cyan=0;
color.magenta=0;
color.yellow=0;
color.black=100;
break;
default:
break;
};

};

0 件のコメント: