程序设计的原则

本文深入探讨了面向对象编程中的七大设计原则:开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、合成/聚合原则、迪米特原则及单一职责原则,并通过实例解析了每个原则的应用与实现。

一、开闭原则(OCP)

1、相关概念:开闭原则的原文:Software entities should be open for extension,but closed for modification.翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。也就是说软件系统中包含的各种组件,例如模块(Modules)、类(Classes)以及功能(Fuctions)等等,应该在不修改现有代码的基础上,引入新的功能。开闭原则中的“开”是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中的“闭”,是指对于现有代码的修改是封闭的,即不应该修改现有的代码。

2、关键点:实现开闭原则的关键是“抽象”,把系统给的所哟可能的行为抽象成一个抽象底层,这个抽象底层规定出所有的具体实现必须提供的方法的特征。

3、例子:

interface VidioCard{//定义显卡的功能,有显示功能和获取显卡名称的功能

    void display();
    String getName();
}
class HaoLongVidio implements VidioCard{
    String name="HaoLongVidio";
    void setName(String name) {
        this.name = name;
    }
    public void display(){
        System.out.println("The HaoLong vidiocard is running!");
    }
    public String getName(){
        return name;
    }
}
class MainBorad{
    String cpuName;
    VidioCard vc;
    void setCpuname(String cpuName){
        this.cpuName=cpuName;
    }
    void setVidioCard(VidioCard vc){
        this.vc=vc;
    }
    void run(){
        System.out.println("Wudi-mainbord!");
        System.out.println(vc.getName());
        vc.display();
        System.out.println("mianborad is running successful!");
    }

}
public class pratice2 {
    public static void main(String[] args){
        HaoLongVidio hv=new HaoLongVidio();//买了一块HanglongVidio显卡
        MainBorad mb=new MainBorad();

        mb.setCpuname("intel");
        mb.setVidioCard(hv);

        mb.run();
        System.out.println("Okay!");
    }
}

二、里氏替换原则(LSP,Liskov  Substitution Principle)

1、相关概念:主张使用抽象(Abstraction)和多态(Polymorphism)将涉及中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承予以实现。

2、关键点:Subtypes must be substututable for their base types 即子类必须能够替换成它们的基类。“面向接口编程”基本上抓住了这个原则的核心。

3、例子:正方形不是长方形

4、备注:(1)实现开闭原则的关键步骤是抽象化,基类与子类之间的继承关系就是抽象化的体现,因此,里氏替换原则是实现抽象化的一种规范。违反里氏替换原则意味着违反了开闭原则,反之未必。里氏替换原则是使代码符合开闭原则的一个重要保证。(2)启示是如果一个继承类的对象可能会出现的地方出现运行错误,则该子类不应该从该基类继承,或者说,应该重现设计它们之间的关系。

三、依赖倒置原则(DIP:Dependence inversion principle)

1、相关概念:High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions。

A:高层次的模块不应该依赖于低层次的模块,它们都应该以来于抽象、B:抽象不应该依赖于具体,具体应该依赖于抽象。

2、关键点:要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合,提高系统的稳定性。

3、例子:

public class Driver{
    public void drive(Benz benz){
        benz.run();
    }
}
public class Benz{
    public  void run(){
        System.out.println("奔驰轿车开始运行。。。");
    }
}
public class Bmw{
    public void main(){
        System.out.println("宝马轿车开始运行。。。");
    }
}
public class Client{
    public static void main(String[] args){
        Driver zhangsan=new Driver();
        Benz benz=new Benz();

        zhangsan.drive(benz);
    }
}

例子说明:是设计出现了问题:司机类和奔驰轿车类之间是一个紧耦合的关系,其导致的结果就是系统的可维护性大大降低,可读性降低,两个个相似的类需要阅读两个文件。。。

解决方法:

