Foltia with AppleScript

Foltia animelockerのトラブルシューティング

コードは短ければ短いほどよい if編:アップルスクリプト

短いコードは全体を把握しやすくデバックが楽

Applescriptはほかの言語で使われるSwitchとかの選択文がなく、if文だけで分岐させるやり方です。 ですので分岐がいっぱいあるとif分でインデントされて、横ピラミッドみたいなif文になることがあります。

if a > 0 then

   if b > 0 then

      if c = 0 then

         set z to 1

      else if c > 0 then

         if d > 0 then

            set z to 2

         else

            set z to 2.5

         end if

      else

         set z to 3

      end if

   end if

end if   

これは視認性が悪く、ビューティフルじゃない。 あとif分は ifとendの2行増えてしまうのでハンドラが長くなってしまって後でわかりにくくなります。 またこれだとz変数が定義されない状況が生まれ、この後のコードでzをコールするとエラーが発生します。(例えば a<0の場合とか)。 

なのでif分があれば一行で処理できるようにコードを書くのがよいと思っています。 

例えば

if b > 0 then

set a to false

else

set a to true

end if

こういった一般的なif分枝 これだと変数aを設定するのに5行かかりますが。

set a to true

if b > 0 then set a to false

このように記載するとend ifも記載する必要が無く2行で書けます。 if文自体は長くなりますが、この方が全体が見渡せ変数の定義漏れ等も起こりにくいです。 悪いパターンはif文の中に300行近いコードが書かれているようなものは、PC/MACの画面上でスクロールしなくてはif文の最後まで到達しなかったりします。 これは後で編集しにくいですし、予想外のバグが発生する可能性が高い悪いコードです。 if文で囲まれている空間は潜在的プログラマーにif文内を継続的に意識させ、集中力を削りプレッシャーを持続させる事になります。

文章が短ければ、画面全体を一挙に見渡すことができますし、どこまでがif文が続くのかとか目を皿の様にして見る必要がなくなり、バグを修正しやすくなりますし、後になってコードを読もうかなという気にさせてくれます。 

それはアップルスクリプトの他の構文、tell application, repeat, tryなどでも同様ですね、こういった構文が書かれるとendで囲まれるコードはインデントが自動的にされるわけですが、このインデントは出来るなら2個(ハンドラ内が既にインデント1です)、可能なら3個以内で押さえておきたいです。

真偽判定用のif文が長ければboolean変数を別に用意すべし

条件式が長くなるようなら、真偽用の変数を用意した方が条件設定がちゃんと動作しているのか確認しやすいです。

例えば

if (((a > 0) and (b > 0))) or (c > 0) then return true

return false

こういったコードが有った場合、この変数がとても長かったり、()が多かったりしてプログラマーが想定したとおりに真偽判定が行われていない可能性があります。 そういった場合1行増えますが、

set foo to (((a > 0) and (b > 0))) or (c > 0)

--return foo

if foo then return true

return false

 

こんな形で、条件boolean foo(名前は何でもいいんですけど)を設定しそこで真偽の条件式をやりくりして括弧の数とか中身とか、順番とかがあってるかどうかをif分に入る前にreturn foo(確認する時に行頭の --を外します)することでデバックすることができます。

特に私なんかは"集合"を考える時にいつも絵に描くか声に出して考えないと理解できなくなる体質なので、fooを使って確認することが多いです。 頭のよい方は不要なんでしょうけれど、コードは頭の悪い私たちにも理解できるように書くことが重要なんで、バグ取りがしやすいというのはとても大切です。