• 设计原则与思想:面向对象


    一.面向对象基本概念:

    1.什么是面向对象编程

    面向对象编程是一种编程范式或编程风格。他以类或者对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石。

    2.什么是面向对象编程语言

    面向对象编程语言是支持类或者对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特征的编程语言。

    3.如何判定一个编程语言是否是面向对象编程语言

    如果按照严格的定义,需要有现成的语法支持类、对象、四大特征才能叫面向对象编程语言。如果放宽要求的话,只要某种编程语言支持类、对象语法机制,那基本上就可以说这种编程语言是面向对象编程语言了,不一定非得要求具有所有四大特征。

    4.面向对象编程与面向对象编程语言之间的关系

    面向对象编程一般使用面向对象编程语言来进行。但是,不用面向对象对象语言也可以进行面向对象编程。同时,用面向对象语言写出来的代码也不一定是面向对象编程风格的,也有可能是面向过程编程风格的。

    5.什么是面向对象分析和面向对象设计

    面向对象分析就是要搞清楚做什么,面向对象设计就是要搞清楚怎么搞。两个阶段的产出是类的设计,包括程序被拆解为那些类,每个类之间有哪些属性方法、类与类之间如何交互等。

    二.封装、抽象、继承与多态分别解决那些编程问题?

    1.封装

    封装也叫信息隐藏或数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据,他需要编程语言提供权限访问控制语法来支持,例如java的private、protectd、public关键字。封装存在的意思,一方面是保护数据不被随意修改,提高代码的可维护性;另一方面是仅暴露有限的必要接口,提高类的易用性。示例代码:

     1 public class Wallet {
     2   private String id;
     3   private long createTime;
     4   private BigDecimal balance;
     5   private long balanceLastModifiedTime;
     6   // ...省略其他属性...
     7 
     8   public Wallet() {
     9      this.id = IdGenerator.getInstance().generate();
    10      this.createTime = System.currentTimeMillis();
    11      this.balance = BigDecimal.ZERO;
    12      this.balanceLastModifiedTime = System.currentTimeMillis();
    13   }
    14 
    15   // 注意:下面对get方法做了代码折叠,是为了减少代码所占文章的篇幅
    16   public String getId() { return this.id; }
    17   public long getCreateTime() { return this.createTime; }
    18   public BigDecimal getBalance() { return this.balance; }
    19   public long getBalanceLastModifiedTime() { return this.balanceLastModifiedTime;  }
    20 
    21   public void increaseBalance(BigDecimal increasedAmount) {
    22     if (increasedAmount.compareTo(BigDecimal.ZERO) < 0) {
    23       throw new InvalidAmountException("...");
    24     }
    25     this.balance.add(increasedAmount);
    26     this.balanceLastModifiedTime = System.currentTimeMillis();
    27   }
    28 
    29   public void decreaseBalance(BigDecimal decreasedAmount) {
    30     if (decreasedAmount.compareTo(BigDecimal.ZERO) < 0) {
    31       throw new InvalidAmountException("...");
    32     }
    33     if (decreasedAmount.compareTo(this.balance) > 0) {
    34       throw new InsufficientAmountException("...");
    35     }
    36     this.balance.subtract(decreasedAmount);
    37     this.balanceLastModifiedTime = System.currentTimeMillis();
    38   }
    39 }

    2.抽象

    抽象是指如何隐藏方法的具体实现,让使用者是需要关心提供了哪些功能,而不需要关心这些功能是如何实现的。抽象可以通过接口类或者抽象类来实现,但也并不需要特殊的语法机制来支持。抽象存在的意义,一方面是提高代码的可扩展性、可维护性,修改实现不需要改变定义,可减少代码的改动范围;另一方面,他也是处理复杂系统的有效手段,能有效过滤掉不必要关注的信息。

    3.继承

    继承是用来表示类之间的is-a关系,java不支持多继承(可避免菱形继承问题),有些语言如C++是支持多继承的。继承主要用于提高代码复用能力。

    4.多态

    多态指的是子类可以替换父类,在实际的代码运行中调用子类的方法实现。多态的实现需要编程语言特殊的语法机制来支持,如继承、接口类(实现)、duck-typing(动态语言支持,如python、js等,即不需要有继承或实现关系,有相同的接口名即可)。多态可以提高代码的扩展性和复用性,是很多设计模式、设计原则、编程技巧的代码实现基础。

    三.面相对象相比面相过程有哪些优势?

    1.常见编程范式:面向对象编程、面相过程编程、函数式编程

    2.什么是面向过程编程与面向过程编程语言?

    • 面向过程编程也是一种编程范式或编程风格。他以过程(可以理解为方法、函数、操作)作为代码组织的基本单元,以数据(可以理解为成员变量、属性)与方法相分离为最主要的特点。面相过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
    • 面向过程编程语言不支持类和对象两个语法概念,不支持丰富的面向对象编程特征(比如封装、继承、多态),仅支持面向过程编程。

    3.面向对象编程相比面相过程编程有哪些优势呢?

    • 对于大规模复杂程序的开发,程序的处理流程并非单一的一条主线,而是错综复杂的网状结构。面向对象编程更能应对这种复杂类型的程序开发。
    • 面向对象编程语言支持丰富的特性(封装、抽象、继承、多态),利用这些特征写出来的代码具有更好的可扩展性、易复用、可维护性(如面向过程语言没有封装特性,数据可以被任意方法随意修改,代码很难维护)。个人理解这一点也是最主要的优势。
    • 面向对象编程语言更加人性化、更加高级、智能(贴近人类的思考方式,同时开发效率更高,可以避免类似于c语言中内存越界、野指针、内存泄漏等问题。但程序运行效率可能更低。)。
  • 相关阅读:
    mybatis的分页插件pagehelper的使用
    SSM框架中添加事务
    junit测试,spring中使用
    maven的聚合和继承,maven的依赖
    shiro的角色和权限
    tomcat配置虚拟文件路径
    通过HttpServletRequest的request获取各种路径
    shiro学习一
    JDBC
    GUI
  • 原文地址:https://www.cnblogs.com/jixiegongdi/p/14189907.html
Copyright © 2020-2023  润新知