前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 编程思想精华总结(一)- 对象导论(上)

Java 编程思想精华总结(一)- 对象导论(上)

作者头像
JavaEdge
发布2020-05-27 11:51:17
3510
发布2020-05-27 11:51:17
举报
文章被收录于专栏:JavaEdge

1 抽象化

编程语言都是实际问题的抽象。而问题的复杂性取决于抽象的类型和质量。

1.1 OOP 中的对象是用来作甚的?

程序可以通过添加新的对象使自身更适用于某特定问题。因此阅读代码其实也就是在阅读问题的描述。

1.2 OOP编程的基本特性:

  1. 万物皆对象
  2. 程序就是对象的集合,他们通过发送消息来通知彼此要做什么
  3. 每个对象都有自身的由其他对象所构成的存储,比如组合
  4. 每个对象都是某个类的实例
  5. 某一特点类型的所有对象都能接收同样的消息

2 每个类都有接口(Java 中的API)

在程序执行期间具有不同的状态而其他方面都相似的对象会被分组到对象的类中,这就是 class 关键字的由来。

类描述了具有相同特性(数据元素)和行为(功能)的对象集合,所以类其实就是一个数据类型。

任何程序都是所设计系统的一种仿真,OOP 就能将大量问题降解为很简单的解决方案。

但是 OOP 的挑战之一就是建立问题空间的元素和解空间之间的对象的一一映射。

2.1 那到底怎么才能获得有用的对象?

这必须有某种方式可以产生对对象的请求,通知它去完成所需任务。每个对象只能满足某些特定的请求,而这些请求呢?就由接口所定义,决定接口的是类型。

接口确定了对某特定对象所能发出的请求。

3 每个对象都提供服务

将对象看做服务的提供者,程序本身就是向调用者提供服务的,而 app 就是通过调用其他对象所能提供的服务来实现这一目的。

3.1 解决你的问题又需要什么样的服务提供才能满足?

是不是可以通过加工组合当前这些对象已有的服务,来构建未来的服务满足你。构想完之后,就是你该写代码的时刻了。

3.2 提高对象的内聚性

不要妄图一个对象满足了你所有想象,这么多功能对于一个对象来说太多了,对象内部关系复杂之后也将使得 SE 们也难以理清关系,就像一个文件写了几千行,真是吐了!

每个对象都该有其所能提供服务的内聚的集合。优秀的 OOP 设计,每个对象都能很好做好一件事,而不是想着同时做好很多事,那样在现实中往往是同时很多事都做不好。

4 访问控制 - 隐藏具体实现

SE 分为类创建(负责创建新的数据类型)和客户端程序员(只管在其应用中使用数据类型的类消费者)。

4.1 客户端程序员的禁地

类创建者可以隐藏对象内部脆弱部分,不让其被客户端程序员访问到,这至少很大程度上能减少 bug

4.2 允许库设计者自由地改变内部的工作方式而无需担心影响到客户端程序员的用户体验

比如说为了上线某功能,先简单实现,之后有问题再继续升级,而无需一开始就考虑地面面俱到(谁会预料到客户会干出啥莫名其妙之事呢)。

5 复用

复用性的操作难度很难控制,需要大量经验,但不可否认好的复用性是 OOP 设计的奇妙之处。

最简单复用 - 直接使用该类的一个对象,也可将那个类的一个对象置于其他某个新的类中(比如 HashSet 直接复用 HashMap 成员对象),这便是组合(动态发生的组合称为聚合),一种 has - a 关系。

组合有着极大灵活性,是继承所不能比的。成员对象通常 private 保证私密性,,不会干扰客户端代码,还能动态修改组合对象,以实现动态修改程序的行为。

建立新类时,优先考虑组合,因为更简单灵活,而且设计更加清晰。当然这也需要大量经验,才能看出何时无可奈何只能选择继承。

6 继承

创建了一个类后,即使另一个新类与其很相似,还是得重建这个新类。如果能复制现有的类,通过添加修改一顿操作适配成一个新类是不是容易多了?这就是继承。

父类包含了所有子类所共享的特性和行为,表示系统中某些对象的核心概念,子类就用来表示此核心的不同实现方式。

继承现有类型,也就是创造了新的类型。

6.1 有意义的继承是使得父子类之间有差异

那么如何可以达到这一目的呢?

  1. 直接在子类添加新方法 这有时的确是解决问题的简单的完美的方式,但需要仔细考虑这些新方法是不是其实得加到父类中?可描述为is-like-a(像是一个)
  2. 更重要的是重写父类方法 使用相同的 API,但是在新的子类中做一点不寻常的事。这时判断继承关系,可用 is-a(是一个)描述来鉴定。

设计时,仔细审视,经验老道后应该很容易分辨到底采取哪种方式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.1 OOP 中的对象是用来作甚的?
  • 1.2 OOP编程的基本特性:
  • 2 每个类都有接口(Java 中的API)
    • 2.1 那到底怎么才能获得有用的对象?
    • 3 每个对象都提供服务
      • 3.1 解决你的问题又需要什么样的服务提供才能满足?
        • 是不是可以通过加工组合当前这些对象已有的服务,来构建未来的服务满足你。构想完之后,就是你该写代码的时刻了。
          • 3.2 提高对象的内聚性
          • 4 访问控制 - 隐藏具体实现
            • 4.1 客户端程序员的禁地
              • 4.2 允许库设计者自由地改变内部的工作方式而无需担心影响到客户端程序员的用户体验
              • 5 复用
              • 6 继承
                • 6.1 有意义的继承是使得父子类之间有差异
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档