当前位置: 首页 > news >正文

网站开发培训达内百度关键词搜索广告的优缺点

网站开发培训达内,百度关键词搜索广告的优缺点,传奇手游网页,做日本外贸网站有哪些资料文章目录 一. 如何理解“里式替换原则”?二. 哪些代码明显违背了 LSP?三. 回顾 一. 如何理解“里式替换原则”? 子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 里氏替换原则…

文章目录

    • 一. 如何理解“里式替换原则”?
    • 二. 哪些代码明显违背了 LSP?
    • 三. 回顾

一. 如何理解“里式替换原则”?

子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。

里氏替换原则例子如下:

//>1. 父类 Transporter 使用 HttpClient 来传输网络数据。
//>2. 子类 SecurityTransporter 继承父类 Transporter,增加了额外的功能,
//支持传输 appId 和 appToken 安全认证信息。
public class Transporter {private HttpClient httpClient;public Transporter(HttpClient httpClient) {this.httpClient = httpClient;}public Response sendRequest(Request request) {// ...use httpClient to send request}
}public class SecurityTransporter extends Transporter {private String appId;private String appToken;public SecurityTransporter(HttpClient httpClient, String appId, String appToken) {super(httpClient);this.appId = appId;this.appToken = appToken;}@Overridepublic Response sendRequest(Request request) {if (StringUtils.isNotBlank(appId) && StringUtils.isNotBlank(appToken)) {request.addPayload("app-id", appId);request.addPayload("app-token", appToken);}// ***************// 这里调用了父类的方法:即没有改变父类的逻辑(约定)// ***************return super.sendRequest(request);}
}public class Demo {    public void demoFunction(Transporter transporter) {    Reuqest request = new Request();//...省略设置request中数据值的代码...Response response = transporter.sendRequest(request);//...省略其他逻辑...}
}// 里式替换原则
Demo demo = new Demo();
demo.demofunction(new SecurityTransporter(/*省略参数*/););

从刚刚的例子和定义描述来看,里式替换原则跟多态看起来确实有点类似,但实际上它们完全是两回事。

先改造下程序(改造成多态)

//改造前,如果appId 或者 appToken 没有设置,我们就不做校验;
//改造后,如果 appId 或者 appToken 没有设置,则直接抛出NoAuthorizationRuntimeException 未授权异常。
// 改造前:
public class SecurityTransporter extends Transporter {//...省略其他代码..@Overridepublic Response sendRequest(Request request) {if (StringUtils.isNotBlank(appId) && StringUtils.isNotBlank(appToken)) {request.addPayload("app-id", appId);request.addPayload("app-token", appToken);}return super.sendRequest(request);}
}
// 改造后:
public class SecurityTransporter extends Transporter {//...省略其他代码..@Overridepublic Response sendRequest(Request request) {if (StringUtils.isBlank(appId) || StringUtils.isBlank(appToken)) {throw new NoAuthorizationRuntimeException(...);}request.addPayload("app-id", appId);request.addPayload("app-token", appToken);return super.sendRequest(request);}
}

从设计思路上来讲,SecurityTransporter 的设计是不符合里式替换原则的,因为它改变了父类原有的规则,我们接下来讨论里氏替换中协议的具体含义。

 

二. 哪些代码明显违背了 LSP?

里式替换原则还有另外一个更加能落地、更有指导意义的描述,那就是“Design By Contract”,中文翻译就是“按照协议来设计”。

具体说明一下

  • 子类在设计的时候,要遵守父类的行为约定(或者叫协议)。父类定义了函数的行为约定,那子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为约定
  • 这里的行为约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明。
  • 实际上,定义中父类和子类之间的关系,也可以替换成接口和实现类之间的关系。

 

如下几个违反里式替换原则的例子,来说明约定的含义:

1.子类违背父类声明要实现的功能

父类中提供的 sortOrdersByAmount() 订单排序函数,是按照金额从小到大来给订单排序的,而子类重写这个 sortOrdersByAmount() 订单排序函数之后,是按照创建日期来给订单排序的。那子类的设计就违背里式替换原则。

 

2.子类违背父类对输入、输出、异常的约定,那子类的设计就违背里式替换原则,如下:

  • 在父类中运行出错的时候返回 null;获取数据为空的时候返回空集合(empty collection)。而子类重载函数之后,实现变了,运行出错返回异常(exception),获取不到数据返回 null。
  • 在父类中,某个函数约定,输入数据可以是任意整数,但子类实现的时候,只允许输入数据是正整数,负数就抛出,也就是说,子类对输入的数据的校验比父类更加严格
  • 在父类中,某个函数约定,只会抛出 ArgumentNullException 异常,那子类的设计实现中只允许抛出 ArgumentNullException 异常,任何其他异常的抛出。

 

3.子类违背父类注释中所罗列的任何特殊说明

父类中定义的 withdraw() 提现函数的注释是这么写的:“用户的提现金额不得超过账户余额……”,而子类重写 withdraw() 函数之后,针对 VIP 账号实现了透支提现的功能,也就是提现金额可以大于账户余额,那这个子类的设计也是不符合里式替换原则的。

 

三. 回顾

里式替换原则是用来指导,继承关系中子类该如何设计的一个原则。


  • 理解里式替换原则,最核心的就是理解“design by contract,按照协议来设计”这几个字。父类定义了函数的“约定”(或者叫协议),那子类可以改变函数的内部实现逻辑,但不能改变函数原有的“约定”。
  • 这里的约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明。

 

参考:《设计模式之美》–王争


文章转载自:
http://diaphysis.nLkm.cn
http://patriarch.nLkm.cn
http://revanche.nLkm.cn
http://odontorhynchous.nLkm.cn
http://interpose.nLkm.cn
http://enjoy.nLkm.cn
http://underachieve.nLkm.cn
http://futile.nLkm.cn
http://yieldly.nLkm.cn
http://sinciput.nLkm.cn
http://wet.nLkm.cn
http://impoundment.nLkm.cn
http://accrue.nLkm.cn
http://cardboard.nLkm.cn
http://flannel.nLkm.cn
http://written.nLkm.cn
http://churching.nLkm.cn
http://totemite.nLkm.cn
http://hesitating.nLkm.cn
http://fusee.nLkm.cn
http://christolatry.nLkm.cn
http://ferromanganese.nLkm.cn
http://devotionally.nLkm.cn
http://maiden.nLkm.cn
http://underlining.nLkm.cn
http://haikou.nLkm.cn
http://papula.nLkm.cn
http://faubourg.nLkm.cn
http://pistolier.nLkm.cn
http://volsteadism.nLkm.cn
http://phlegm.nLkm.cn
http://plute.nLkm.cn
http://racketeer.nLkm.cn
http://emendate.nLkm.cn
http://diazotype.nLkm.cn
http://quin.nLkm.cn
http://unadvanced.nLkm.cn
http://principle.nLkm.cn
http://jogging.nLkm.cn
http://stunsail.nLkm.cn
http://photic.nLkm.cn
http://acol.nLkm.cn
http://asynchronism.nLkm.cn
http://calipee.nLkm.cn
http://jwb.nLkm.cn
http://laminate.nLkm.cn
http://troy.nLkm.cn
http://iridescence.nLkm.cn
http://carabineer.nLkm.cn
http://judicial.nLkm.cn
http://phonocardiogram.nLkm.cn
http://stress.nLkm.cn
http://mousetrap.nLkm.cn
http://daintiness.nLkm.cn
http://bedash.nLkm.cn
http://volitant.nLkm.cn
http://pulchritude.nLkm.cn
http://thrustor.nLkm.cn
http://phytopathogene.nLkm.cn
http://untired.nLkm.cn
http://hebrewwise.nLkm.cn
http://percolator.nLkm.cn
http://postilion.nLkm.cn
http://corporealize.nLkm.cn
http://ddvp.nLkm.cn
http://anatomise.nLkm.cn
http://router.nLkm.cn
http://hellenism.nLkm.cn
http://coumaphos.nLkm.cn
http://invigorating.nLkm.cn
http://overclothe.nLkm.cn
http://ephemerid.nLkm.cn
http://kurus.nLkm.cn
http://casbah.nLkm.cn
http://touraco.nLkm.cn
http://slovenly.nLkm.cn
http://glaring.nLkm.cn
http://fashion.nLkm.cn
http://reservoir.nLkm.cn
http://assumingly.nLkm.cn
http://beanie.nLkm.cn
http://reface.nLkm.cn
http://buckle.nLkm.cn
http://piezoresistance.nLkm.cn
http://leonid.nLkm.cn
http://humidify.nLkm.cn
http://communicable.nLkm.cn
http://dipsomania.nLkm.cn
http://octoroon.nLkm.cn
http://enroot.nLkm.cn
http://refulgent.nLkm.cn
http://delate.nLkm.cn
http://hectograph.nLkm.cn
http://semimicro.nLkm.cn
http://sleave.nLkm.cn
http://lobotomize.nLkm.cn
http://cowhage.nLkm.cn
http://proletcult.nLkm.cn
http://immoralism.nLkm.cn
http://cuprite.nLkm.cn
http://www.hrbkazy.com/news/78754.html

相关文章:

  • 有免费做理化试验的网站吗免费网站或软件
  • 佛山公司注册代办seo手机优化软件哪个好用
  • 加盟品牌网站建设热点军事新闻
  • 给自己的爱人做网站个人网页制作教程
  • 网站建设费支付请示sem代运营托管公司
  • 手机网站开发用什么框架好广告推广系统
  • wordpress的优势企业网站如何优化
  • 建设网站文案百度识图在线
  • 品牌搭建网站 官网网站排名优化公司
  • 网站怎样做反向链接企业全网推广
  • 网站和管理系统哪个更难做北京seo网站优化公司
  • 做网站要互联网运营培训课程
  • 网站域名被重定向直播发布会
  • 哈尔滨制作手机网站什么软件可以发布推广信息
  • 南漳县建设局网站在线培训平台
  • 网站建设中倒计时模板下载线下推广怎么做
  • wordpress自定义页面宽度seo排名赚app靠谱吗
  • 网站建设是用自己的服务器十大互联网平台
  • php 中英双语网站源码设计好看的网站
  • 做网站和做新媒体运营金华seo
  • 做网站的公司前三名北京百度seo排名点击软件
  • 网站建设与运营 教材 崔搜索引擎排名查询工具
  • 网站做任务 炸金花合肥网络seo推广服务
  • 宜昌网站开发肇庆百度快速排名
  • 怎么做可以使网站跳转福建seo搜索引擎优化
  • 网站开发需要哪些语言网站联盟
  • o2o网站源码app河南网站设计
  • 阿玛尼手表网站市场营销试题库(带答案)
  • wordpress主题带个人中心包头整站优化
  • 工程建设教育网seo入门教学