1

私は元々2つの異なる種類のファイルを処理するために設計された古いコードで作業しています。私は最近、このコードに新しい種類のファイルを追加するという任務を負いました。私の問題のほとんどは、リストの名前から複数形の小文字でのファイルの記述方法まで、すべてを処理する新しいエントリを含む広範なXMLファイルに入力することで解決されました。しかし、24の異なるコードファイルに50の異なる場所があり、元の2つのファイルタイプに対してのみ分岐するハードコードされたswitchステートメントを更新する必要があったため、これでは不十分でした。

残念ながら、これには一貫性がありません。XMLファイルから半分、ハードコードから半分を操作するメソッドがあります。XMLファイルから動作するように見えるファイルの中には、そうでないものもあれば、ハードコードを更新する必要があると私が予想するものもありますが、それは必要ありません。したがって、これらの大部分を見つける唯一の方法は、システムの一部のみが動作しているときにシステム全体をテストし、修正する1つのステップを見つけることです(幸運なことに、エラーログが実際に何が起こっているかを教えてくれます)。その後、すべてを再度実行します。これは、すでに機能することが確認されているコードの部分のテストに時間を浪費し、その上に追加する必要のある新しい部分のテストに費やす時間を無駄にします。

面倒な作業ですが、運が良ければ、近い将来、さらに別の新しい種類のファイルを追加する必要があると予想できます。

この種の取り組みを支援できる解決策はありますか?現在の機能のいくつかのパラメーターを入力し、コードプロジェクト全体のどのポイントを実際に更新する必要があるかを文書化し、次に新しい機能をコードに追加する必要があるときに何かを実行できるもの。完全に自動化する必要はありません。これは、すべての特定のポイントに直接移動したり、ロードする必要のあるパラメーターの種類を記録したりするのに役立ちます。

特に重要なことは間違いありませんが、コードはASP.NETページ、一部のASP.NETコントロール、数百のC#コードファイル、および少数の追加のXMLファイルで構成されています。現在、すべてがいくつかの大きなVisualStudio2008プロジェクトに含まれています。

4

2 に答える 2

0

あなたが説明していることは正確ではありませんが、コードに継ぎ目を導入し、ブレイクアウトしてモックできるいくつかのインターフェイスを配置できる場合、ユニット/統合テストのスイートは、古いコードを変更するのに大いに役立ちます。よくわかります。

于 2010-06-04T18:49:04.807 に答える
0

Michael Feathers の本を使用して、新しいテストをレガシー コードに組み込む方法を学習するというコメントに完全に同意します。また、Martin Fowler による Refactoring も強くお勧めします。コードに対して行う必要があるように思われるのは、「条件をポリモーフィズムに置き換える」リファクタリングを実装することです。

今日のコードは次のようになっていると思います。

if (filetype == 23)
{
  type23parser.parse(file);
}
else if (filetype == 69)
{
  filestore = type69reader.read(file);
  File newfile = convertFSto23(filestore);
  type23parser.parse(newfile);
}

あなたがしたいことは、すべての「if (type == foo)」の種類のロジックを、ファクトリで作成される戦略パターンに抽象化することです。

class FileRules : pReader(NULL), pParser(NULL)
{
private:
  FileReaderRules *pReader;
  FileParserRules *pParser;
public:
  void read(File* inFile) {pReader->read(inFile);};
  void parse(File* inFile) {pParser->parse(inFile);};
};

class FileRulesFactory
{
  FileRules* GetRules(int inputFiletype, int parserType)
  {
    switch (inputFiletype)
    {
    case 23: 
      pReader = new ASCIIReader;
      break;
    case 69:
      pReader = new EBCDICReader;
      break;
    }
    switch (parserType)
    ... etc...

コードのメイン行は次のようになります。

  FileRules* rules = FileRulesFactory.GetRules(filetype, parsertype);
  rules.read(file);
  rules.parse(file);

このリファクタリングを実行すると、ファイル タイプ、パーサー、リーダーなどの新しいセットを追加することが、新しいタイプ専用のものを作成するのと同じくらい簡単になります。

もちろん、本を読んでください。ここでは非常に単純化しすぎており、おそらく間違っているかもしれませんが、これからアプローチする方法の一般的なアイデアを得る必要があります. 別の本、「Head First Design Patterns」もお勧めします。この本には Factory パターンに関する優れたセクションがあります (「Head First」の種類の本が好きな場合)。

于 2010-06-05T06:43:32.740 に答える