Design patterns
固体
サーチ…
前書き
固体とは何ですか?
SOLIDはニーモニック(記憶補助)頭字語です。ソリッドの原則は、ソフトウェア開発者が「コードの匂い」を避け、良いソースコードにつながるはずです。良いソースコードとは、ソースコードを拡張して維持することが容易であることを意味します。ソリッド原則の主な焦点はクラスです
何を期待します:
なぜSOLIDを適用すべきか
5つのSOLID原則の適用方法(例)
SRP - 単一の責任原則
SOLIDのSは、Single responsibility principle(SRP)の略です。
責任というのは、この文脈では変化する理由を意味します。そのため、原則では、クラスには変更すべき理由が1つだけある必要があります。
ロバート・C・マーティンは次のように述べている(2014年9月10日、経営陣のYale教授の講演中)
あなたは、同じクラスのさまざまな理由で変化する関数を入れないでください。
または
あなたのクラスに懸念を混ぜないでください
SRPを適用する理由:
クラスを変更すると、クラスの他の責任に関連する機能に影響を与える可能性があります。責任を低く保つことは、副作用のリスクを最小限に抑えます。
悪い例
私たちにはIWalletインターフェースと、IWalletを実装するWalletクラスがあります。ウォレットは私たちのお金とブランドを保有しており、さらに私たちのお金を文字列表現として印刷するべきです。このクラスは、
- ウェブサービス
- ユーロでお金をテキストファイルに印刷するテキストライター。
2つの懸念があるため、SRPはここに違反しています:
- お金とブランドの保管
- お金の表象
C#のサンプルコード
public interface IWallet
{
void setBrand(string brand);
string getBrand();
void setMoney(decimal money);
decimal getMoney();
string printMoney();
}
public class Wallet : IWallet
{
private decimal m_Money;
private string m_Brand;
public string getBrand()
{
return m_Brand;
}
public decimal getMoney()
{
return m_Money;
}
public void setBrand(string brand)
{
m_Brand = brand;
}
public void setMoney(decimal money)
{
m_Money = money;
}
public string printMoney()
{
return m_Money.ToString();
}
}
良い例え
SRPの違反を回避するため、 printMoney
メソッドをWalletクラスから削除し、それをPrinterクラスに配置しました。 Printerクラスが印刷を担当するようになり、Walletが値の格納を担当するようになりました。
C#のサンプルコード
public interface IPrinter
{
void printMoney(decimal money);
}
public class EuroPrinter : IPrinter
{
public void printMoney(decimal money)
{
//print euro
}
}
public class DollarPrinter : IPrinter
{
public void printMoney(decimal money)
{
//print Dollar
}
}
public interface IWallet
{
void setBrand(string brand);
string getBrand();
void setMoney(decimal money);
decimal getMoney();
}
public class Wallet : IWallet
{
private decimal m_Money;
private string m_Brand;
public string getBrand()
{
return m_Brand;
}
public decimal getMoney()
{
return m_Money;
}
public void setBrand(string brand)
{
m_Brand = brand;
}
public void setMoney(decimal money)
{
m_Money = money;
}
}