范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

设计原则一

  一、开闭原则
  顾名思义,在软件设计中应当遵循对扩展开放,而对修改关闭。也即在实际开发过程中,当需求变动业务调整时,在不改动源码的情况下可以扩展以支撑新的功能;这也要求了在设计之初制定技术方案时应有前瞻性。遵循开闭原则的好处:提高代码的复用性、可维护性、有利于单元测试。实现:在面向对象的设计中,通常可以通过定义接口或者抽象类来约束相同属性或者一般通用的实现(抽象),这样具体派生实现类可以将具体的实现封装在内部。即使业务变化,我们只需要相应的派生出一个实现类就可以实现扩展。不过在实际中,这种对业务的抽象能力要求还是比较高的。如果抽象的粒度太小,那么会伴随着繁杂的实现类;如果粒度太大却不利于扩展。经验的积累与思考很重要。1.实际问题
  商品价格变动模拟,如打折促销、涨价等定义顶层的商品接口(仅仅包含ID、名称、价格)public interface Product {  long getId();  long getPrice();  String getName(); }新建水果中香蕉的实现类public class Banana implements Product {  private long id;  private long price;  private String name;     public Banana(long id, long price, String name) {   this.id = id;   this.price = price;   this.name = name;  }     public void setId(long id) {   this.id = id;  }   public void setPrice(long price) {   this.price = price;  }   public void setName(String name) {   this.name = name;  }   @Override  public long getId() {   return this.id;  }   @Override  public long getPrice() {   return this.price;  }   @Override  public String getName() {   return this.name;  } }香蕉不易保存的特性决定了,如果库存较多只能打折进行处理。
  如果直接修改Banana实现类中价格getPrice()势必会对其他的地方的调用产生影响,违背了开闭原则。因此增加BananaDiscountImp折扣类,当然这其实也是不合理的,仅仅作为举例,如果都是这种,会增加很多不必要的实现类,使得项目膨胀冗杂。public class BananaDiscountImp extends Banana {   public BananaDiscountImp(long id, long price, String name) {    super(id, price, name);   }      /**   * 原始价格   */   @Override   public long getPrice() {    return super.getPrice();   }      /**   * 折后价格   * (需借助BigDecimal转换,包括保留小数位等,80相当于8折)   */   public long getOriginalPrice() {    return getPrice() * 80L;   } }二、里氏替换原则含义:通俗地讲在继承过程中子类可以对基类的功能进行扩展,但不能改变基类原有的功能。在面向对象的程序设计中,继承作为三大特性之一。虽然带来了很大的便利性,但同时也增加了耦合性,侵入性。里氏替换原则实际上更是对继承过程中的一种规范与约束:1.子类可以增加自身特有的方法;2.子类可以实现基类的抽象方法,但不能覆盖基类的非抽象方法;3.当子类重载基类的方法时,方法的入参应该比基类更宽松;4.当子类实现基类的抽象方法时,方法的返回值应该比基类更严格;5.如果子类必须重写基类的方法时,应该考虑替换当前的继承关系,同时继承更加一般的基类,或者使用组合、聚合、依赖等其他方式替代。1.实际问题
  比较经典的"正方形非长方形问题",另外我们知道鸵鸟是不会飞的,但是奔跑的速度很快。顶层的抽象动物类public class Animal {   /**   * 米每秒   */   private long moveSpeed;      public long getMoveTime(long distance) {    return distance / moveSpeed;   }      public void setMoveSpeed(long moveSpeed) {    this.moveSpeed = moveSpeed;   } }较为一般的鸟类public class Bird extends Animal {   private long flySpeed;      public void setFlySpeed(long flySpeed) {    this.flySpeed = flySpeed;   }      public long getFlyTime(long distance) {    return distance / flySpeed;   } }
  在定义的过程,无非就是根据一些鸟类的特性,比如有羽毛,会飞,有喙等等;但是往往会存在特例。鸵鸟除了没有飞的能力其他都是包含的,如果继承Bird类,当求导飞行速度时势必会出现错误,因为鸵鸟的飞行速度为0。具体到某一种鸟类-麻雀public class Sparrow extends Bird {    @Override   public void setFlySpeed(long flySpeed) {    super.setFlySpeed(flySpeed);   } }鸵鸟类(错误的继承) public class Ostrich extends Bird {   @Override   public void setFlySpeed(long flySpeed) {   //鸵鸟的飞行速度为零,重写了   flySpeed = 0;   super.setFlySpeed(flySpeed);   } }
  当测试时,肯定是会出现系统异常的情况,这里违背了里氏替换的原则-不能覆盖基类的非抽象方法;从而导致了错误的结果,此时应该考虑取消继承关系,改为更加通用的基类,也即继承Animal,动物都有移动的速度。鸵鸟类继承Animalpublic class Ostrich extends Animal {   public Ostrich() {}      @Override   public void setMoveSpeed(long moveSpeed) {    super.setMoveSpeed(moveSpeed);   }      public static void main(String[] args) {    //测试    Animal ostrich = new Ostrich();    ostrich.setMoveSpeed(90);   } }实际开发的过程中应避免对滥用继承,实现子类时遵循里氏替换的原则能够帮助我们对子类更好地约束,建立起更健壮、易维护的系统。当然不遵循程序也能跑,随着项目的复杂度增加,出现问题的概率也大大增加。三、依赖倒置原则
  高层结构的模块不应该依赖低层结构的模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。1.一般含义通俗的解释,依赖倒置的核心思想-面向接口编程。面向接口编程的好处不言而喻,相对于实现细节的多变性,抽象的概念则稳定得多,很多同学包括自己在实际开发中有时候也会陷入到实现的细节中,试想以具体的实现类来构建系统自然是不够稳定的,同样不利于扩展。对于这种,首先考虑的是制定抽象的接口、抽象类层,以接口来约束和规范实现,而不关心具体的实现细节。2.作用既然都面向了接口,类与类之间的耦合度降低了(依赖倒置原则降低了类之间的耦合度)。耦合度低,提高了系统的稳定性(稳定性)。抽象的规范与约束作用,提高了代码的可维护性,可读性,当然既然存在继承,那么在设计与实现的过程中应遵循里氏替换原则(可维护性、可读性)。3.如何设计面向接口-尽量使用使用接口或者抽象类,或者两者都包含来代替类传递。对于变量的申明类型尽量使用接口或者抽象类,而不是具体的实现类。继承遵循里氏替换原则4.实际问题
  以大学生学习课程为例定义课程的接口/** * Created by Sai * on: 05/01/2022 23:54. */ public interface ICourse {  void selected(); }具体课程类-物理课/** * Created by Sai * on: 05/01/2022 23:58. */ public class PhysicsCourse implements ICourse {  @Override  public void selected() {   System.out.println("物理课被选修了");  } }具体课程类-英语课/** * Created by Sai * on: 06/01/2022 00:00. */ public class EnglishCourse implements ICourse {    @Override  public void selected() {   System.out.println("英语课被选修了");  } }学生类/** * on: 06/01/2022 00:01. * Description: */ public class Student {   //依赖注入   private ICourse course;    public Student() {}      public ICourse getCourse() {   	return course;   }      public void setCourse(ICourse course) {   	this.course = course;   }      public void study() {    if (null != course) {  		 course.selected();    }   }   public static void main(String[] args) {    Student stu = new Student();    stu.setCourse(new EnglishCourse());    stu.study();    stu.setCourse(new PhysicsCourse());    stu.study();  } } //英语课被选修了 //物理课被选修了 //Process finished with exit code 0前面提到依赖倒置的核心-面向接口编程,理解了面向接口编程的含义与运用,依赖倒置原则自然而然就掌握了,当然这离不开实践过程中的积累与思考。

星辰大海也能黑?某信公关被抓现行,小米或将采取行动互联网一直都不是随便发表言论的,今天就有一家公司恶意抹黑小米电视。原因是这样的,某信煽动写手发文抹黑小米,说解读海报,实则讽刺小米的星辰大海的目标。而且某信的公关还被抓了个现行,这我,13年专卖创业失败废品,年销售过亿作者丨陈晓编辑丨房煜图源丨摄图网第二树创业还是要谨慎些,要么顺应国家政策和大形势,要么在大平台有一定的积累和人脉,再去创业。因为我见过太多的九死一生了。第二树董事长吴海卡对创业邦说人民更需要抖音神曲过滤器图片来源视觉中国文道总有理你有邀请码吗?去年,一个社交软件突然爆火,因为一码难求,圈内人在朋友圈悠闲地晒出邀请码,圈外人则挤破头地想进来,Clubhouse俨然成了一块辨别上流人士上门按摩体验感怎么样?大家好,我用我的亲身经历,来和大家分享下,上门按摩的体验如何?现在如果想要找上门按摩主要有三个途径。第一。就是经常去的按摩店,然后和里面的技师比较熟悉了,彼此有一定了解,然后由于一玩树莓派能学到什么?树莓派(raspberrypi)是一个微型电脑,拥有完善的图形操作系统,它诞生的意义就是普及编程,它可以做的事很多。题目问树莓派能学到什么,倒不如问树莓派能做什么?因为你做到的才是买TWS一定要和手机选同品牌吗?近些年来,体积小携带方便没有束缚的真无线(TWS)蓝牙耳机成为了市场上最受欢迎的音频设备。但如今的TWS市场选择众多,单就品牌数量而言都可谓百花齐放,除了手机本品牌的配套产品外,也无损音乐播放器哪个好?谢谢邀请。这个问题有点模糊。无损音乐播放器,可以理解成,无损音乐,音乐播放器。无损音乐,指的是音源,音源分几个当次,流畅,高品,超品,无损。无损音乐的音质最好。音乐播放器,一是音乐你觉得高德地图百度地图腾讯地图哪个比较准确?高德地图我认为最好用这个嘛,我跑过一万多公里的高速,告诉你实际体验。高德是哪条路最短导哪条,你要做好走烂路的准备。在呼市有一天晚上被导航引到坑里(在修路),幸好是suv,不然出不来甘肃省今年新能源汽车领域全面增长我省今年新能源汽车领域全面增长每日甘肃网兰州讯(新甘肃甘肃日报记者王占东)记者近日从国网甘肃综合能源服务有限公司获悉,今年以来,随着我国有关鼓励新能源产业发展政策的落地,我省新能源直播科技艺术家2022三星家电新品发布会科技艺术家2022三星家电新品发布会直播时间2022年4月7日19302200直播简介用科技为艺术加冕,让艺术融入生活,让家拥有与众不同的质感与气息,一起把家居环境装点得更和谐。活新势力3月销量出炉市场竞争越发激烈,头部品牌先发优势缩小近日,新能源品牌纷纷发布了3月交付情况。小鹏汽车哪吒汽车理想汽车和零跑汽车3月交付量均破万,广汽埃安首次突破2万台,蔚来汽车增速依然处在相对低位。从目前公布的数据来看,中国新能源市
互联网已成红海,制造业智能制造却寥寥无几,为何都逃离制造业最近一则话题关注度参与度讨论量都很高,具体讨论的话题是如何看待今年互联网行业的应届毕业生薪资是制造业薪资的四倍(甚至十倍)。纵观近几年互联网行业的发展我们不难看出,其增长的势头是远元宇宙买什么?汽车智能化为什么是明年重要方向?作者明野数据支持勾股大数据(www。gogudata。com)大家好,我是明野!一明年的一个重要方向有一个明年重要的方向,要重视下,就是汽车智能化,如果说今年的趋势是汽车的电动化,智能养老生活更好核心阅读近年来,越来越多的智能产品及服务走进百姓生活,在为老年人提供高效便捷养老服务的同时,让居家养老社区养老更有温度更具品质。随着智慧健康养老产业链不断完善,下一步,应在提升养老人工智能AI赛道,中国会领先美国人工智能(AI)是一项跨越所有行业的革命性技术,有望实现生产力和自动化突破以及以前无法获得的洞察力。作为人工智能潜力的证明,各国都在竞相采用人工智能技术,以获得其带来的好处,尤其是谷歌突然宣布上帝的密码防线逐渐崩溃!人工智能极有可能是人类文明史的终结谷歌突然宣布谷歌最新人工智能AlphaFold,在一项极其困难的任务中击败了所有对手,成功根据基因序列预测了生命基本分子蛋白质的三维结构。谷歌宣布上帝的密码防线逐渐崩溃!世界为之震这还是卡车吗?1150马力外观如火车头,尼古拉斯大件牵引车实拍前几天的文章里,提加带您了解了位于美国的新能源卡车初创企业尼古拉公司,它和依维柯的关系十分密切。而在商用车领域,还有一家名称和它很像的特种车公司尼古拉斯(Nicolas)。该公司坐45岁程序员失业背后,职场的35岁现象发生的根源45岁程序员失业问题本文是我的226期视频的文字内容,想和大家一起聊聊最近有一位45岁技术很好的程序员失业了,失业了以后再也找不到工作,然后他就把他的遭遇写了一封帖子,发在了国家最A股中很多暴涨好几倍的股票,并非绩优股或高业绩股,反而是业绩亏损股,原因是什么?很高兴回答你的提问。暴涨几倍的股票并不是绩优股,反而是绩差股甚至亏损股,这在A股市场司空见惯习以为常见怪不怪,原因如下1A股缺少个股做空机制。能够融券的个股都是极其少量的大盘股,至三大因素推动未来中国新能源汽车发展中国新能源汽车市场经过多年发展,已在纯电动混动等领域构建起较为完善的市场及产业链基础。面向未来,以清洁能源替代传统化石能源,实现从能源的生产运输利用全链条绿色环保,则是汽车产业发展比较2021款12。9英寸和11英寸iPadPro尺寸越大越好吗?2021款12。9英寸iPadPro采用更先进的miniLED显示屏,而不是像三星那样使用OLED屏幕。然而,同系列的11英寸iPadPro也没有采用miniLED屏幕,而是Liq最近想换个手机,预算5000左右(可略超出),有什么推荐吗?文小伊评科技5000元左右的手机基本上都是高端手机了,那么当价格到了这个档次之后,单纯追求基础配置的消费者已经不多了,更多的是在意这款手机的特色配置或者说其与众不同的地方,毕竟在基