CodeGym /Java 课程 /Frontend SELF ZH /一切皆为对象

一切皆为对象

Frontend SELF ZH
第 39 级 , 课程 0
可用

1.1 对象和类

今天你会了解到一个典型的JavaScript程序是如何构建的。最重要的一点是:每个JavaScript程序都是由类和对象组成的。JavaScript是面向对象的语言,其中所有事物都是对象:数字、字符串、函数,甚至是类。

那么类是什么呢?

先举个例子。假设你想造一艘小船。首先你需要设计图纸,然后送到工厂,根据图纸造出船。可能是一打,甚至不计其数的船。关键是,一张图纸可以造出很多一模一样的船。

在JavaScript编程中也是一样的。

图纸

程序员就像设计师。设计师画出图纸,而JavaScript程序员则写类。基于图纸制造零件,而基于类创建对象。

图纸

我们先写类(制作图纸),然后在程序运行时,JavaScript基于这些类创建对象。就像船是基于图纸被制造出来的一样。

图纸只有一份,但船可以有很多。船各不相同,有不同的名字,运输不同的货物。但它们都很相似:它们都是结构相同的船,能执行类似的任务。

再打个比方...

蚁巢

蚁巢是对象之间互动的很好例子。最简单的蚁巢有三类蚂蚁:女王蚁、战斗蚁和工蚁。

每类蚂蚁的数量不同。整个蚁巢只有一只女王,几十只战斗蚁,几百只工蚁。三个类却有上百个对象。蚂蚁们根据严格的规则彼此互动,与同类和其他类的蚂蚁互动。

这简直是完美的例子。一个典型的程序就是这样的。有一个主对象,它创建其他所有类的对象。对象们开始彼此互动以及与程序的“外部世界”互动。在这些对象内部,它们的行为已被严格编程。

这两个解释是同一枚硬币的两面。真相在中间。第一个例子(关于图纸和船)展示了类与这些类的对象之间的联系。这个类比非常强烈。第二个例子(关于蚁巢)展示了在程序运行期间存在的对象之间,以及已编写的类之间的联系。

首先你需要为程序中的所有对象编写类,然后描述它们的互动。听起来有点复杂,但其实比看起来简单得多。

在JavaScript中,程序运行时的所有实体都是对象,而编写程序就是描述对象互动的不同方式。对象只是调用彼此的方法并传递所需的数据。

文档

那么如何知道要传递什么数据到方法中呢?其实这些已经有人帮你想好了。

通常每个类都有一个描述,告诉你它的作用。同样,每个公开方法也通常有一个描述:它做什么,需要传递什么数据。

要使用一个类,你需要大致知道它的作用。而且你需要准确知道它的每个方法的作用。绝对没必要知道它是如何实现的。就当是个魔法棒吧。

我们来看看代码——复制文件:

JavaScript
    
      const fs = require('fs');

      // 打开文件
      const src = fs.createReadStream('source.txt');
      const dst = fs.createWriteStream('destination.txt');

      // 复制内容从source.txt到destination.txt
      src.pipe(dst);

      // 完成复制后关闭文件
      src.on('end', () => {
        src.close();
        dst.close();
      });
    
  

如果逐行阅读这段代码,大致可以猜出它的功能。不过这需要经验和实践。所以过一段时间,这段代码对你来说会变得熟悉和容易理解。

1.2. 程序设计

设计程序是一门艺术。这既简单又复杂。简单,因为没有严格的法律:凡是没有被禁止的都是允许的。但也复杂,正是因为如此:实现某件事的方法很多,不容易找到最佳方案。

设计程序就像写一本书。一方面,你只是在写字母、单词、句子。另一方面,情节、角色性格、内部矛盾、冲突、叙述风格、悬念等等都很重要。

最重要的是,明白你在为谁写代码。而你写的代码是给其他程序员看的

开发任何产品都涉及到做出改变:这里添加,那里删除,这里改造。通过这些小的迭代,诞生了大、中、小的项目。

代码的主要要求是对其他程序员来说是可理解的错误的,但可理解的代码可以被修正正确但不可理解的代码无法改进。它只能被废弃。

那怎么写出好的且易懂的代码呢?

