なべひろBlog

プログラミングをメインに仕事に関するアレコレを発信しています。

質の高いプログラム (使用者に優しい)

質の高いプログラムとは何でしょう?

仕様書通りに作ったプログラム?←それは当たり前の話であって質が高いとは言えないと思います。

作る側、使う側、どんな機能があるかなど色々な要素を基に質の基準は変わるとは思いますが、私が考える質の高さは

1. 使用者に優しい

2. 止まらない

3. コントロールの配置が適切である

今思いついたのはこの3つでした。

【使用者に優しい】

私が作るWindowsアプリケーションやPLC+タッチパネルでよくある構成が「初期化」と「スタート」です。

初期化でモータの原点サーチをしたりエアーシリンダーを所定の位置にセットし、全ての準備が整ったらスタートします。

電源投入時、機械がどんな状態にあるか分からない場合は必ず「初期化」を行わなければいけません。

この時に「スタート」ボタンが有効だと、勘違いで押してしまう可能性があります。

なのでパソコン画面やタッチパネルのボタンは必ず「押せない」状態にします。

機械的なスイッチは無理なので、押したら「エラー」状態などにして中断します。

もし「スタート」ボタンがいつでも押せる状態でうっかり押してしまったら...

使用者:「押してはダメな状態なのに押せる方が悪い」

開発者:「ちゃんと確認して押せ」

はい、こんなやり取りは何度となく見てきました。

私としては押してはダメな時は押せないようにしろです。

確認してから押せなんて開発者のエゴでしかありません。

押せないようにするだけで余計なトラブルに巻き込まれる事もありません。

開発者は常にワーストケースを想定しならが考えるべきだと思います。

この「ワーストケースを想定」は2番の「止まらない」にも当てはまりますが、これは次に書きたいと思います。

似たようなケースで数値入力があります。

C#ではTextBoxに数値以外の入力を抑制するプログラミングテクニックを検索するといっぱい出てきます。

しかし単純に数値以外を排除すればいいのかと言ったら一概には言えません。

マイナス符号は?小数点は?...じゃあこの2つは入力を許します。

数値の途中で符号を入れられたら?小数点のキーを複数回押されたら?

符号や小数点を許可しても想定外な入力をさせる可能性はいっぱいあります。

無論、使用者は意地悪でやっている訳ではありませんので入力ミスを問うのは可哀想です。誰だってキーの打ち間違いはあります。

入力が終わって次のステップに行こうとしたら「入力間違いがあります」のメッセージが出たらガッカリしますよね。

だったら入力補助的なプログラムを作って使用者を助けてやればいいじゃんって事になります。

C#ならキーが押されたイベントがあるのでそこでこんなメソッドを呼んでTextBoxの中身をこっそり書き換えてやれば利用者が幸せになれます。

private string checkNumber(string str)
{
    // 先頭がカンマなら先頭に0を加える(まずは必要な数値を追加)
    if (str.IndexOf('.') == 0)
         str = '0' + str;
    //先頭が符号で次がカンマの場合0を加える
    if ((str.IndexOf('+') == 0 || str.IndexOf('-') == 0) && str.IndexOf('.') == 1)
    {
         str = str.Insert(1, "0");
    }
    bool comma = false;
    // 一度文字列をchar配列に分解して1文字ずつチェック
    char[] array = str.ToCharArray();
    for (int i = 0; i < array.Length; i++)
    {
         // 最初に出現したカンマ以外は文字に変換(後で正規表現で削除)
         if (array[i] == '.' && comma == false)
         {
             comma = true;
         }
         else if (array[i] == '.' && comma == true)
         {
             array[i] = 'a';
         }
         // 先頭以外に出現した+や-は文字に変換(後で正規表現で削除)
         if (i != 0 && (array[i] == '+' || array[i] == '-'))
         {
             array[i] = 'a';
         }
    }
    // char配列を文字列にして正規表現で「a」を消して返す
    return System.Text.RegularExpressions.Regex.Replace(new string(array), @"[^0-9.+-]", "");
}

上記プログラムはC#ならListやらLINQを使えばもっとシンプルになりますが、どんな処理をやっているのかを明確にするために配列やforループを使ってます。

もしかしたら、もっとシンプルにできる可能性もあるので考えてみてください。