单一职责原则(Single Responsibility Principle)
flyfish
动机
在此背景中,一个职责是考虑因一个原因而改变,如果一个类,改变它有两个原因。我们应该根据功能性分成两个类。每
个类处理一个职责
在未来当我们需要做出某种改变时,只需要修改该类就可以了。当我们去改变一个具有多个职责的类时,这个变动可能会
影响该类的相关职责的其他功能
单一职责是简单直观的原则,但是在实践中有时很难做到
目的
一个类要变更只有一个原因
示例 该示例更改为C++编写
让我们假设我们需要一个对象来保存电子邮件消息。我们将在下面示例中的使用IEmail接口。
乍一看,一切都很好。更仔细地看,我们可以看到IEmail接口和Email类有两个职责(改变的理由)。
一个是在一些电子邮件协议pop3或imap中使用这个类。如果其他的协议支持对象序列化,那么就要添加新的代码以支持新
的协议。
即使邮件内容是string类型在未来我们也希望支持HTML或者其他格式
// single responsibility principle - bad example
class IEmail
{
public:
virtual void setSender(string sender);
virtual void setReceiver(string receiver);
virtual void setContent(string content);
};
class Email :public IEmail
{
public:
void setSender(string sender) {}// set sender;
void setReceiver(string receiver) {}// set receiver;
void setContent(string content) {}// set content;
};
//改进结果
// single responsibility principle - good example
class IEmail
{
public:
virtual void setSender(string sender);
virtual void setReceiver(string receiver);
virtual void setContent(string content);
};
class IContent
{
};
class ContentA :public IContent //
{
public:
string getAsString(); // used for serialization
};
class ContentB :public IContent //
{
public:
string getAsString(); // other format like html
};
class Email :public IEmail
{
public:
void setSender(string sender) {}// set sender;
void setReceiver(string receiver) {}// set receiver;
void setContent(IContent content) {}// set content;
};