お久しぶりです。せしまるです。
今回はSOLOD原則の一つ、「オープン・クローズドの原則」について書いていきます。
いつも通り備忘録的な・・
オープン・クローズドの原則 is 何
クラスやモジュールなどは、拡張の為に開いていて、修正の為に閉じていなければならない、ということ
「拡張しやすいけど、修正箇所は少ない」という感じにクラス設計するのかな、と考えてます
ソースコードを交えて説明。
ケーキを作るメソッドとケーキクラスがあるとします。
public class Cake
{
public void CreateCheeseCake()
{
}
public void CreateChocolateCake()
{
}
}
public void Order(string orderName)
{
var cake = new Cake();
if( orderName == "チーズケーキ" )
{
cake.CreateCheeseCake();
}
else
{
cake.CreateChocolateCake();
}
}
今はチーズケーキとチョコレートケーキが作れますが、作りたいケーキの種類が増えた場合を考えてみましょう。
使用箇所側ではロールケーキ用の分岐が必要になりますね、else ifを増やすか、switch文に変更するか…
どちらの場合でも、クラス側・使用箇所のどちらにも変更が入ってしまいます(修正に対して閉じられてない)
では、修正に対して閉じるために、インターフェースを使用してみます。
public interface CakeInterface
{
public void Create();
}
public class CheeseCake : CakeInterface
{
public void Create()
{
// チーズケーキ
}
}
public class ChocolateCake : CakeInterface
{
public void Create()
{
// チョコレートケーキ
}
}
public class RollCake : CakeInterface
{
public void Create()
{
// ロールケーキ
}
}
public void Order(CakeInterface cake)
{
cake.Create();
}
このようにすれば、ケーキの種類が増えても、CakeInterfaceを実装したクラスを増やすだけで良くなります。
各ケーキに修正があったとしても、各クラスの修正をすればよいので、修正に閉じられてると言えますね!
以上!