プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

ソフトウェア公開時に気を付けたいこと


ソフトウェアというのは、会社を作らなくても、工場を持たなくても作れてしまいます。
さらに、VectorGithubで公開することも現代では簡単にしかも無料でできてしまいます。

しかし、自分だけが使うソフトウェアであれば多少バグがあっても直しながら使えばよいですが、人が使うときはそれによって(とくに仕事に)問題を起こすと大変です。問題を喰らってしまった方はたまったものではないが、制作者側も信頼を失ってしまいます。
バグを100%なくすことはできない、と言われていますが、できる限り少なくすることは必要です。ここでは私が経験的に蓄積したバグの少ないソフトウェアを開発する手法をまとめてみました。

try, catchは最後に書く

例外がスローされないように、丁寧に入力値を精査することで想定違いの多くが修正できます。try, catchは公開直前に追加するようにします。

入力欄には敢えて想定と違う変数を入力してみる

数値を入力するところに文字列を入力したらどうなるか?自然数が想定されている部分に小数を入れたらどうなるか?負の数を入れたらどうなるか?
文字列はtry.parseなどでチェックを入れ処理を中止する、入力規則(numericUpDownなど)を使う。

極限データ、境界データを入力してみる

境界データを確認する。最大のインデックスを指定してみる、インデックス範囲外を指定してみる、マイナス値を指定してみる。
たとえばif(a>Math.Pow(2,4))のような条件があったとき、aが17ではTRUEで16はFALSEである

クリック出来るボタンを連打する

連打したとき動作に問題が出る場合は計算(動作)中にはボタンを無効化する。

constを適切に設定する

変更されることがない変数はconstで宣言する。しかし変わることがないのに変数とはこれ如何に?

すべての前提条件(チェックボックスラジオボタンなど)を試す

複数のチェックボックスがあるならそのすべての組み合わせを試す。チェックボックスが3つあれば組み合わせは2の3乗で8通りの組み合わせになる。排他的な条件であればラジオボタンを使うことで、3通りにできる。ツールは適切に選択する。

時間の掛かる処理にはProgressbarを表示する

計算量の多い処理が動くときに画面更新が止まるケースがある。Progressbarを表示して、動作中であることを表示する。計算が動いているときに画面更新が止まってしまう場合は、Application.DoEvent()を定期的に呼び出すことで、Progressbarを含め画面更新を動作させることが出来る。
動作中なのにフリーズしたように見えてしまうと、ユーザーは想定外の動作をしやすい。

想定と違う操作順序を行っても問題ないか

データ読み込みと計算の2つの動作ボタンがあるなら、起動後のデータが読み込まれていないときに計算を呼び出したときは、計算が実施されないようにする。ゼロ除算などが起きやすい。

前提とする文字コードは正しいか

ファイル読み込みでは文字コードが異なっても問題はないか?想定外の文字コードである場合は「文字コードが違います!」などのメッセージを出してあげると問い合わせを減らせる。

違う環境で動作させてみる

モニター画面サイズが開発環境と違うとUI(ユーザーフォーム)の端っこにあるオブジェクトが隠れてしまうことがある。オブジェクトは端に設置しすぎない。

接続切れのときの挙動を確認する

USBやネットワーク通信を利用している場合は、動作中に接続が切れても問題は起きないか?意図的に動作中にLANケーブルを抜いてみよう。
再接続したときに続きからうまく再開されるか?不完全なデータセットができたときのError処理があるか?

リーダブルなコードを書く、コードを整形する

自分が一目で処理内容を理解できないならコメントを書いておく。forをi=0ではなくi=1から始めたならなにか特別な理由があるはず。だが3日後の自分はそのことを忘れている、もしかしたら明日の自分すら。昨日の自分は他人、明日の自分は他人と思え。
コードは読みやすく書く。処理を考えながらコーディングしていると変数が散らかったりネストが深くなったりする。最終的には実行速度に影響しないとしても整形しておくほうが良い。インデントをそろえることも読みやすさには重要。
Visual StudioならCtrl+KCtrl+D、PycharmならCtrl + Alt + Lでインデントの整形ができる。

出来るだけパーツ(クラス、関数)に分解しながら構成する

そのコード、パーツ(クラス、関数)に分解できませんか?分解することで変数が追いかけやすくなる。ただし、分解したことによりグローバル変数(パブリック変数)つまりソリューションのどこからでもアクセスできる変数を増やしてしまうなら一考必要。

その他チェックリスト

アイコンは設定したか
Version名は正しいか
ファイル名は正しいか

s51517765のページ

www.vector.co.jp
www.vector.co.jp
f:id:s51517765:20181205224629j:plain
バグがないプログラムのつくり方 JavaとEclipseで学ぶTDDテスト駆動開発 (Be agile!)

バグがないプログラムのつくり方 JavaとEclipseで学ぶTDDテスト駆動開発 (Be agile!)