background image

}
  

/**

 

* 向用户发送一封邮件

 

*/

function

 sendEmail( 

$userid

$title

$content

 ) {

    

//检查用户是否存在

    

if

( !checkUserExists( 

$userid

 ) ) {

        

return

 false;

    }
  
    

//发送邮件操作

    

//略...

    

return

 true;

}
  

/**

 

* 检查某个用户是否存在

 

*/

function

 checkUserExists( 

$userid

 ) {

    

$user

 = getUserInfo( 

$userid

 );

    

return

 !

empty

$user

 );

}
  

/**

 

* 获取某个用户的数据

 

*/

function

 getUserInfo( 

$userid

 ) {

    

//假设我有一个 query 的函数,它用来查询数据库并返回数据

    

$user

 = query( "SELECT * FROM `user` WHERE `uid`=" . 

intval

(

$userid

 ) );

    

return

 

is_array

$user

 ) ? 

$user

 : 

array

() ;

}
</span>

  现在问题是,这三个函数都同时使用

checkUserExists 这个函数来检查用户不存在,数

据库查询了三次,这样带来了一些额外的开销。

如果要去掉三者之间任意一个

checkUserExists,看上去是可能的。但是如果之后有某些

功能要调用

resetPassword 或者 sendEmail,用户不存在时,系统可能会发生错误。

还有一个解决方法是,将

resetPassword 的逻辑写到 requestResetPassword 里,再过一

点,把

sendEmail 的逻辑也写进去。这样函数调用减少,数据库查询也变成一次了,性

能得到了提高。但是重置密码和发送邮件的功能将不能得到复用,并且违背了单一责