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

一.面向对象基本概念:

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语言中内存越界、野指针、内存泄漏等问题。但程序运行效率可能更低。)。
原文地址:https://www.cnblogs.com/jixiegongdi/p/14189907.html