読者です 読者をやめる 読者になる 読者になる

定食屋おろポン

おろしポン酢と青ネギはかけ放題です

悩ましきコード整形

論理演算子のコード整形ってなんだか悩ましいですね。
まずは例を。UIViewのautoresizingMaskを設定するコード。いくつかの設定値の論理和を取ります。

view.autoresizingMask = (
                         UIViewAutoresizingFlexibleTopMargin |
                         UIViewAutoresizingFlexibleLeftMargin |
                         UIViewAutoresizingFlexibleWidth |
                         UIViewAutoresizingFlexibleHeight
                         );

ここで、UIViewAutoresizingFlexibleHeightのみをコメントアウトしたいと思って、

view.autoresizingMask = (
                         UIViewAutoresizingFlexibleTopMargin |
                         UIViewAutoresizingFlexibleLeftMargin |
                         UIViewAutoresizingFlexibleWidth |
//                         UIViewAutoresizingFlexibleHeight
                         );

などと書くと、構文エラーでコンパイルが通らなくなります。UIViewAutoresizingFlexibleWidthの横に付いている、論理和演算子"|"の右辺がないためです。
同様に、以下のように行を昇降させた場合もコンパイルが通りません。

view.autoresizingMask = (
                         UIViewAutoresizingFlexibleWidth |
                         UIViewAutoresizingFlexibleHeight
                         UIViewAutoresizingFlexibleTopMargin |
                         UIViewAutoresizingFlexibleLeftMargin |
                         );

一方、配列ではこんなことはありません。このような配列で、Sundayのみをコメントアウトしても全く問題ありません。

NSArray* dayNames = @[
                  @"Monday",
                  @"Tuesday",
                  @"Wednesday",
                  @"Thursday",
                  @"Friday",
                  @"Saturday",
                  @"Sunday",
                  ];
NSArray* dayNames = @[
                  @"Monday",
                  @"Tuesday",
                  @"Wednesday",
                  @"Thursday",
                  @"Friday",
                  @"Saturday",
//                  @"Sunday",
                  ];

(Objective-)Cに限らずともたいていの場合、配列の最終要素の後につけたコンマは無視されます。*1
そのため任意の要素(行)を手軽にコメントアウトしたり、順番を変えたりできるわけですが、これは非常に便利です。

もしも論理和計算でこれを実現しようと思うと、末尾要素にゼロを置く必要があります。以下のとおりですが、スマートとは思えません。

view.autoresizingMask = (
                         UIViewAutoresizingFlexibleTopMargin |
                         UIViewAutoresizingFlexibleLeftMargin |
                         UIViewAutoresizingFlexibleWidth |
                         UIViewAutoresizingFlexibleHeight |
                        0);// 要素末尾にゼロを置く

知らない人が見たら「なんでこんなところにゼロがあるねん。。アホ?」って思うでしょうね。

同様に複数の条件をもつIF文で書くと、以下のようになります。「何がしたいんだ。。?アホ?」って突っ込まれることでしょう。

if (
    cond0 ||
    cond1 ||
    cond2 ||
    NO)
{
    //...
}

うーん、悩ましい。

*1:IE6, 7は死ね。