私は、コード レビューを行い、これまで個人的に取り組んだことのない新製品の 1 つに新機能を追加する可能性について報告するように依頼されました。他人のコードを盗むのは簡単だということはわかっていますが、(できるだけ客観的であるように努めながら) 悪い状態にあると言えます。私のコードレビューからのいくつかのハイライト:
スレッドの乱用:
QueueUserWorkItem
およびスレッドは一般的に多く使用され、スレッドプール デリゲートにはPoolStart
やなどの有益でない名前が付けられていますPoolStart2
。また、スレッド間での適切な同期の欠如もあり、特に UI スレッド以外のスレッドで UI オブジェクトにアクセスしています。マジック ナンバーとマジック ストリング: 一部
Const
の とEnum
はコードで定義されていますが、コードの多くはリテラル値に依存しています。グローバル変数: 多くの変数はグローバルに宣言されており、たどるコード パスと発生する順序に応じて、初期化される場合とされない場合があります。これは、コードがスレッド間でジャンプする場合にも非常に混乱します。
コンパイラの警告: メインのソリューション ファイルには 500 以上の警告が含まれており、その総数は不明です。Visual Studio から、これ以上警告を表示できないという警告が表示されました。
中途半端なクラス: コードはあちこちに手を加えたり追加したりしたため、以前に行ったことを忘れてしまったのではないかと思われるため、一見中途半端なクラスや空のスタブがいくつかあります。
Not Invented Here : この製品は、データ アクセス ヘルパー、エラー ログ ヘルパー、ユーザー インターフェイス ヘルパーなど、他の製品で使用される共通ライブラリに既に存在する機能を複製しています。
関心の分離: 典型的な「UI -> ビジネス レイヤー -> データ アクセス レイヤー」の 3 層アーキテクチャについて読んだときに、誰かが本を逆さまに持っていたと思います。このコードベースでは、UI レイヤーがデータベースに直接アクセスします。これは、ビジネス レイヤーが部分的に実装されているものの、十分に具体化されていないためにほとんど無視され、データ アクセス レイヤーが UI レイヤーを制御しているためです。低レベルのデータベースおよびネットワーク メソッドのほとんどは、メイン フォームへのグローバル参照で動作し、フォームを直接表示、非表示、および変更します。かなり薄いビジネス層が実際に使用される場合、UI を直接制御する傾向もあります。この下位レベルのコードのほとんどは、
MessageBox.Show
例外が発生したときにエラーメッセージを表示し、ほとんどが元の例外を飲み込みます。もちろん、これにより、リファクタリングを試みる前に、プログラムの機能を検証するために単体テストの作成を開始することが少し複雑になります。
ここではほんの表面をなぞっているだけですが、質問は単純です。時間をかけて既存のコードベースをリファクタリングし、一度に 1 つの問題に焦点を当てた方が理にかなっているでしょうか、それともすべてをゼロから書き直すことを検討しますか?
編集:少し明確にするために、プロジェクトの元の要件があります。そのため、最初からやり直すことがオプションになる可能性があります。私の質問を別の言い方をすると、次のようになります。コードを維持するコストが、ダンプして最初からやり直すコストよりも大きくなるポイントにコードを到達させることはできますか?