CollectionBase を継承するクラスからジェネリックにリファクタリングするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/98426

質問

私は約 250,000 行のコードからなるアプリケーションに取り組んでいます。現在、元々 .NET 1.1 で構築されたこのアプリケーションに取り組んでいる開発者は私だけです。全体に浸透しているのは、CollectionBase を継承するクラスです。すべてのデータベース コレクションはこのクラスを継承します。代わりに汎用コレクション List から継承するリファクタリングを検討しています。言うまでもなく、Martin Fowler のリファクタリングの本には何の提案もありません。このリファクタリングを試してみるべきでしょうか?もしそうなら、このリファクタリングに取り組む最善の方法は何でしょうか?

はい、全体的に単体テストはありますが、QA チームはありません。

役に立ちましたか?

解決

250,000 行はリファクタリングの量が多く、さらに次のいくつかを考慮する必要があります。

  1. リファクタリングされたコードを QA できる QA 部門はありますか?
  2. 古いコードの単体テストはありますか?
  3. プロジェクトの前後に期限はありますか?ユーザーがバグを見つけたときにコードをメンテナンスしていますか?

1 と 2 に「いいえ」と答えた場合、私は何よりもまず既存のコードの単体テストを作成します。それらを広範囲かつ徹底してください。これらを配置したら、バージョンを分岐してリファクタリングを開始します。単体テストは、ジェネリックを正しくリファクタリングするのに役立ちます。

2 が「はい」の場合は、分岐して単体テストに依存してリファクタリングを開始します。

QA 部門も、テストする新しいコードを提供できるため、非常に役立ちます。

最後に、クライアント/ユーザーがバグの修正を必要としている場合は、最初にバグを修正してください。

他のヒント

やめてください。コードベースをこの演習に適用するためのビジネス上の正当な理由がある場合を除きます。リファクタリングによって得られるコスト削減または収益はどれくらいですか?私があなたのマネージャーだったら、おそらくそれはやめるようアドバイスするでしょう。ごめん。

CollectionBase は継承クラスからどの程度公開されますか?
Generics が CollectionBase よりも優れた機能を備えていることはありますか?

このクラスは頻繁に使用されますが、それは 1 つのクラスにすぎません。リファクタリングの鍵は、プログラムの現状を乱さないことです。クラスは常に外部世界との契約を維持する必要があります。これができれば、リファクタリングしているコードは 25 万行ではなく、おそらく 2500 行だけです (ランダムな推測です。このクラスがどのくらいの大きさなのかはわかりません)。

ただし、このクラスからのエクスポージャが多量にある場合は、そのエクスポージャを契約として扱い、エクスポージャを除外する必要がある場合があります。

もし、あんたが それをやり遂げるつもりです、使用しないでください リスト< T >. 。代わりに、使用してください System.Collections.ObjectModel。コレクション< T >, これは、CollectionBase の精神的な後継者です。

Collection<T> クラスは、項目の追加と削除、コレクションのクリア、または既存の項目の値の設定時の動作をカスタマイズするために使用できる保護されたメソッドを提供します。使用する場合 List<T> をオーバーライドする方法はありません Add() 誰かがコレクションに広告を掲載したときに処理するメソッド。

コードをリファクタリングして最新の状態に保つことは、コードの腐敗や臭いを避けるために非常に重要なプロセスだと思います。多くの開発者は、自分のコードに慣れ親しんでいるか、単体テストに十分な自信がないため、分解してクリーンアップして適切に実行することができません。

時間をかけてコードをクリーンアップし、コードを改善しないと、そのコードを今後何年も保守しなければならないため、長期的には後悔することになります。そうしないと、コードを引き継ぐ人に嫌われることになります。単体テストがあり、コードをリファクタリングしても引き続き機能することを確認するためにそれらのテストを信頼できる必要があると述べました。

だから私は、それをしなさい、それをきれいにして、それを美しくしてくださいと言います。単体テストがリファクタリングを処理できるかどうか自信がない場合は、さらにいくつか書いてください。

私もトーマスの意見に同意します。

「これをやることで何をすることで何を得るか、私の時間で何か他のことをすることで何が得られるのか」というのは、あなたがいつも自分自身に尋ねるべき質問を感じています。答えは、保守性の向上からパフォーマンスの向上まで、多くのものになる可能性がありますが、他の何かを犠牲にして常に来るでしょう。

コードを見ないと判断するのは難しいですが、これはリファクタリングするには非常に悪い状況のように思えます。テストは優れていますが、確実ではありません。必要なのは、そのうちの 1 つが間違った仮定を持っているだけで、リファクタリングによって厄介なバグが発生する可能性があります。そして、それをキャッチする QA がなければ、それは良いことではありません。

私も個人的には、このような大規模なリファクタリングには少し苦手です。一度仕事をもらった。それは私にとって政府外での最初の仕事でした (政府の外では少し寛容な傾向があり、一度「テニュア」を取得すると解雇するのは非常に困難です)、そして私は唯一の Web プログラマーでした。記述が不十分な従来の ASP アプリを膝の上に落としてしまいました。私の最優先事項は、このひどいものをもっと不快なものにリファクタリングすることでした。私の雇用主は火を消すことだけを望んでいた。6 か月後、私は再び仕事を探していました :p この話の教訓:これに着手する前に、まずマネージャーに確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top