备案 控制台
开发者社区 开发与运维 文章 正文

如何提高代码的扩展性(3)

简介: 如何提高代码的扩展性(3)

2、如何实现代码的高质量?


遵循SOLID设计原则:(接口设计原则)参考依据高内聚、低耦合


单一职责原则:一个类值负责一个功能的职责

开闭原则:扩展开放,修改关闭。

里氏代换原则:使用父类的地方都能使用子类对象

依赖倒转原则:针对接口编程,

接口隔离原则:针对不同部分用专门接口,不用总接口,需要哪些接口就用哪些接口


image.png


你认为下图的设计违反了哪一种设计原则?


image.png


(1)违反了单一职责原则(SRP)


画图和计算面积并不是单一职责,计算几何学应用程序只计算面积不画图,但是还要引入GUI。


应该有且仅有一个原因引起类的变更。简单点说,一个类,最好只负责一件事,只有一个引起它变化的原因。也就是说引起类变化的原因只有一个。高内聚、低耦合是软件设计追求的目标,而单一职责原则可以看做是高内聚、低耦合的引申,将职责定义为引起变化的原因,以提高内聚性,以此来减少引起变化的原因。职责过多,可能引起变化的原因就越多,这将是导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。


(2)开闭原则


对扩展开放。模块对扩展开放,就意味着需求变化时,可以对模块扩展,使其具有满足那些改变的新行为。换句话说,模块通过扩展的方式去应对需求的变化。


对修改关闭。模块对修改关闭,表示当需求变化时,关闭对模块源代码的修改,当然这里的“关闭”应该是尽可能不修改的意思,也就是说,应该尽量在不修改源代码的基础上面扩展组件。


一个开闭原则的简单实例(懂则不用看)



image.png


  对拓展开放,对修改关闭:比如当某个业务增加,不是在原类增加方法,而是增加原类的实现类。


下面的例子是一个非常典型的开闭原则及其实现。非常简单,但却能够很好的说明开闭原则。


假设有一个应用程序,能够计算任意形状面积。这是几年前我在明尼苏达州农作物保险公司遇到的一个非常简单问题。app程序必须能够计算出指定区域的农作物总的保险报价。正如你所知道的,农作物有各种形状和大小,有可能是圆的,有可能是三角形的也可能是其他各种多边形。


OK,让我们回到我们之前的例子中....


作为一名优秀的程序员,我们将这个面积计算类命名为 AreaManager。这个 AreaManager是单一职责的类:计算形状的总面积 。


假设我们现在有一块矩形的农作物,我omen用一个Rectangle类来表示。相关类代码如下:


public class Rectangle {
    private double length;
    private double height; 
    // getters/setters ... 
}
public class AreaManager {
    public double calculateArea(ArrayList<Rectangle>... shapes) {
        double area = 0;
        for (Rectangle rect : shapes) {
            area += (rect.getLength() * rect.getHeight()); 
        }
        return area;
    }
}
AreaManager类现在运行良好,直到几周之后,我们又有一种新的形状——圆形:
public class Circle {
    private double radius; 
    // getters/setters ...
}
由于有新的形状需要考虑,我们必须修改我们的AreaManager类:
public class AreaManager {
    public double calculateArea(ArrayList<Object>... shapes) {
        double area = 0;
        for (Object shape : shapes) {
            if (shape instanceof Rectangle) {
                Rectangle rect = (Rectangle)shape;
                area += (rect.getLength() * rect.getHeight());                
            } else if (shape instanceof Circle) {
                Circle circle = (Circle)shape;
                area += (circle.getRadius() * cirlce.getRadius() * Math.PI;
            } else {
                throw new RuntimeException("Shape not supported");
            }            
        }
        return area;
    }
}
从这段代码开始,我们察觉到了问题。
如果我们遇到一个三角形,或者其他形状呢,这时候我们就必须一次又一次的修改AreaManager类。
这个类的设计就违背了开闭原则,没有做到对修改的封闭性以及对扩展的开放性。我们必须避免这种事情的发生~
基于继承的开闭原则的实现
AreaManager类的职责是计算各种形状的面积,而每一种形状都有其独特的计算面积的方法,因此将面积的计算放入到各个形状类中是特别合理的。
AreaManager类仍然需要知道所有的形状,否则它就无法判断所有的形状类是否都包含了计算面积的方法。当然了,我们可以通过反射来实现。其实有一种更简单的方式也可以实现——让所有的形状类都继承一个接口:Shape(也可以是抽象类)
public interface Shape {
    double getArea(); 
}
每一个形状类都实现这个接口(如果接口无法满足你的需求,也可以通过继承某个抽象类):
public class Rectangle implements Shape {
   private double length;
   private double height; 
   // getters/setters ... 
   @Override
   public double getArea() {
       return (length * height);
   }
}
public class Circle implements Shape {
   private double radius; 
   // getters/setters ...
   @Override
   public double getArea() {
       return (radius * radius * Math.PI);
   }
}
现在,我们可以通过这个抽象方法将AreaManager构造成一个符合开闭原则的类。
public class AreaManager {
    public double calculateArea(ArrayList<Shape> shapes) {
        double area = 0;
        for (Shape shape : shapes) {
            area += shape.getArea();
        }
        return area;
    }
}


通过扩展去应对需求变化,就要求我们必须要面向接口编程,或者说面向抽象编程。所有参数类型、引用传递的对象必须使用抽象(接口或者抽象类)的方式定义,不能使用实现类的方式定义;通过抽象去界定扩展,比如我们定义了一个接口A的参数,那么我们的扩展只能是接口A的实现类。总的来说,开闭原则提高系统的可维护性和代码的重用性。

-开发达人-
目录
相关文章
杨不易呀
|
8月前
|
安全 Java
利用反射技术提升Java应用的灵活性和可扩展性
利用反射技术提升Java应用的灵活性和可扩展性
杨不易呀
51 0
听风de歌
|
15天前
|
存储 分布式计算 负载均衡
HadoopHDFS的特点可扩展性
【5月更文挑战第11天】HadoopHDFS的特点可扩展性
听风de歌
24 1
warmhearted
|
2天前
|
监控 中间件
选择中间件性能和可扩展性
【5月更文挑战第20天】
warmhearted
8 1
以山向海
|
17天前
模块功能复用和扩展性
模块功能复用和扩展性 模块功能复用和扩展性是软件工程中的重要概念,主要体现在设计和实现阶段。
以山向海
29 1
wljslmz
|
11月前
|
设计模式 算法
如何优雅地使用策略模式来实现更灵活、可扩展和易于维护的代码?
如何优雅地使用策略模式来实现更灵活、可扩展和易于维护的代码?
wljslmz
61 0
xindoo
|
存储 缓存 固态存储
如何写出高性能代码(四)优化数据访问
同一份逻辑,不同人的实现的代码性能会出现数量级的差异; 同一份代码,你可能微调几个字符或者某行代码的顺序,就会有数倍的性能提升;同一份代码,也可能在不同处理器上运行也会有几倍的性能差异;十倍程序员不是只存在于传说中,可能在我们的周围也比比皆是。十倍体现在程序员的方法面面,而代码性能却是其中最直观的一面。
xindoo
120 0
如何写出高性能代码(四)优化数据访问
-开发达人-
如何提高代码的扩展性(4)
如何提高代码的扩展性(4)
-开发达人-
106 0
如何提高代码的扩展性(4)
-开发达人-
|
测试技术 微服务
如何提高代码的扩展性(2)
如何提高代码的扩展性(2)
-开发达人-
141 0
如何提高代码的扩展性(2)
-开发达人-
|
缓存 NoSQL 关系型数据库
如何提高代码的扩展性(1)
如何提高代码的扩展性(1)
-开发达人-
231 0
如何提高代码的扩展性(1)
-开发达人-
如何提高代码的扩展性(5)
如何提高代码的扩展性(5)
-开发达人-
342 0
如何提高代码的扩展性(5)

热门文章

最新文章

