Fujitsu The Possibilities are Infinite

 

  1. ホーム >
  2. ITサービス、ソリューション >
  3. 富士通の総合システム開発体系「SDAS」 >
  4. 技術情報 >
  5. Java講座 >
  6. 第3回:ソースレビューで検出すべきコーディングレベルの問題点

Java講座
第3回:ソースレビューで検出すべきコーディングレベルの問題点


ソースレビューとは、人間によるコーディング作業を行った段階で、そのソースプログラムを目視により見直す作業です。 ソースプログラムのミスをテストで発見する前に、人間のチェックによって障害を発見するというのが直接の目的です。 そのほかにも、他人の目でソースプログラムを見直すことで様々なコーディングの間違いや勘違いを発見するなど、重要な効果が期待できます。
コンパイルエラーもなく、規約チェックツールでも問題が発生しない、実行結果も正しい、それで正しいプログラムが書けているでしょうか?
実行結果は正しかったとしても、別の条件でテストをすれば誤りが発見されるかもしれません。 通常のテストだけでプログラムの全てのバグをみつけるのは困難です。 そこでプログラミングを行う途中でソースレビューを行い、ツールでも発見できない勘違いやミスを見つけることは重要な作業となります。 設計・実装段階でのソースレビューにより、障害の原因になり得る問題点をあらかじめ取り除いておくことに、ソースレビューの意義があります。 結果的にソースレビューをしっかり実施することで、手戻りが少なくなります。

ここではソースレビューで検出すべき、コーディングレベルで発生する一般的な問題点をいくつかご紹介します。 実際にサンプルプログラムを見ながら、問題点ごとに悪い例をみて、どこが悪いのかを考え、正しい記述とその理由を把握してみます。 なお、ここにあげた問題点がコーディングレベルのすべての問題チェック項目を網羅するものではありません。

次のサンプルプログラム「Circle.java」、「Sample.java」は、円の半径を入力して、面積と円周を求めるプログラムです。 このサンプルプログラムは、コンパイルして実行しても特にエラーやバグは発生しないで、正しい計算結果を出力します。 ところが、「Circle.java」に、変数の使い方や入力に関する6つの問題点が存在しています。

以下にサンプルプログラムの内容と、正しい実行結果を示します。

[サンプルプログラム3-1(Circle.java)]

[サンプルプログラム3-2(Sample.java)]

[正しい実行結果]

それでは以下にソースレビューで検出すべき6つの問題点を示します。

定数・変数の定義

まず、クラスのフィールド宣言において、定数や変数はどう使われるかを見極めて、適切な定義をします。

クラスCircleのフィールド宣言において、次の3つの問題点があります。

  • 問題点1
    ここで、円周率を定数として定義するならばstatic finalとすべきです。
    値を変更させたくないデータの宣言には、finalを指定します。 finalを指定することにより、値の変更を防ぐことができます。
  • 問題点2
    まず、フィールド変数名がその変数の役割を明確に示していません。 (ここでは変数「a1」)
    変数名の命名は、分かりやすい名前にします。 変数の目的・役割が識別できる名前とすべきです。 ここでは変数「radius」に変更します。
  • 問題点3
    フィールド変数はprivateで定義します。 さらに、アクセッサ・メソッド(getter、setter)で変数にアクセスする様にすべきです。 (カプセル化)
    これによって、他のクラスからはCircleの変数「radius」に触れることができないようになり、勝手に変数「radius」を変更されるということがなくなります。

以上の3つの問題点をふまえて修正すると、次のようになります。

[【問題点1】の修正(フィールド宣言の修正)]

[【問題点2】の修正(フィールド変数名の修正)]

[【問題点3】の修正(カプセル化)]

また、クラスCircleのコンストラクタのローカル変数の名前に問題があります。

  • 問題点4
    ローカル変数名がその変数の役割を明確に示していません。 (ここでは変数「a2」)
    変数名の命名は、分かりやすい名前にします。 変数の目的・役割が識別できる名前とすべきです。 ここでは変数「inRadius」に変更します。

この問題点をふまえて修正すると、次のようになります。

[【問題点4】の修正(ローカル変数名の修正)]

例外の取扱い

メソッド内の例外の取扱いは、例外を処理する理由がプログラム上で明確に示されるようにコーディングしてください。

クラスCircleのメソッドcircleRadiusの例外の取扱いに2つ問題があります。

  • 問題点5
    入力された値を検証せずに処理をしています。 正しい値かどうか検証し、正しくない値が入力された場合の例外処理を実装する必要があります。
  • 問題点6
    Exceptionを継承する全ての例外をcatchしています。 これだとcatchすべきでない例外もcatchしてしまう可能性があります。 従って、このメソッド内で処理すべき(処理できる)と考えられる例外だけをcatchするようにします。

以上の2つの問題点をふまえて修正すると、次のようになります。

[【問題点5】の修正(入力値の検証)]

[【問題点6】の修正(例外処理)]

いかがでしょうか。 あくまでも簡単なサンプルプログラムですが、このように修正することで、以前より高品質かつ、第3者がみてもわかりやすい(保守性の高い)プログラムとなりました。
実際のプログラミングでは、この他にもたくさんの勘違いやミスを犯すことがあります。 ソースレビューを行った結果を記録しながら、よりよいプログラミングができるようにしていきます。

また、本文中でご紹介したサンプルプログラムがこちらからダウンロードできますので、是非ご活用ください。