親切なプログラムを目指そう!

記事
IT・テクノロジー

親切なプログラムを目指そう!

コマンドラインからデータをプログラミに渡して、色々なデータで足し算ができるようになりました。便利なプログラムに近づいてきました。でも、一つ問題があります。今回は、利用者が期待通りの入力をしない場合について考えてみます。


何もデータを入れないとどうなる?

まずは、前回のプログラムのソースコードです。

const data = process.argv;
const a = parseInt(data[2]);
const b = parseInt(data[3]);
// Display input data A and B
console.log(a, b);
const result = a + b;
// Display the result
console.log(result);
前回は、コマンドラインから「1」と「2」を指定して実行しました。

PS C:\Users\TH\Documents> node add.js 1 2
1 2
3
PS C:\Users\TH\Documents>
別のデータ「123」と「456」でも問題なく動作します。

PS C:\Users\TH\Documents> node add.js 123 456
123 456
579
PS C:\Users\TH\Documents>
所が、何も入れないとどうでしょうか?

PS C:\Users\TH\Documents> node add.js
NaN NaN
NaN
PS C:\Users\TH\Documents>
のようになります。

プログラムは正常に動作している!

これでも実は、プログラムは正常に動作しています。

文字の集まり(文字列)を数字(整数)に変換する関数「parseInt()」は、数字以外の文字列の場合には、数字でない(NaN:Not-A-Number)と言う値を返します。

したがって、最初の行の入力された数値を表示する部分は、空白("")なので変換結果は「NaN」になります。 数字でない値と数字でない値を足した結果も数字ではありませんので「NaN」になります。つまり、このプログラムはちゃんと動いていると言う事です。

プログラマで、NaN の意味がわかる人にはこれでも良いかもしれませんが、プログラマでない利用者がこのプログラムを利用した場合はどうでしょうか?

恐らく何が起きているかよく分かりませんよね?

特に初心者のプログラマがプログラムを書く場合には、「数字が入力される」と言うのが前提条件になっている場合が結構あります。 したがって、テストもそう言う場合には、数字を入れた場合のみで行われる場合が当然多くなります。これが、この連載でも何回か取り上げた「想定内」のテストです。

慣れたプログラマになると、利用者が思った通りの入力をしてくれない場合があるという事をきちんと理解しています。 そう言う事があるとわかっていると、プログラム側での対応も変わってきます。

親切なプログラムとは?

このプログラムの場合は、どのように処理すると使いやすく便利なプログラムになるでしょうか? 考えてみて下さい!

このプログラムの利用者がする可能性のあるのは:

* 正しく入力する(プログラムの起動、数値が二つ正しく入力される)
* 数値の数が正しくない(数値がない、数値が一つ、数値が三つ以上)
* プログラムの起動が正しくされない
* 数値でない値(数字以外の文字)が入力される
あたりが、考えられる入力です。

プログラムが正しく起動されないのは、プログラムではどうにもなりませんので、プログラムの書き方では対応できませんので除外するにしても、与えられるデータの数が正しくなかったり、数値以外が入力された場合には、何がおかしいのかメッセージを出せると利用者に何が起こっているのかを伝えることができます。

こうしたメッセージをエラーメッセージなどと呼んでいますが、プログラムを書く際には想定されるエラーに対するメッセージを表示できるとより良いプログラムにすることができます。

改善したプログラムの例

では、このプログラムを修正してみます。

今回は、以下の二点を改善します。

プログラム起動時に指定されたデータをチェックして数値以外の場合はエラーメッセージを表示する
プログラム起動時に指定されたデータが 2 個以外の場合にはエラーメッセージを出す
対応の方法はいくつかありますが、今回は以下のようにしてみました。

const data = process.argv;
if (data.length !== 4) {
  console.log("数値を二つ指定して下さい");
} else {
  const a = parseInt(data[2]);
  const b = parseInt(data[3]);
  if (isNaN(a)) {
    console.log(data[2] + " は数値ではありません。");
  } else if (isNaN(b)) {
    console.log(data[3] + " は数値ではありません。");
  } else {
    // Display input data A and B
    console.log(a, b);
    const result = a + b;
    // Display the result
    console.log(result);
  }
}
指定されたデータの数は、「node」と「プログラムのファイル名」を含めて、四つでなければエラーなので最初に、データの数をチェックしてエラーメッセージを出しています。配列(array)のデータの数は「data.length」でチェックできます。 データが正しく四つ指定されている場合は、与えられた数値の部分「三番目」と「四番目」のデータの変換結果が「NaN」かどうかを、「isNaN()」を使ってチェックします。数値の場合は「false」を数値以外の場合(NaN)の場合は、「true」を返します。 これを、「if 文」で条件の判定をしてエラーメッセージを表示できるようにしています。

以下が上で想定した場合の実行例です。

(例では、データが 1 個の場合や 3 個以上指定されたケースは実行していません。)

PS C:\Users\TH\Documents> node test.js
数値を二つ指定して下さい
PS C:\Users\TH\Documents> node test.js a b
NaN は数値ではありません。
PS C:\Users\TH\Documents> !v
vi test.js
PS C:\Users\TH\Documents> node test.js a b
a は数値ではありません。
PS C:\Users\TH\Documents> node test.js 1 b
b は数値ではありません。
PS C:\Users\TH\Documents> node test.js 1 2
1 2
3
PS C:\Users\TH\Documents>
これで、入力が期待通りでない場合も、利用者に何がおかしいのかをある程度伝える事ができるので、最初のプログラムよりは、より使いやすいプログラムになります。

まとめ

プログラムはプログラムを書いた人以外も利用するケースが殆どのため、実際に想定されない使い方をされる場合がたくさん出てきます。そうした際に、利用者に何がおかしいのかを伝える事ができるとより便利で使いやすいプログラムにする事ができます。

エラー処理のやり方はいろいろありますが、今回はその一つの例を紹介しました。

プログラムを書く際には、想定した手順以外の操作や、誤ったデータを渡したり、データの数が期待以外の場合もたくさんおきます。実際にデータの処理をする前に、手順やデータをチェックするとそうした、想定外の操作もある程度見つけることが可能です。こうした、処理を加えることで、プログラムが想定外の動きをしたりするのを防いだり、利用者に正しい操作やデータを促すメッセージを出したりすることが可能になります。

プログラムを書く際には、期待される処理を正しく行うことはもちろん重要ですが、こうした想定外に対する対応も重要になります。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す