はじめに
Chrome拡張で「定時退勤生存システム」というジョーク拡張を作りました。
なぜ作ったのかは私にも分かりません。
- GitHub: sato-suzu
- X (Twitter): @Sato_Suzuki (普段の生息地です)
拡張機能の概要
実装している機能は以下の通りです。
- 上司接近警報
- メンタルゲージ
- トイレ籠城
- エナドリブースト
- 推し凝視
- 定時ダッシュ機能
動作イメージはこちらになります。
https://satosuzu.web.fc2.com/
我ながら何を作っているのだろうと思います。
作った後にAIへコードレビューを依頼したところ思いもよらない指摘を受けました。
JavaScriptとしては普通です。
ただしベースの.NETエンジニア臭が隠せていません。
な、なんだってー!
※本記事のレビューコメントはAIとのやり取りを元に再構成しています。
問題のコード
const state = {
isBoredToDeath: false,
mentalGauge: 100,
isHomeProtocolExecuted: false,
isBossAlerted: false,
targetTime: { hours: 17, minutes: 45, seconds: 0 }
};
AI曰く
これはJavaScriptというより
EmployeeStateクラスの残骸です。
とのこと。
確かに見返してみると脳内ではこんなコードを書いていた気がします。
public class EmployeeState
{
public bool IsBoredToDeath { get; set; }
public int MentalGauge { get; set; }
public bool IsHomeProtocolExecuted { get; set; }
public bool IsBossAlerted { get; set; }
}
否定できない。
enumを我慢しているらしい
現在の実装では以下のように文字列を直接使っています。
document.getElementById('status').innerText = 'HOME_SAFE';
しかしAI曰く
この人はまだ enumを定義するのを我慢している段階です。
とのこと。
確かに今でも頭の中にはこれが見えている。
public enum EmployeeStatus
{
Ready,
WaitingForTeiji,
HomeSafe,
Crashed,
ForceQuitted
}
メソッド名が完全にC#
さらに指摘されたのがこれ。
shutdownSystem();
updateMentalUI();
checkTimeReached();
JavaScriptとしては普通ですが.NETエンジニアが読むと脳内で自動変換されます。
ShutdownSystem();
UpdateMentalUI();
CheckTimeReached();
なぜバレた。
イベント駆動よりループ信仰
個人的に一番刺さったAIからの指摘がこちらです。
今回は以下のようなループでシステム全体を監視しています。
while (state.isBoredToDeath) {
// ...
await new Promise(r => setTimeout(r, 1000));
}
AI曰く
このコードはイベント駆動ではなく監視ループ文化で設計されています。
とのこと。
確かにJavaScript界隈だとsetInterval()やaddEventListener()などのイベント駆動で組むことが多い印象です。
心当たりしかない
言われてみると私の脳内ではたぶんこうなっていました。
while (_isBoredToDeath && !token.IsCancellationRequested)
{
CheckBossDistance();
await Task.Delay(1000);
}
あるいは
public async Task StartMonitoringAsync(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
Scan();
await Task.Delay(1000, token);
}
}
完全に業務アプリのバックグラウンド監視処理です。
AIによる診断
AIによると私は現在、以下のような発想でコードを書いているらしいです。
状態 ➔ ループ ➔ 監視 ➔ 判定 ➔ 状態更新
つまりJavaScriptを書いているつもりでも以下のあたりの影響がまだ強く残っているようです。
BackgroundServiceWorker ThreadTaskCancellationToken
否定できません。
元ネタのC#
このChrome拡張には元ネタがあります。
それがこちら。
public class BossApproachException : Exception
{
public double Distance { get; }
public BossApproachException(double distance)
{
Distance = distance;
}
}
そしてthrowで上司接近を通知します。
throw new BossApproachException(ScanBossDistance());
さらに catch で回避。
catch (BossApproachException ex)
{
EmergencyRecovery();
}
冷静に考えると「上司をExceptionで表現する設計はどうなんだ?」という話ですが…
AIによる総評
レビュー結果を要約すると以下の通りでした。
- JavaScriptとしては普通
-
stateが実質DTO - enum欲が漏れている
- class欲も漏れている
-
StatusManagerを作りたそう - イベント駆動より監視ループが好き
- 脳内ではWinFormsが動いている
まとめ
JavaScriptを書いているつもりだったのですが以下のような進化ルートが見えていました。
state ➔ enum ➔ class ➔ StatusManager ➔ DI ➔ Blazor
危うくChrome拡張がBlazorになるところだった。
結論として「.NETエンジニアはどこへ行っても.NETエンジニア」なのかもしれません。
最後にAIからいただいた一言を置いておきます。
「まだ enum を作るのを我慢している段階です」
図星でした😇