  • 1
    Linux中的工作队列
  • 2
    阿里巴巴宣布 Sentinel 开源,进一步完善 Dubbo 生态(附PPT和视频)
  • 3
    什么才是这个时代最需要的BI人员? —— 阿里云MVP赵玮主题分享【1】
  • 4
    MongoDB World 2016参会全记录
  • 5
    DataV,让拖拖拽拽就可以打造可视化应用
  • 6
    JavaScript学习之旅-5(原创)
  • 7
    SilverLight1.1 之旅(一):Hello World
  • 8
    Uninstall/Remove 11.2.0.2 Grid Infrastructure & Database in Linux
  • 9
    用Windows Live Writer发布日志到BlogBus
  • 10
    最新31个非常棒的 Photoshop 网页设计教程
  • 1
    Python中的封装
    13
  • 2
    基于ssm+vue.js+uniapp小程序的QQ村旅游网站附带文章和源代码设计说明文档ppt
    12
  • 3
    基于SpringBoot+Vue+uniapp的校园驿站全天候辅助取货管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
    12
  • 4
    基于ssm+vue.js+uniapp小程序的大湾区旅游推荐系统附带文章和源代码设计说明文档ppt
    14
  • 5
    基于SpringBoot+Vue+uniapp的冀中工程技师校园网站的详细设计和实现(源码+lw+部署文档+讲解等)
    12
  • 6
    基于SpringBoot+Vue+uniapp的线上招聘问答系统的详细设计和实现(源码+lw+部署文档+讲解等)
    11
  • 7
    基于ssm+vue.js+uniapp小程序的城投公司企业人事管理系统附带文章和源代码设计说明文档ppt
    11
  • 8
    基于SpringBoot+Vue+uniapp的“萌宠小知识”网站的详细设计和实现(源码+lw+部署文档+讲解等)
    10
  • 9
    Java中的选择结构语句详解与实战应用
    9
  • 10
    基于SpringBoot+Vue+uniapp的库存管理软件的详细设计和实现(源码+lw+部署文档+讲解等)
    10
  • 相关电子书

    更多
  • Web服务架构变化及性能优化
  • 如何做小程序性能优化
  • 用RxSwift写易维护易读的愉悦代码
  • 相关实验场景

    更多
  • 高性能特性体验:ePQ 的详解与实战
  • 使用Java面向对象编写网络通信程序应用
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司镇江网站seo优化多少钱喀什网站seo优化文山网站优化排名哪家好同乐关键词按天扣费多少钱锦州网站搭建推荐临夏网站优化按天计费哪家好玉林至尊标王哪家好襄樊网络广告推广推荐吉祥建网站公司固原网站推广方案推荐朝阳外贸网站建设价格朔州高端网站设计多少钱柳州关键词排名包年推广价格福州百度网站优化排名鹰潭seo排名多少钱毕节至尊标王价格清徐网站开发价格大浪企业网站建设多少钱宁德企业网站建设报价新余网站设计模板多少钱三亚关键词按天收费报价红河网站seo优化推荐雅安网站seo优化公司诸城网站关键词优化多少钱诸城百度网站优化宿州设计公司网站价格荆门网站制作设计价格平凉优秀网站设计报价绍兴企业网站制作哪家好惠州seo排名多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化