发布于 2026-01-05 0 阅读
0

面向对象编程:面向自学开发者。人们是如何做事的?这些方法之间有什么区别?将责任从自己转移到他人……为什么会有这种区别?面向对象范式。示例中的对象操作。TypeScript 中的设计模式。

面向对象编程:面向自学开发者。

人们是如何做事的?

这些方法之间有什么区别?

将责任从自己转移到他人身上……

为什么会有这种差异?

面向对象范式

示例中的对象操作。

TypeScript 中的设计模式

大家好,我最近在研究面向对象编程design patterns,但感觉很难掌握。
后来我意识到,这可能是因为我主要使用的编程语言是 JavaScript,它是一种函数式编程语言。
虽然 JavaScript 在 ES6 更新中引入了类,但我个人一直没怎么用过。现在我终于转用 TypeScript 了,所以很想学习一下面向对象编程。

简而言之,学习的第一步Design Patterns是理解Object Oriented Programming。以下是一小段摘录,它让我意识到其中Object的含义Object Oriented Programming,我认为这将是我下一个系列文章“TypeScript中的设计模式”的绝佳开端。( GitHub repo link at the bottom of the article )


人们是如何做事的?

假设你是一名会议讲师。你班上的学员在你课后还要参加另一节课,但他们不知道下一节课的地点。你的职责之一就是确保每个人都知道如何前往下一节课的教室。

如果采用结构化编程方法,你可能会这样做:

  1. 获取班级成员名单。
  2. 名单上的每个人:
    1. 找到他们接下来要上的课。
    2. 找到那节课的教室位置。
    3. 找到从你的教室到那个人下一个教室的路。
    4. 告诉对方如何前往下一节课的教室。

为此需要以下步骤:

  1. 获取班级人员名单的一种方法
  2. 获取班级中每个人课程表的方法
  3. 一个可以指引你从你的教室到任何其他教室的程序
  4. 一个适用于班上每个人的控制程序,并能为每个人执行所需的步骤。

我很怀疑你会采取这种做法。

我怀疑你真的会采用这种方法。你很可能会把从这间教室到其他教室的路线图贴出来,然后告诉班里的每个人:“我已经把接下来几节课的教室位置以及其他教室的位置都贴在教室后面了。请根据这些位置图去你们的下一节课教室。” 你希望每个人都知道下一节课是什么,能够从路线图上找到自己要去的教室,然后按照路线图前往教室。

这些方法之间有什么区别?

  • 第一种方法——向所有人下达明确指示——需要你格外注意很多细节。除了你之外,没有人需要对任何事情负责。你会疯掉的!

  • 在第二种情况下,你给出一般性指示,然后期望每个人都能自己想办法完成任务。

将责任从自己转移到他人身上……

最大的区别在于责任的转移。第一种情况下,你要对所有事情负责;第二种情况下,学生要对自己的行为负责。两种情况下,都需要落实同样的事情,但组织方式却截然不同。

这将产生什么影响?

为了了解这种职责重组的效果,让我们看看当提出一些新要求时会发生什么。

假设我现在被告知要给协助会议的研究生一些特殊指示。比如,他们可能需要在参加下一节课之前收集课程评价并送到会议办公室。如果是第一种情况,我需要修改控制程序来区分研究生和本科生,然后再给研究生一些特殊指示。我可能需要对这个程序进行相当大的修改。

然而,在第二种情况下——即人们需要对自己负责的情况下,我只需要为研究生编写一套额外的流程。控制程序仍然只会说“去上下一节课”。每个人都只需按照适合自己的指示去做即可。

为什么会有这种差异?

这对控制程序来说是一个显著的区别。一种情况下,每当出现需要遵守特殊指示的新学生群体时,程序都必须进行修改。而另一种情况下,新学生群体则需要对自己的行为负责。

导致这种情况发生的因素有三个

  • 人们要对自己负责,而不是由控制程序来对他们负责。(请注意,要做到这一点,一个人还必须清楚自己属于哪种类型的学生。)
  • 该控制程序可以与不同类型的人(研究生和普通学生)对话,就好像他们完全相同一样。
  • 控制程序不需要知道学生在教室之间移动时可能需要采取的任何特殊步骤。

面向对象范式

