はじめに
ここ半年に関わったプロジェクトにおいて、プロジェクトを分けたときに意外なメリットが飛び出したので事例紹介。
プロジェクトの分割はクソコードを遠ざけるために有効、という話。
僕が遭遇した状況
次のコードは実際に私が遭遇した(クソ)コードの一部再現である。
実際にはもっと沢山のクラスがProgramクラス内で宣言されていた。
public class Program{
public static Program theProgram;
public Logger Logger = new Logger();
public Common Common = new Common();
public static void Main(){
theProgram = new Program();
theProgram.Logger.Write("Something");
}
}
public class Logger{
public void Write(string line){
// 実際のコードはさまざまなクラスがProgram.theProgramを経由して
// 他クラスへアクセスしていた。
using(var writer = new StreamWriter(Program.theProgram.Common.FileName)){
writer.WriteLine(line);
}
}
}
public class Common{
public string FileName;
public Common(){
// 何らかのファイルから設定を読み出す関数
FileName = ReadFromFile();
}
}
問題点
事実上のグローバル変数と化したtheProgramを媒体に、全クラスが全クラスに密結合をおこしてしまっている。
このコードが(なぜか)コードレビューをすり抜けて運用され、機能追加を重ねることにより大量の循環参照が発生し、手を出せないクラスとなっていた。
問題の予防
結局プロジェクトはあまりの負債の大きさのためビッグリライトが発生して、MVVMで開発する事になったが、
その時に過去のプロジェクトのコードの断片を再利用しているときに思いがけないことが起こった。
プロジェクト間の循環参照はシステムで禁止されていたのだ。
循環参照が禁止されることの利点
MVVMのアーキテクチャで各層ごとにプロジェクトを分けた時、次のような依存関係を強要することができる。
つまりシステムによって怪しい設計を防げるため、コーディングの際に考えることが減るのだ。
みんなもプロジェクトを単一責務に保ち、貧乏を爆殺しよう。