4、说明:依赖倒置原则的本质就是通过抽象(接口或者抽象类)使各个类或者模块的实现彼此独立,不相互影响,实现模块间的松耦合。(1)每一个类尽量都有接口或者抽象类,或者两者都有。这是依赖倒置的基本要求,接口和抽象都是属于抽象的,有了抽象才可能依赖倒置。(2)变量的显示类型尽量使接口或者抽象类。(3)任何类都不应该从具体类派生。(4)尽量不要覆写基类的方法。因为类之间依赖的是抽象,覆写了抽象方法,对依赖的稳定性会产生一定的影响。(5)结合里氏替换原则适用。

四、接口隔离原则(ISP:Interface segregation principle)

1、相关概念:使用多个专门的接口比使用单一的接口要好。换言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应该是建立在最小的接口上的。

2、关键点:

3、例子:

//interface segregation principle -bad exaple
interface iWorker{
    public void work();
    public void eat();
}
class Worker implements iWorker{
    public void work(){
        //。。。working
    }
    public void eat(){
        //。。。eating in launch break
    }
}
class superWoker implements iWorker{
    public void work(){
        //。。。working much more
    }
    public void eat(){
        //。。。eating in 。。。
    }
}
class Manger{
    iWorker worker;
    public void setWorker(iWorker w){
        worker=w;
    }
    public void manage(){
        worker.work();
    }
}
//interface segregation principle-good example
interface iworkable{
    public void work();
}
interface ifeedable{
    public void eat();
}

class worker implements ifeedable,ifeedable{
    public void work(){
        //。。。working。。。
    }
    public void eat(){
        //。。。eatiung in launch break。。。
    }
}

class superWorker implements iworkable,ifeedable{
    public void work(){
        //。。。working much more
    }
    public void eat{
        //。。。eating in launch break
    }
}

class Robot implements iworkable{
    public void work(){
        //。。。。working
    }
}
class Manager{
    iworkable worker;
    public void setWorker(iworkable w){
        worker=w;
    }
    public void manage(){
        worker.work();
    }
}
备注:在使用接口隔离原则可以防止庞大、臃肿的接口,这也就是接口隔离原则的目的所在。

4、与单一职责原则的比较:接口原则尽量使用多个专门的接口,这和单一职责原则很类似,其实不然。(1)单一原则注重的是职责;而接口原则注重对接口依赖的隔离。(2)单一职责原则主要是约束类,其次才是接口和方法。它针对的是程序中的实现和细节;而接口隔离原则主要约束接口,主要针对抽象,针对程序整体框架的构建。

5、使用接口隔离原则的注意点:首先必须满足单一职责原则,其次是在使用接口隔离原则时:接口要小,但是要有限度;为依赖接口的类定制服务,只暴露给调用的类它需要的方法,不需要的方法则要隐藏起来。只有专注低位一个模块提供定制服务,才能建立最小的依赖关系;提高内聚,减少对外交互。

五、合成/聚合原则(CARP:Composition/Aggreagation Principle)

1、相关概念:尽量使用合成/聚合,不要使用类继承。在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过多向这些对象的委派达到服用已有功能的目的,就是说要进行的使用合成和聚合。

2、关键点:两者都是关联的特殊种类。聚合表示一种弱的”拥有“关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。合成(组合)是一种强的”拥有“关系,体现了严格的部分与整体的关系,部分与整体的生命周期是一样的。

3、例子:

六、迪米特原则(Low 偶发Demeter,又称为最少知识原则,least knowledge principle简写LKP)

1、相关概念:Talk only to your immediate friends,其初衷在于降低类之间的耦合。

2、关键点:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要条用另一个类的某一个方法的话,可以通过第三者转发这个调用。

3、例子:

4、备注:在类设计上的体现:(2)优先考虑将一个类设置成不变类(孩子与父母的关系,父母就可以理解为不变类)。(2)尽量降低一个类的访问权限。(3)谨慎使用serializable 。(4)尽量降低成员的访问权限。

七、单一职责原则

1、相关概念:不要存在多余一个导致类变更的原因。简单的理解就是一个类只负责一项职责。

2、关键点:存在职责扩散的情况。

3、例子:

4、备注:

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值