面向对象范式以对象为核心概念。一切都围绕对象展开。我编写的代码是围绕对象而非函数组织的。
使用对象的优势在于,我可以定义能够自我管理的事物。
对象本身就知道自己的类型。对象中的数据使其了解自身的状态,而对象中的代码则使其能够正常运行(即执行其应执行的操作)。

此对象 负责
学生
  • 知道他们现在在哪间教室;知道他们接下来要去哪间教室。
  • 从一个教室走到下一个老师那里。
  • 告诉大家去下一个教室
  • 课堂 拥有位置
    指路人 给定两个教室,请给出从一个教室到另一个教室的路线。

    在这种情况下,对象是通过分析问题域中的实体来识别的。我通过观察这些实体需要做什么来确定每个对象的职责(或方法)。这与通过查找需求中的名词来查找对象、通过查找动词来查找方法的方法一致,这种方法虽然局限性较大,但却是一个不错的起点。

    理解物体本质的最佳方式,是将其视为具有责任的存在。一个好的设计原则是,物体应该对自己负责,并且这些责任应该被清晰地定义。这就是为什么我说学生物品的职责之一就是知道如何从一个教室走到另一个教室。

    示例中的对象操作。

    使用面向对象的方法编写“前往下一个教室”示例程序要简单得多。程序代码如下所示:

    1. 启动控制程序。
    2. 实例化教室中的学生集合。
    3. 告诉工作人员让学生们去上下一节课。
    4. 该集合通知每个学生前往下一节课。
    5. 每位学生:
      1. 找到下一节课的地点
      2. 决定如何到达那里
      3. 去那里
    6. 完毕。

    面向对象术语

    学期

    定义

    抽象类

    抽象类定义了一组概念相似的类的方法和共同属性。抽象类永远不会被实例化。

    属性

    与对象关联的数据(也称为数据成员)。

    班级

    对象的蓝图——定义了该类型对象的方法和数据。

    构造函数

    创建对象时调用的特殊方法。

    封装

    任何形式的隐藏。对象封装了自身的数据。抽象类封装了其派生的具体类。

    派生类

    从超类衍生而来的类。它包含超类的所有属性和方法,但也可能包含其他属性或不同的方法实现。

    毁灭者

    对象删除时调用的特殊方法。

    功能分解

    一种将问题分解成越来越小的功能的分析方法。

    遗产

    类专门化的方式,用于将派生类与其抽象联系起来。

    实例

    类中的特定对象。

    实例化

    创建类实例的过程。成员可以是类的数据或方法。

    方法

    与对象关联的函数。

    目的

    具有职责的实体。一个特殊的、独立的容器,既包含数据,也包含操作这些数据的方法。对象的数据受到保护,免受外部对象的访问。

    多态性

    相关对象能够实现其类型特有的方法。

    超级级

    其他类都继承自该类。它包含所有派生类将使用(并可能重写)的属性和方法的主定义。

    这是我开始维护的 GitHub 代码库,记录了我学习设计模式的经验。如果能有人帮忙完善问题模板之类的东西就太好了,因为我在这方面没什么经验。

    GitHub 标志 MidasXIV / TypeScript 设计模式

    可重用面向对象软件的要素

    TypeScript 中的设计模式

    创建型设计模式|结构型设计模式|行为型设计模式

    Discord聊天 Discord 服务器

    在软件工程中,软件设计模式是指针对特定软件设计场景下常见问题的通用可复用解决方案。它并非可以直接转化为源代码或机器代码的最终设计,而是一种描述或模板,用于指导如何解决问题,并可应用于多种不同的场景。


    本文假设您至少精通一种面向对象编程语言,并且具备一定的面向对象设计经验。当然,我们一提到“类型”、“多态”或“接口”(而非“实现/继承”) ,您也不必急着去
    查字典。但我会尽量用浅显易懂的方式进行讲解。

    如果您有任何不理解的地方,也无需担心。

    注:本文的唯一目的是提高人们对这本书的认识,并可能指出一些自学程序员不了解的概念。

    这是本书的节选,作者Design Patterns ExplainedAlan Shalloway……James R. Trott


    祝你编程愉快 :D。


    文章来源:https://dev.to/midasxiv/object-orienting-programming-dealing-with-changing-requirements-cbh