手机版

PHP三层结构(下图)PHP实现了AOP Page 1/2

时间:2021-11-24 来源:互联网 编辑:宝哥软件园 浏览:

源代码下载地址:http://xiazai.jb51.net/201007/yuanma/TraceLWord.rar开发环境是eclipse(pdt)。让我们关注中间服务层。中间服务层代码相对简单,只是调用数据访问层代码将消息保存到数据库。如代码1所示,复制的代码如下: //代码1 //中间服务层Class Lwordservicecore实现ilwordservice {//添加消息公共函数append($ new word){//调用数据访问层$ dbTask=new lwordsdbtask();$ DBTask-append($ NewWord);} };看到留言板上的演示后,公司的产品部和市场部可能会提出各种想法和要求。比如他们想在添加消息之前判断用户的权限!只有注册用户才能留言!我们需要修改代码,如代码2所示:复制代码如下: //代码2,添加登录认证//中间服务层类lwordservice core实现ilwordservice {//添加消息公共函数append($ new word){ if(!($userLogin)) {//提示用户登录}//调用数据访问层$ dbTask=new lwordptask();$ DBTask-append($ NewWord);} };市场部也希望在添加之前检查一下消息的内容,如果消息中含有脏话,就不会保存。我们继续修改代码,如代码3所示:复制代码如下: //代码3,添加骂骂咧咧过滤器//中间服务层类lwordservice core实现ilwordservice {//添加消息公共函数append($ new word){ if(!($userLogin)) {//提示用户登录}如果(str($ new word,' sb '){//包含脏话,提示消息发送失败}//调用数据访问层$ dbTask=new lwordptask();$ DBTask-append($ NewWord);} };产品部门也提出了新的需求,他们想加入整合机制。具体来说,用户在每一条成功的消息后会得到5分。我们继续修改代码,如代码4所示:复制代码如下: //代码4,加入消息集成机制//中间服务层类lwordservice core实现ilwordservice {//添加消息公共函数append($ new word){ if(!($userLogin)) {//提示用户登录}如果(str($ new word,' sb '){//包含脏话,提示消息发送失败}//调用数据访问层$ dbTask=new lwordptask();$ DBTask-append($ NewWord);//给用户额外加分$ score=getuser score($ userName);$ score=$ score 5;saveUserScore($userName,$ score);} };产品部没多久就细化了需求,希望用户每次积1000分就升级。我们继续修改代码,如代码5所示:复制代码如下: //代码5,加入用户升级规则//中间服务层类lwordservice core实现ilwordservice {//添加消息公共函数append($ new word){ if(!($userLogin)) {//提示用户登录}如果(str ($ newlword,'找死'){//包含脏话,提示消息发送失败}//调用数据访问层$ DBtask=new lWORDDBtask();$ DBTask-append($ NewWord);//给用户额外加分$ score=getuser score($ userName);$ score=$ score 5;saveUserScore($userName,$ score);//升级用户if($ score % 1000)==0){ $ level=getuser level($ username);$ level=$ level 1;saveUserLevel($userName,$ level);} } };随着需求的不断增加,我们需要不断修改中间服务层代码。但是,您应该不难发现,需求越多,中间服务层代码就越多。最后,即使我们采用三层结构的开发模式,也不会有效降低项目的难度!此外,在根据需求变化修改中间服务代码后,需要重新测试所有代码,而不是对新添加的代码进行有效测试.事实上,让我们仔细分析一下这个留言板代码,我将首先提出一个主要业务逻辑和次要业务逻辑的概念。无论如何,将消息内容存储在数据库中是业务逻辑的支柱!这是主要的业务逻辑!这部分没有随着需求的增加而修改。

