📝

日本のエンジニアが実践していない品質第一の一歩目 5日目

2024/10/28に公開

はじめに

プログラムの品質を確保するために一つの手段として警告をエラーにする方法を説明しています。警告はエラー一歩手前の注意喚起なので重要なメッセージであることを理解してもらうことを目的としています。

私が10年以上、ITの現場を見て思ったこと

ぶっちゃけ

納期が最重要で品質ってそこまで大事にしていないよね

エラー出ていなければいいんでしょ、バグが出なければいいんでしょ、それで100点でしょ。
お客側は必要な要件を後付けしてくるし、解釈をフワッとしているし後で追加解釈することも多いよね。
しかも、物を納品出来て受領いただければ次の現場が待ってるし、さよならバイバイですよ。

それでいいのだろうか。いや、良くないんですよ。あとに残された人たちのことも考えよう。

ここで大事なのは2つあると思う。

  • コードの可読性
  • 不具合の可能性を徹底的に潰しておく

前者は経験と技術が必要で一朝一夕に改善は見込めないけど(方法はあるので、後日のテーマとする)、後者は簡単な方法がある。

警告もエラーとして判断するように設定を変更する

警告はコード品質や実行時の安定性・パフォーマンスに関する潜在的な問題を防ぐために、いくつかの基準を設けて出してくれています。文字通り、警告(問題が起こる前に注意)してくれています。この情報をおろそかにする現場が多いこと多いこと。せっかく教えてくれているんだから、それを無駄にしてはいけない。そのために、警告もエラーと同等に扱うように設定変更を初期の段階で実施しましょう。

方法
プロジェクトの .csproj ファイルに下記のタグを追加する

<PropertyGroup>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>←これ
</PropertyGroup>

<TreatWarningsAsErrors> タグは、.csproj ファイルで警告をエラーとして扱う設定を行うタグ。これを true に設定すると、プロジェクト内の警告がすべてエラーとして処理され、警告が存在するとビルドが失敗するようになる。

実際にやってみる

HomeController.csに下記のようなコードを追加してみる。
※C#には警告を発生させるための #warning プリプロセッサディレクティブ(コンパイル前に実行される特殊な指令)がある

    #warning このコードは将来の改善が必要です
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }

すると

来ました、警告、そして一度ビルドをしてみる

PS D:\works\HelloWorldApp> dotnet build
  復元対象のプロジェクトを決定しています...
  復元対象のすべてのプロジェクトは最新です。
D:\works\HelloWorldApp\Controllers\HomeController.cs(11,14): warning CS1030: #warning: 'このコードは将来の改善が必要です' [D:\works\HelloWorld
App\HelloWorldApp.csproj]
  HelloWorldApp -> D:\works\HelloWorldApp\bin\Debug\net8.0\HelloWorldApp.dll

ビルドに成功しました。

D:\works\HelloWorldApp\Controllers\HomeController.cs(11,14): warning CS1030: #warning: 'このコードは将来の改善が必要です' [D:\works\HelloWorld
App\HelloWorldApp.csproj]
    1 個の警告
    0 エラー

経過時間 00:00:02.19

ワークロードの更新が利用可能です。詳細については、`dotnet workload list` を実行してください。
PS D:\works\HelloWorldApp> 

無事警告が表示されました。続いて、警告をエラーに変更してみる。
HelloWorldApp.csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors> ←追加
  </PropertyGroup>

</Project>

そして、再びビルド

PS D:\works\HelloWorldApp> dotnet build
  復元対象のプロジェクトを決定しています...
  復元対象のすべてのプロジェクトは最新です。
D:\works\HelloWorldApp\Controllers\HomeController.cs(11,14): error CS1030: #warning: 'このコードは将来の改善が必要です' [D:\works\HelloWorldAp
p\HelloWorldApp.csproj]

ビルドに失敗しました。

D:\works\HelloWorldApp\Controllers\HomeController.cs(11,14): error CS1030: #warning: 'このコードは将来の改善が必要です' [D:\works\HelloWorldAp
p\HelloWorldApp.csproj]
    0 個の警告
    1 エラー

経過時間 00:00:01.73

はい、これでエラーが発生してビルドが通らなくなりましたね。これをルール化することで未然に不具合の発生を大きく抑えることが出来ます。

最後にGitにaddして、commitしておきましょう。

PS D:\works\HelloWorldApp> git add .
PS D:\works\HelloWorldApp> git status 
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   Controllers/HomeController.cs
        modified:   HelloWorldApp.csproj
        new file:   HelloWorldApp.sln
        modified:   bin/Debug/net8.0/HelloWorldApp.dll
        modified:   bin/Debug/net8.0/HelloWorldApp.exe
        modified:   bin/Debug/net8.0/HelloWorldApp.pdb
        modified:   obj/Debug/net8.0/HelloWorldApp.AssemblyInfo.cs
        modified:   obj/Debug/net8.0/HelloWorldApp.AssemblyInfoInputs.cache
        modified:   obj/Debug/net8.0/HelloWorldApp.dll
        modified:   obj/Debug/net8.0/HelloWorldApp.pdb
        modified:   obj/Debug/net8.0/apphost.exe
        modified:   obj/Debug/net8.0/ref/HelloWorldApp.dll
        modified:   obj/Debug/net8.0/refint/HelloWorldApp.dll
        modified:   obj/HelloWorldApp.csproj.nuget.dgspec.json
        modified:   obj/project.assets.json
        modified:   obj/project.nuget.cache

PS D:\works\HelloWorldApp> git commit -m "警告をエラーに変更"
[master 184e3e6] 警告をエラーに変更
 16 files changed, 32 insertions(+), 3 deletions(-)
 create mode 100644 HelloWorldApp.sln
PS D:\works\HelloWorldApp> 

次回はDB(SQL Server)の環境を整えたいと思う。

Discussion