ちょっと真面目に語ります 検証チーム

丸紅情報システムズ 検証チームによる、検証ソフトのご紹介・
メーカー記事のご紹介・技術ノウハウ・つぶやき等を日々更新しております。

丸紅情報システムズ メビうさ
  • TOP
  • Emboldを使用したコーディングのベストプラクティス

2022.08.05 | Embold

Emboldを使用したコーディングのベストプラクティス

クリーンなコードを記述するために最善の方法をとることは、アプリケーションの作成においては中々に困難が付き纏います。

クリーンなコードに近づけるために、Emboldのような静的コード解析ツールを使用することで達成できる改善点のいくつかを紹介していきます。


一連の良くない例と、それらを回避する方法を見ていきましょう。


ここでは、Javaで記述された例を使用してクリーンなコードを記述することに焦点を当てていますが、どの言語にも適用できます。

C/C++の場合は、MISRAチェックを開発プロセスに組込むことが有効です。

スレッド

Runnableインターフェースを使用してスレッドを作成する簡単な例です。

public class MainServer implements Runnable {
     @Override
     public void run() {
         System.out.println("Hello World");
     }
     public static void main(String[] args) {
         MainServer ex = new MainServer();
           Thread t1= new Thread(ex);
           t1.run();
     }
}

上記のコードでは、start()メソッドを使用してスレッドを開始する代わりに、t1.run()が呼び出されます。
普通のコードの様に見えます。
いいえ、マルチスレッドを実現するためには、通常のメソッドではなく、スレッド様に個別の実行を発行する必要があります。

start()
   –スレッドを作成してから、run()メソッドを実行

run()
   –通常のメソッドとしてrunメソッドをコール!
   –スレッドは作成されない


ここで、run()メソッドをstart()に置き換えて、マルチスレッドを実現するようにコードを変更するとします。

public class MainServer implements Runnable {
     @Override
     public void run() {
         System.out.println("Hello World");
     }
     public static void main(String[] args) {
         MainServer ex = new MainServer();
         Thread t1= new Thread(ex);
         t1.start();
     }
}

ただし、スレッドを複数回呼び出す必要がある場合は、毎回start()を使用することはできません。
したがって、その場合はrun()を使用する必要があります。

Catch

複雑さが増しコード行が増えることから、catchブロックを垂直に伸ばす代わりに、単一のcatchブロックで複数の例外に対応します。


垂直スケーリングcatchブロック

public class MainServer {
     public static void main(String[] args) {
         try {
            // do something
         } catch (IllegalArgumentException e) {
            throw e;
         } catch (IllegalStateException e) {
            throw e;
       }
     }
}

水平スケーリングcatchブロック

public class MainServer {
     public static void main(String\[\] args) {
           try {
              // do something
           }catch (IllegalArgumentException | IllegalStateException e) {
              throw e;
           }
              // catch block is better now!
     }
}

変数の命名

かつて誰かが言った言葉ですが、今ではミームとなっているものがあります

コーディングの間は、約99%が変数の名付け、1%がロジックについて考えています。

遺留捜査の糸村警部補であれば、「と、誰かが言っていました」というところでしょうか。


変数に意味のある名前を付けると、他の開発者がコードから値を見つけるのに役立つため、コードを作成するときは変数の命名を考慮する必要があります。

int isValid;
int hasVowels;
Boolean isOkay;

上記のコードでは、int変数はブール値(真または偽)のように宣言されています。
これにより、大規模なアプリケーションで作業する際の読みやすさと保守性の問題が軽減されます。

int setName()
{
     return name;
}

上記のコードでは、一見セットメソッドのように見え、(実体がなにかわからないですが)何かを返しています。

void intToInteger(){}

intをオブジェクトIntegerに変換することを示し、Integerオブジェクトを返す必要があるのですが...


変数、クラス、およびメソッドを宣言する時、以下のような命名規則を意識することをお勧めします。

クラス
   –大文字の後に小文字を使用します(例)Student

メソッド
   –キャメルケース(ラクダのこぶのような)を使用します(例)toIntArray()

変数
   –final修飾子を利用する変数の場合はアンダースコアを使用します(例)PIN_NUMBER
   –変数が一般的な単語である場合は、アンダースコアを避けます(例)age

JDBC

PreparedStatement
   DB接続を使用する場合はPreparedStatementを使用します。
   SQLインジェクション攻撃の防止に役立ちます。

リソースを閉じる
   リソースを効率的に使用するために、使用後のリソースが閉じていることを確認してください。

   例)効率的なリソース使用率を実現するために、Connection、ResultSet、Statementオブジェクトなどのリソースを使用後に閉じます。

デッドコード

デッドコードは、プログラムで使用されていない又は呼び出されることのないコードの一部です。
デッドコードはコード行を増やし、メモリも消費します。
プログラムのどの部分からも使用されていない、呼び出されていないメソッドや変数を取り除くことで排除できます。

サニタイズ

何があろうとも、システムへのアクセスを提供する前に入力をサニタイズします。



これらは、クリーンなコードの記述を開始するためのテクニックの一部です。
私たちはコーディングするとき、呼吸をするかのようにこれらすべてを意識せずにこなすことはできません。
そのため、Emboldのような静的コード解析ツールは、見逃した可能性のある問題を見つけるのに非常に役立ちます。
時間の経過とともに、エラーが少なくなり、最高のコーディング作業を行えるようになります。
Emboldは問題をレイティングし、優先順位をユーザーに提示することができるので効果的に品質を向上させることができます。

皆さん、Embold(静的コード解析ツール)を有効活用しましょう。

技術本部 アプリケーションサービス技術部 加藤 剛宏

技術本部 アプリケーションサービス技術部加藤 剛宏

制約なく旅行に行ける日を期待しつつ、いけないもどかしさを仕事にぶつける日々を過ごすとあるエンジニアです。

丸紅情報システムズ株式会社 丸紅情報システムズ株式会社
丸紅情報システムズ メビうさ