至于存储到数据库之前的权限检查和内容检查,存储到数据库之后,需要给用户额外加分,然后升级。这些都是预订单工作和收尾工作,都是子业务逻辑!主要业务逻辑几乎不变,但次要业务逻辑变化非常频繁。为了提高代码的可读性和可维护性,我们可以考虑将这些子业务逻辑放在别处,尽量不让它们干扰主业务逻辑。主要的业务逻辑应该集中在它应该做什么上。至于别的,主要的业务逻辑会忽略它!那么我们的代码可以这样写,如代码6所示:复制代码如下: //代码6,将主业务逻辑和次业务逻辑分开//中间服务层类lwordservice core实现ilwordservice {//添加消息公共函数append($ new word){//在添加消息之前($ new word);//调用数据访问层$ dbTask=new lwordptask();$ DBTask-append($ NewWord);//添加消息,然后behindAppend($ newword);} };我们可以将权限判断代码和消息内容文本过滤代码插入beforeAppend函数,将用户积分代码插入behindAppend函数,从而将二级业务逻辑从主业务逻辑代码中清除。主业务逻辑知道beforeAppend有一个“prelude”函数,behindAppend有一个“end”函数,但是主业务逻辑不知道也不需要知道prelude和end函数都做了什么!当然实际的编码工作并没有那么简单,我们还要考虑到产品部门和市场部门的需求有更多的变化,所以最好实现一个插件的方法来应对这种变化,但是仅仅依靠beforeAppend和behindAppend两个功能是无法达到这个目的的~如果要实现插件的方法,可以建立一个接口!使用接口的好处是定义和实现可以被隔离,另一个好处是实现是多态的。我们设置了一个消息扩展接口ILWordExtension,它有两个功能:beforeAppend和behindAppend。授权、内容检查、加分等功能可以看作实现ILWordExtension接口的三个实现类,主业务逻辑依次遍历这三个实现类,完成二级业务逻辑。如图1所示,CheckPowerExtension扩展类用于验证用户权限,CheckContentExtension扩展类用于检查消息内容,AddScoreExtension扩展类用于添加点和升级用户。示意图代码如代码7所示:

(图1),加入扩展接口复制代码代码如下: //代码7,加入扩展接口//扩展接口接口ILWordExtension { //添加留言前公共函数在追加($ new word)之前;//添加留言后公共函数behindAppend($ new word);};//检查权限类CheckPowerExtension实现了ILWordExtension { //添加留言前公共函数追加($ newword){//在这里判断用户权限} //添加留言后公共函数behindAppend($ new word){ } };//检查留言文本类CheckContentExtension实现了ILWordExtension { //添加留言前追加($ new word)前的公共函数{ if(stristr($ new word,' SB '){ throw new Exception();} } //添加留言后公共函数behindAppend($ new word){ } };//用户积分类别添加分数扩展实作ILWordExtension { //添加留言前追加之前的公共函数($ newword){ }//添加留言后公共函数behindAppend($ NEw word){//在这里给用户积分} };//中间服务层类LWordServiceCore实现了ILWordService { //添加留言公共函数追加($ NEw WOrd){//添加留言前$ this-before append($ new word);//调用数据访问层$ DBTasK=new LwordDBTasK();$ DBTask-append($ NewWord);//添加留言后$ this-behindAppend($ new word);} //添加留言前私有函数追加($ newword){//获取扩展数组$ Extraray=$ this-GetExtraray();foreach($ Extraray as $ ext){//遍历每一个扩展,并调用其beforeAppend函数$ ext-before append($ new word);} } //添加留言后私有函数behindAppend($ newword){//获取扩展数组$ Extraray=$ this-GetExtraray();foreach($ Extraray as $ ext){//遍历每一个扩展,并调用其后面出现函数$ ext-behindAppend($ NEw word);} } //获取扩展数组, //该函数的返回值实际上是延伸接口数组私有函数getExtArray(){ 0返回数组(//检查权限新建CheckPowerExtension(),//检查内容new CheckContentExtension(),//加分new AddScoreExtension(),);} };如果还有新需求,我们只要再添加延伸实现类并且把它注册到获取数组函数里即可。程序从此有了条理,并且算是具备了可扩展性。 12下一页阅读全文

版权声明:PHP三层结构(下图)PHP实现了AOP Page 1/2是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。