私は最近 (数か月前) 転職し、SOLID 原則のすべてに違反するコードベースを可能な限り何度でも継承しました。このコードを書いた人々は、すべての優れたコーディング プラクティスを詳細に研究し、可能な限り頻繁に、そして最も根本的に違反することを決定したようです。
私はこの製品の唯一の開発者です。組織にはコードを知っている人は誰もいません。コードベースは大きすぎて複雑すぎて完全に書き直すことはできません。コードベースを柔軟かつ堅牢にするために行うことができる最も価値の高い変更を検討しています。この製品を放棄することも選択肢ではありません。
製品のすべての問題の根源は、ビジネス ロジックのデータ構造のコアであるクラスのグループにあります。これらのクラスには多くの問題がありますが、私が本当に興味を持っているのは次のことです。
public static class NetCollection
{
private static Logger LogFile { get { return Logger.GetMethodLogger(2); } }
// Declare local variables.
private static Dictionary<string, NetObject> netObjectHashTable;
private static Dictionary<string, NetTitle> titlePropertyHashTable;
private static Dictionary<string, NetObject> referenceDataHashTable;
private static Dictionary<int, SortedDictionary<string, int>> picklistHashTable;
public static IEnumerable<NetObject> NetObjects
{
get
{
return netObjectHashTable.Values;
}
}
static NetCollection()
{
netObjectHashTable = new Dictionary<string, NetObject>();
titlePropertyHashTable = new Dictionary<string, NetTitle>();
referenceDataHashTable = new Dictionary<string, NetObject>();
picklistHashTable = new Dictionary<int, SortedDictionary<string, int>>();
}
public static void AddNetObject(NetObject newObject)
{
if (newObject == null)
return;
if (newObject.TitleType == "Reference Data")
{
// Check if hash table contains key
if (!referenceDataHashTable.ContainsKey(newObject.ID.ToString()))
{
referenceDataHashTable.Add(newObject.ID.ToString(), newObject);
}
}
else
{
// Check if hash table contains key
if (!netObjectHashTable.ContainsKey(newObject.ID.ToString()))
{
netObjectHashTable.Add(newObject.ID.ToString(), newObject);
}
}
}
}
簡潔にするために、このクラスからかなりの数の他のメソッドを抜粋しました。
ご覧のとおり、このクラスには膨大な数の問題があります (静的クラスに状態を保存するのはコードの匂いがします。このクラスを中心にアプリケーション全体を作成するのは、まったくおかしなことです)。
私の現在の意図は、このクラスを適切なシングルトン クラスに (最終的には通常のクラスに) リファクタリングして、ユーザーが複数のドキュメントを同時に開くことができるようにすることです。
これを行う必要がありますか?
この変更を行う際の最大のリスクは何ですか? この変更を行うリスクを軽減するために講じることができるアプローチはありますか?