为此需要做三件事:

  • 在方法内部写出好的和易懂的代码——这最简单
  • 决定程序中应该有哪些实体
  • 正确地将程序划分为逻辑部分

这些概念背后是什么?

在方法内部写出好的代码

如果你的英语水平至少是初级,你可能会注意到有时候代码读起来像英语句子一样容易:

  • class Cat extends Pet — 类Cat继承类Pet
  • while (stream) — 当流不为空...
  • a < b ? a : b — 如果a小于b,返回a,否则返回b

这是故意这样设计的。JavaScript是少数几个可以轻松编写自我文档化代码的语言之一:代码无需注释就可以理解。在好的JavaScript代码中,许多方法读起来就像英语句子。

你的任务是,写代码时也要让它尽可能简单和简洁。只要考虑你的代码有多容易阅读,你就会朝正确的方向前进。

在JavaScript中,写易于阅读的代码是惯例。最好每个方法的完整代码都能显示在屏幕上(方法长度—20-30行)。这是JavaScript社区的规范。如果代码可以改进,就该改进它

学习写出好代码的最佳方法是不断实践。写大量代码,学习他人的代码,向更有经验的同事寻求对你代码的审查。记住,当你对自己说“这样就行了”的时候,你的发展就停止了。

决定程序中应该有哪些实体

你需要写出其他程序员能理解的代码。如果10个程序员中有9个在设计程序时会创建类A、B和C,那么你也应该在你的程序中创建类A、B和C。你应该写出其他人能理解的代码。

优秀、可运行、快速、非标准的代码——这就是差劲的代码。

你需要研究其他项目:这是获得IT行业几十年来累积的所有智慧的最佳、最快和最简单的方法。

顺便说一句,你手头已经有一个优秀的、流行的、文档齐全的项目——React。从它开始吧。

研究类和类结构。思考为什么一些方法是静态的而另一些不是。为什么方法的参数是这样而不是其他的。为什么这些方法存在,为什么这些类被称为这样,为什么它们存在于这些包中。

当你开始理解这些问题的答案时,你就能写出其他人能理解的代码。

但我要警告你不要研究D3.js中方法内的代码。许多方法的代码被重写是为了最大化速度——其可读性令人堪忧。

正确地将程序划分为逻辑部分

通常任何程序都被分为部分或模块。每部分负责程序的某个方面。

就像电脑有机箱、显示器、键盘,它们都是独立的、相对不依赖的部分。更重要的是,它们的交互是标准化的:USB、HDMI等。因此,如果你把咖啡洒在键盘上,你可以简单地在水龙头下清洗,晾干后继续使用。

笔记本则是单体架构的例子:逻辑部分虽然存在,但集成得更紧密。对于Macbook Pro,要清理键盘你需要拆开半个笔记本。而洒在笔记本上的咖啡是一个订购新机器的理由。只是别用咖啡。

1.3 创建自己的类

你刚开始学习编程,所以你需要从小处开始——学习创建自己的类。

当然你已经创建了一些类,但你需要学习理解程序中应该有哪些类,它们应该叫什么名字,它们应该有哪些方法。以及它们之间应该如何互动。

实体列表

如果不知道从哪里开始,那就从头开始吧。

在程序设计的最开始阶段,你可以在纸上列出程序中应该有的实体(对象)。然后按照这样的原则编写:每个实体就是一个独立的类。

示例

假设你想设计一个国际象棋游戏。你需要这样的实体:棋盘和6种棋子。棋子移动方式不同,价值不同——逻辑上这应该是独立的类。而且,一开始,类越多越好。

遇到一个新手程序员,他写了10个类而不是两个——这种情况很罕见。但写两个或一个类而不是十个——这是新手喜欢做的。所以请多写些类,程序员朋友们。这样你们的代码就会变得更容易被理解,可能除了你自己 😛

国际象棋

假设我们决定为国际象棋写类:这些类会是什么样的呢?

棋盘就是一个8x8的数组?最好为它创建一个独立的类,在内部保存对数组的引用。这样你就可以在“棋盘”类中添加许多有用的方法,比如检查一个格子是空还是占用。

总之,一开始总可以遵循这样的原则:程序具有不同的实体,而实体具有类型。这个类型就是类。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION