はじめに
マークシートシステム Mark2をUWPからBlazor WebAssemblyに移行して2年になりました。少しずつ利用者も増えているようです。
Blazor WebAssemblyに移行して以下のような警告が表示されていました。想定している動作には影響が無かったので警告を見なかったことにしていたのですが、そろそろ向き合うことにしました。
GitHub Actionsでビルドしたときの警告
deploy: Models/Survey.cs#L45
Possible null reference assignment.deploy: Pages/Index.razor#L319
Possible null reference argument for parameter 'repositoryPayloadName' in 'void Survey.SetupPositionsFromRepository(string repositoryPayloadName)'.
dotnet runで実行した時の警告
% dotnet run
ビルドしています...
/Mark2/Models/Survey.cs(45,39): warning CS8601: Null 参照代入の可能性があります。
[/Mark2/Mark2.csproj]
/Mark2/Pages/Index.razor(307,49): warning CS8604:
'void Survey.SetupPositionsFromRepository(string repositoryPayloadName)'
内のパラメーター 'repositoryPayloadName' に Null 参照引数がある可能性があります。
[/Mark2/Mark2.csproj]
info: Microsoft.Hosting.Lifetime[14]
警告について調べる
発生している警告が何を示しているのか、まずはMicrosoftのドキュメントを見てみます。
Mark2で発生しているのは以下の警告でした。
- CS8601 - null 参照代入の可能性があります。
- CS8604 - パラメーターに null 参照引数がある可能性があります。
警告が表示されないように修正
Mark2でマークシートの画像処理をする際、以下の2種類のファイルを指定します。
- マーク欄の座標を記述したエクセルファイル
- スキャンしたマークシートの画像
学力調査のマークシートのように同一のフォーマットを多数の拠点で実施することがあります。そのため、エクセルファイルを指定するのではなく、URLのパラメーターを指定して外部のリポジトリから座標情報を読み込む方法を追加していました。
外部への通信は失敗することもあるのでnull許容値型を適切に使用する必要がありますが、それができていなかったようです。
と、このあたりでタイムアップになってしまい、ひとまず以下のようにして警告は表示されないようにしました。!
を使ってしまったのはよくなかったかもしれません。
public class Survey
{
public List<RepositoryPayload> repositoryPayloads = new();
public async Task FetchRepository(string surveyId)
{
HttpClient client = new();
string url = "https://repository.mark2.org/api/" + surveyId;
var repository = await client.GetFromJsonAsync<Repository>(url);
if (repository != null)
{
this.title = repository.name;
- this.repositoryPayloads = repository.payloads;
+ this.repositoryPayloads = repository.payloads!;
}
}
- public void SetupPositionsFromRepository(string? repositoryPayloadName)
+ public void SetupPositionsFromRepository(string? repositoryPayloadName)
{
}
}
おわりに
きちんと解決できたわけではないのですが、これまで無視していた警告が何を意味していたのかを認識しました。すぐに修正できるかと思っていたのですが、一朝一夕には難しかったです。この冬はMark2のソースコードをきれいにしていきたいと考えています。
その他、Mark2で取り組みたいこと
久しぶりにMark2のソースコードを眺めて、変数名の命名規則を公式ドキュメントに準拠させることを思い出しました。現状では変数名がcamelCaseだったり、Rubyで書いたプロトタイプの影響でsnake_caseだったりしています。
また、Blazor Advent Calendar 2023の14日目に投稿されていたBlazor WebAssemblyとOpenCVで画像処理をしている記事が興味深かったです。
Mark2ではマークシートの四隅の矩形検出を連結領域の最大面積で求めていますが、OpenCVが使えるのであればOpenCVの矩形検出を使ったほうが精度がよくなりそうです。