0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

オープン・クローズドの原則 - Open/Closed principle -

Posted at

お久しぶりです。せしまるです。

今回はSOLOD原則の一つ、「オープン・クローズドの原則」について書いていきます。
いつも通り備忘録的な・・

オープン・クローズドの原則 is 何

クラスやモジュールなどは、拡張の為に開いていて、修正の為に閉じていなければならない、ということ

「拡張しやすいけど、修正箇所は少ない」という感じにクラス設計するのかな、と考えてます

ソースコードを交えて説明。

ケーキを作るメソッドとケーキクラスがあるとします。

Cake.cs
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文に変更するか…
どちらの場合でも、クラス側・使用箇所のどちらにも変更が入ってしまいます(修正に対して閉じられてない)

では、修正に対して閉じるために、インターフェースを使用してみます。

Interface.cs
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を実装したクラスを増やすだけで良くなります。
各ケーキに修正があったとしても、各クラスの修正をすればよいので、修正に閉じられてると言えますね!

以上!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?