當一個類別可以做很多事情時 我們會稱他為God class
通常這種類別的重覆使用性很低 因為他會跟很多其他的類別耦合 很難重覆使用
class GodClass
{
private bool IsTurnOnTV = false;
private bool IsTurnOnRadio = false;
private bool IsTurnOnLight = false;
public void TurnOnTV()
{
IsTurnOnTV = true;
Console.WriteLine("TurnOnTV");
}
public void TurnOffTV()
{
IsTurnOnTV = false;
Console.WriteLine("TurnOffTV");
}
public void TurnOnRadio()
{
IsTurnOnRadio = true;
Console.WriteLine("TurnOnRadio");
}
public void TurnOffRadio()
{
IsTurnOnRadio = false;
Console.WriteLine("TurnOffRadio");
}
public void TurnOnLight()
{
IsTurnOnLight = true; ;
Console.WriteLine("TurnOnLight");
}
public void TurnOffLight()
{
IsTurnOnLight = false;
Console.WriteLine("TurnOffLight");
}
public void Execute(string command)
{
switch (command)
{
case "TV":
if (IsTurnOnTV)
TurnOffTV();
else
TurnOnTV();
break;
case "Light":
if(IsTurnOnLight)
TurnOffLight();
else
TurnOnLight();
break;
case "Radio":
if (IsTurnOnRadio)
TurnOffRadio();
else
TurnOnRadio();
break;
default:
throw new Exception();
}
}
}
class Program
{
static void Main(string[] args)
{
GodClass godclass = new GodClass();
godclass.Execute("Light");
godclass.Execute("Light");
Console.ReadKey();
}
}
上面是一個 god 類別的例子 他可以做 TV的開關 Light的開關 以及 Radio的開關
簡單的說就是甚麼都可以做 這樣寫好像不錯 所有控制的項目都整理在一個類別裡
但是 當有新的功能要要加入時 就得對execute的程式做修改 這樣就違反了OpenClosePrinciple
然後當新的需求不斷進來 最後 這個類別就會變成一個龐大而且充滿flag的類別
這樣的程式是非常難以維護的
但是 我們可以用下面的方式來做修改
abstract class Command
{
public abstract void Execute();
}
class LightCommand : Command
{
private bool IsTurnOnLight = false;
public void TurnOnLight()
{
IsTurnOnLight = true; ;
Console.WriteLine("TurnOnLight");
}
public void TurnOffLight()
{
IsTurnOnLight = false;
Console.WriteLine("TurnOffLight");
}
public override void Execute()
{
if (IsTurnOnLight)
TurnOffLight();
else
TurnOnLight();
}
}
class TVCommand : Command
{
private bool IsTurnOnTV = false;
public void TurnOnTV()
{
IsTurnOnTV = true;
Console.WriteLine("TurnOnTV");
}
public void TurnOffTV()
{
IsTurnOnTV = false;
Console.WriteLine("TurnOffTV");
}
public override void Execute()
{
if (IsTurnOnTV)
TurnOffTV();
else
TurnOnTV();
}
}
class RadioCommand : Command
{
private bool IsTurnOnRadio = false;
public void TurnOnRadio()
{
IsTurnOnRadio = true;
Console.WriteLine("TurnOnRadio");
}
public void TurnOffRadio()
{
IsTurnOnRadio = false;
Console.WriteLine("TurnOffRadio");
}
public override void Execute()
{
if (IsTurnOnRadio)
TurnOffRadio();
else
TurnOnRadio();
}
}
class Program
{
static void Main(string[] args)
{
Command LightCommand = new LightCommand();
LightCommand.Execute();
LightCommand.Execute();
Console.ReadKey();
}
}
基本上這兩段程式碼做的事情是一樣的但是上面這一段程式碼
當新的需求進來時 例如我想新增電腦開關
不論我在新的類別裡面修改或新增了多少東西
並不會影響到其他已經寫好的類別
對維護者來說 這樣的類別也是相對好維護的 flag少而且執行的功能明確
這就是把責任切開的好處
沒有留言:
張貼留言