C/C++文法で六大設計原則を浅く語る(二)--開閉原則(Open Closed Principle)

3390 ワード

0.前に書く
普段のソフトウェア开発の过程の中で、プロジェクトの需要の変动、コードの修正はすべてとても普遍的で、もし私达がひたすら需要によって绝えず私达のコードのロジックを修正するならば、これは私达の开発にとって、私达の仕事量を増加しただけではなくて、その上私达のソフト制品の安定性に対する影响もとても大きいです.そのため、私たちはどのようにして仕事の中で出会ったこれらの問題を効率的に解決することができますか.今日の本編では、設計原則の開閉原則をいくつかのシーンで詳しく説明します.
1.基本的な概要
開閉原則とは,拡張に対して開放的であり,変更に対して閉鎖的である.新しいお客様のニーズに直面して、プログラムの変更は新しいコードを追加することによって完成し、既存のコードの変更を避ける.
2.具体例
シーン1では、3つの数の最大数と最小数がどれくらいあるかを知るクラスを書く必要があります.このように設計することができます.
enum TYPE{MAX,MIN};
class Calculate
{
public:
	Calculate(int x,int y,int z)
	:m_a(x),m_b(y),m_c(z),m_max(0),m_min(0)
	{
		 m_max = (m_a > m_b?m_a:m_b) > m_c?(m_a > m_b?m_a:m_b):m_c;
		 m_min = (m_a > m_b?m_a:m_b) > m_c?(m_a > m_b?m_a:m_b):m_c;
	}
	~Calculate(){}

public:
	const int GetNum(const TYPE type)
	{
		switch(type)
		{
		case MAX:
			{
			   return m_max;
			}break;
		case MIN:
			{
			   return m_min;
			}break;
		default:break;
		}
	}
private:
	int m_a;
	int m_b;
	int m_c;
	int m_max;
	int m_min;
};

シーン2次に、この3つの数の最大値と最小値と最大値と最小値の差を求める必要があります.元のコードでこのように変更できます.
enum TYPE{MAX,MIN,SUM,SUB};
class Calculate
{
public:
	Calculate(int x,int y,int z)
	:m_a(x),m_b(y),m_c(z),m_max(0),m_min(0)
	{
		 m_max = (m_a > m_b?m_a:m_b) > m_c?(m_a > m_b?m_a:m_b):m_c;
		 m_min = (m_a < m_b?m_a:m_b)  <  m_c?(m_a < m_b?m_a:m_b):m_c;
	}
	~Calculate(){}

public:
	const int GetNum(const TYPE type)
	{
		switch(type)
		{
		//   
		case MAX:
			{
			   return m_max;
			}break;
		//   
		case MIN:
			{
			   return m_min;
			}break;
		//         
		case SUM:
			{
				return m_max + m_min;
			}break;
		//         
		case SUB:
			{
				return m_max - m_min;
			}break;
		default:break;
		}
	}
private:
	int m_a;
	int m_b;
	int m_c;
	int m_max;
	int m_min;
};

シーン3次に、中間数、3つの数の和、最大数と中間値の二乗を要求するなど、元のコードを変更することで実現すれば、明らかに開閉の原則に反し、クラスを変更します.
class ICalculatorBase
{
public:
	ICalculatorBase(int x,int y,int z)
		:m_a(x),m_b(y),m_c(z),m_max(0),m_min(0)
	{
		m_max = (m_a > m_b?m_a:m_b) > m_c?(m_a > m_b?m_a:m_b):m_c;
		m_min = (m_a < m_b?m_a:m_b) < m_c?(m_a < m_b?m_a:m_b):m_c;
	}
	virtual ~ICalculatorBase(){}

public:
	virtual const int GetNum()
	{
		return 0;
	}
public:
	int m_a;
	int m_b;
	int m_c;
	int m_max;
	int m_min;

};

//   
class Max : public ICalculatorBase
{
public:
	Max(int x,int y,int z)
		:ICalculatorBase(x,y,z){}
	~Max(){}
public:
	virtual const int GetNum()
	{
		return m_max;
	}
};

//   
class Min : public ICalculatorBase
{
public:
	Min(int x,int y,int z)
		:ICalculatorBase(x,y,z){}
	~Min(){}
public:
	virtual const int GetNum()
	{
		return m_min;
	}
};

//         
class Sum : public ICalculatorBase
{
public:
	Sum(int x,int y,int z)
	:ICalculatorBase(x,y,z){}
	~Sum(){}
public:
	virtual const int GetNum()
	{
		return m_max + m_min;
	}
};

//         
class Mub : public ICalculatorBase
{
public:
	Mub(int x,int y,int z)
		:ICalculatorBase(x,y,z){}
	~Mub(){}
public:
	virtual const int GetNum()
	{
		return m_max - m_min;
	}
};

//……

私たちが需要を増やしたら、私たちは直接私たちのベースクラスを継承して新しい需要に属するクラスを書き直せばいいです.私たちの元のコードを修正する必要はありません.開閉の原則を守ります.
【前編:】C/C++文法で六大設計原則を浅く語る(一)——依存逆置き原則(Dependence Inversion Principle)https://blog.csdn.net/weixin_39951988/article/details/85704400【次編:】C/C++文法で六大設計原則を浅く語る(三)——単一職責原則(Single Responsibility Principle)https://blog.csdn.net/weixin_39951988/article/details/86491097