1.函数的职责混乱。一个函数的不只是执行一项功能,还包含着其他功能的是实现,因此造成一个函数的代码过长。
在经济人项目中的接受委托的函数中,自己写着这样的一段代码:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{
// 更改委托状态,也就是将记录的状态更改为接受委托
代码省略 ............
// 对这一次更改做记录
代码省略..............
// 如果用户uid不为0则发送站内信, 生成邮件和站内信所需要的信息
string linkman = Helper.GetContactDetails(brokerageTable.Contactus1, ContactItem.LinkMan);
string email = Helper.GetContactDetails(brokerageTable.Contactus1, ContactItem.Email);
string title = BrokerageServicesLang.MsgOfAcceptTitle;
string content = BrokerageServicesLang.MsgOfAcceptContent;
if (brokerageTable.Uid1 != 0 )
{
Helper.GenerateMsg( ref title, brokerageTable.DomainName, ref content, new string [] { linkman, handler, id.ToString() });
CallPMInterface(brokerageTable.Uid1, title, content);
}
// 发送邮件
代码省略..............
}
}
显然这里没有注释的部分可以独立出来,方到一个函数去,因此在其他经济交易的步骤中也是会发送站内信或者邮件的,这个函数可以专门用来生linkman,email,title,content,然后发送站内信,和邮件(代码段1),。在写这段代码的时候是有意识到这样写出来的代码是不好的,之所以没修改,是当初想到在经纪人操作后台的时候有些步骤需要发送站内信和邮件,有些步骤却只需要发送站内信,不需要发送邮件,但是有一点可以注意到,站内信和邮件的内容是一致的,邮件会自动加上邮件模板。
public void SendMsgEmail()
{
// 获取所需要的联系人
// 获取所需要的Title
// 获取所需要的content
// 获取所需要的email地址
// 发送站内信
// 发送邮件
}
由于有些步骤是不需要发送邮件的。因此上面的代码还要根据具体的步骤来判断是不是要发送邮件。这样这个函数不是担负的职责太多了,注意到不同的经济交易步骤发送的站内信和邮件的content是不同的,因此生成content的时候避免不了要进行swith判断,因此将content的生成独立到一个子函数,并且返回一个标识值是否要发送邮件。
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{}
这样就能在上面的代码段1修改如下。
public void SendMsgEmail()
{
// 获取所需要的LinkMan
// 获取所需要的Title
string content = string .Empty;
bool isSendEmail = false ;
GenerateContent( string step, ref content, ref isSendEmail);
// 发送站内信
if (isSendEmail)
{
// 获取所需要的email地址
// 发送邮件
}
}
其实这里的GenerateContent也是职责不一的,不只是获取相应step下的content,也判断着该step是不是需要发送邮件,这样是不是职责不一?明天继续挖掘!