条件論理が重要な信号を沈黙させるとき
TL;DR: 条件付き支店でのステータスレポートを省略すると、静かな遅れやレース条件が発生します。
TL;DR: 条件付き支店でのステータスレポートを省略すると、静かな遅れやレース条件が発生します。
トラブル
- ユーザー遅延
- 貧しい経験
- 予想外のタイムアウト
- 初期化不完全
- 隠れた依存性
- 政策不正管理
- 沈黙の失敗
- Backward Compatibility ダウンロード
ソリューション↓
- すべてのコードパス
- デフォルトレポートメカニズムの使用
- エッジケースの厳密なテスト
- 早期検査のポリシー
- パフォーマンステスト実施
- 条件外のレポートの移動
コンテキスト
条件論理(例えば、グループポリシー)を初期化コードに追加すると、準備レポートなどの重要なステップを省略すると、システム全体の遅延が発生します。
エッジケースは、通常の操作パラメータの外に発生する例外的な条件です。
これらのエッジケースを適切に処理しない場合、コードは予測不能に動作する可能性があります。
このマイクロソフトブログエッジケース処理が欠けている古典的な例を強調します。Windows 7は、ユーザーが壁紙の画像ではなく固体色の背景を選択したときにログイン時間を遅らせた。.
デスクトップの壁紙をロードするためのコードは、壁紙画像を成功にロードしたときにのみ「準備ができている」と報告されています。
しかし、ユーザーが固体色の背景(エッジケース)を選択したとき、このコードパスは決して「準備完了」通知を起動しませんでした。
その結果、システムはログインセクションに進む前に30秒間のタイムアウトを待ちました。
この問題は、見た目小さいエッジケースを欠くことが、ユーザー体験に大きな影響を与える可能性があることを示しています。
5秒間のログインプロセスだったはずのものは、簡単な設定オプションを選択したユーザーにとって、不快な30秒の遅れとなった。
この無邪気な30秒の遅延を、バージョンを持っていたすべてのユーザーに倍増してください。
良いソフトウェアの設計は、コードを通じて可能なすべての経路を考慮する必要があり、一般的な経路だけではありません。
エッジケースを省略すると、神秘的なパフォーマンスの問題、タイムアウト、悪質なユーザー体験として現れる技術的な負債を生み出します。
サンプルコード
間違えました↓
public static class WallpaperInitializer
{
private static bool wallpaperWasDefined = false;
public static void InitializeWallpaper()
{
if (wallpaperWasDefined)
// Assume this was defined previously
// and PLEASE DON'T use NULLs in case you hadn't
{
LoadWallpaperBitmap();
Report(WallpaperReady); // Missed if wallpaper is undefined
}
// No default report, causing delays
}
private static void LoadWallpaperBitmap()
{
}
private static void Report(string status)
{
// The Asynchronous loading keeps on
}
}
正しい
public static class WallpaperInitializer
{
private static bool wallpaperWasDefined = false;
public static void InitializeWallpaper()
{
if (wallpaperWasDefined)
{
LoadWallpaperBitmap();
}
Report(WallpaperReady);
// Always report, regardless of condition
}
private static void LoadWallpaperBitmap()
{
}
}
検出
- (x)半自動
静的分析ツールを使用して、重要なレポート呼び出しを保護する条件を表示します。
コードレビューは、すべての初期化パスが完了信号であることを確認する必要があります。
タグ ️
- 実績
レベル
- (x) 中間
なんでバッテリーが大事なの️
システムの現実世界の行動(たとえば、ログオン速度)は、準備状態の正確なモデリングに依存します。
ソフトウェアは、現実世界の状態とプログラムの状態の間の一対一の調和を維持する必要があります。
ユーザーが Windows で固体色の背景を選択した場合、その選択は有効な現実世界の状態を表します。
(当時の私の個人的な選択も)
プログラムは、この選択を適切に動作する適切なプログラム状態で正しくモデリングしなければなりません。
エッジケースを処理できないことによってこのバイジェクションを破ると、ユーザーの期待とシステムの動作の間の切断を導入します. In this example, users expected their choice of a solid color background to work normally, but instead, they experienced mysterious delays. この例では、ユーザーは固体色の背景を選択して正常に動作することを期待しました。
欠けているバイジェクションは、認知不一致を生み出す: 「私は単純な選択をしたが、なぜ私のコンピュータは奇妙に振る舞っているのか?」この切断は、ユーザーの信頼と満足を損なう。
破損したバイジェクションは、システムの信頼性モデルに破損を引き起こし、時間の経過とともにますます予測不可能になります。
このリンクを破ることは、ユーザーの期待とソフトウェアの実行の間の不一致を引き起こし、予測不能な遅延やマップ現実世界の違反
世代
AI ジェネレーターは、すべてのパスを検証することなく、条件に遺伝コードを天真に包装することによって、この匂いを作り出すことができます。
検出 ↓↓
AI に「すべての支店でステータスレポートを実行することを確保する」と勧告し、この臭いを条件値の外に Report() を移動させることによって標識または修正します。
ぜひお試しください!↓↓
注意:AIアシスタントは多くの間違いを犯す
Suggested Prompt: find missing other reports. 欠けている他のレポートを見つける
Suggested Prompt: find missing other reports. 欠けている他のレポートを見つける
Without Proper Instructions |
With Specific Instructions |
---|---|
結論 ↓
常に初期化コードで無条件に完了をシグナルします。
条件論理は、重要なレポートステップを沈黙させるのではなく、行動を修正するべきである。
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxx
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xviii
詳細情報↓↓
ディスカレーター
Code Smells Are Mine(コードの匂いは私のもの)意見.
テストは失敗につながり、失敗は理解につながる。
テストは失敗につながり、失敗は理解につながる。
バート・ルタン
この記事は CodeSmell シリーズの一部です。