調べ物した結果

現役SEが仕事と直接関係ないことを調べた結果とか感想とか

三項演算子について考えてみた~いったい使用すべき場面はどこなんだろうか。という話~

qiita.com

というようなショッキングなタイトル記事を見つけて、実際のところどうなんだろうね。ということでちょっと考えてみた。

結論?

僕はメインの開発言語は「C#」なので「C#」ベースで考えるけど、
・「ほとんど使う場面ねーな」
・「パッとみて、見やすいか。何やっているか(業務背景が)理解できるか」
を基準に使いどこはほにゃほにゃ。というのが正直なところ。といった形。
その辺はちゃんとチームで話し合いなさいよ・・・とも思う。

こーゆー実装が・・・

            // 処方なら・・・
            if(order is Prescription)
            {
                quantity = order.Quantity;
            }
            else
            {
                quantity = 1;
            }

こうなる。すっきり気持ちいいね。という話だが・・・

          int quantity = order is Prescription ? order.Quantity : 1;

そういえばLinqとかいうのもあったよね。C#

C#で言えば、Linqもよくやり玉にあがってる気がする。賞味なれないととっつきにくいし、ひどい書き方をすれば「異常に見にくい」というのは確かだと思う。
ただ、これはLinqに限った話じゃないので、結局は「可読性を意識しなさいよ」で、書き方に自由度のある部分はプロジェクトにより「規制」されたりする。
そういう意味ではSQLも結構ひどいと思うけど、あんまり体系的に「こうすると見やすいよ」というあれは見ないな。見てないだけだと思うけど。

可読性の話をするなら・・・

言語は特定しないと・・・というのはすごく思った。C#はどちらかというと意識しなくても明示的に書ける言語だと思うし、
きっとそうゆう思想なんだと思う。(vb.netとかと比べると、書かなきゃいけない宣言部分は多い。がそれがいいところだとも思う)
そうなると、三項演算子自体が相性が悪いんじゃねーかなー。なんて思う。
逆にpythonなんかだと「極力短く」的な部分があるように思える。積極的に使っていっても問題ないのではないか。言語使用も加味するべき。べきべき。

いつ使うんだろうか・・・。

上のサンプルソースを書いてる途中にも思ったが、そもそもQuantityがちゃんと仕事してくれたらええんじゃねーかと・・・

    public interface IOrder
    {
        int Quantity { get;}
    }

    public class Prescription : IOrder
    {
        int _quantity;
        int IOrder.Quantity
        {
            get
            {
                return _quantity;
            }
        }
    }

    public class Injection : IOrder
    {
        int _quantity;
        int IOrder.Quantity
        {
            get
            {
                return 1;
            }
        }
    }

細かい実装がだいぶ怪しいけど、こーゆー感じにそもそも返してくれることを望む。
そーゆーケースが多いんじゃないかと思う。まずは書かなくても済みそうな設計があればそっちに倒したい。
もともとDBの関係でなぜか「String」でQuantityを持っていたりとか。そーいった残念なケースもあると思う。

他には、電子カルテとか巨大なパッケージをいじってるとよくあるのが、
パッケージのオプション設定の「ON/OFF」が大量にあって、画面で読み込むケース。ユーザー仕様で「これはつかいたい。あれは使いたくない」が盛りだくさん。
巨大なテーブルに「1」か「0」で格納されててうんざりする。大量のチェックボックスがある画面をイメージしてもらえればあってる。

大体こんな感じ。なのが各画面のいたるところで現れる。死。

            var masterValue = MasterAccesser.GetPackageSetting("なんかのKEY");

            if (masterValue == "1")
            {
                returnValue = "1";
            }
            else
            {
                // 1以外はデフォルトの「0」で・・・
                returnValue = "0";
            }

コメントに書いてるように、パッケージでは設定があろうがなかろうが、
とにかく動け。という強い思いがあるので、デフォルト(パッケージの標準値)に倒すように設計する。

  var masterValue = MasterAccesser.GetPackageSetting("なんかのKEY");
  returnValue = masterValue == "1" ? "1" : "0";

と、こーはかける。かけるには欠けるが・・・
「1」ってそもそもなんだよチクショウ・・・とか。
えっと。どっちがデフォルトでなにがなんだって???はーん???
ってなる。書き方の問題もあるが、むやみやたらに三項演算子は使えない。というかいつ使うんだろう。というのが結論。
※これも結局ちゃんと設計しろよ。という気がしないでもない。でももう手が出せないし。

使えそう。ありかなーという例

qiita.com

ほか

null判定演算子は好き。積極的に使っていく所存。