如何使用对象封装保持代码整洁

全局变量可能看起来很简单,但它们常常是导致这么多错误的原因。下面介绍如何通过封装简化代码。...

封装意味着将某些东西隔离开来。如果你把东西放进胶囊里,外界就无法接近它。封装是面向对象编程中的一个重要概念,因为它有助于保持复杂代码的可管理性。

a red and blue pill on a blue background

你为什么要上课

假设你有一个宠物动物园应用程序,它有数十万行代码。现在假设有一个非常重要的对象,它是整个应用程序的中心,称为animal。如果程序的每一个部分都是动物,都能访问并改变这个对象呢?

不受限制的访问会造成很多混乱。如果小猪使用动物来定义其参数,那么动物将具有小猪属性。现在,假设一只山羊决定用动物来定义它的参数。

在JavaScript/TypeScript中,如下所示:

var animal = {name: "piglet", legs: 4, color: "pink", decoration: "snout"}animal.name = "goat"animal.decoration = "horns"

下一件事你知道,你有粉红色的山羊和有角的小猪。在TypeScript沙盒中查看正在运行的代码,然后单击run查看控制台输出。

如果你正在学习编程,除了创建一个宠物动物园外,还想获得灵感,那么这里还有10个项目可以激励你。

因为你的代码库是如此巨大,它可能需要数百个小时才能找到代码,给你的羔羊骆驼脖子和你的小鸭羊毛。一旦你发现有问题的代码,你将不得不写更多的意大利面代码,以防止对象相互干扰。一定有更好的办法。

解决重叠问题的方法是用类定义对象。代码的任何部分都可以基于类定义创建对象。创建唯一的对象称为实例化。它保证创建的每个对象都有自己的属性。这些物体不会意外地相互干扰。

类还不够;对象变量也需要封装

所以我们决定每种动物都需要自己的目标。让我们创建一个类来定义我们的动物。

class Animal { name: string; legs: number; color: string; decoration: string; c***tructor(name: string, legs: number, color: string, decoration: string) { this.name = name; this.legs = legs; this.color = color; this.decoration = decoration; }}

接下来,让我们创建几个动物对象。

let babyDuck = new Animal("baby duck", 2, "yellow", "beak");let bunny = new Animal("bunny", 4, "gray", "floppy ears");

到目前为止一直在玩代码。

现在我们可以添加我们想要的所有动物而不需要任何奇怪的突变。或者我们可以?

a gray and white bunny in a grassy field

如果有一天晚上,一个疲惫不堪的程序员编写了一些代码来编辑这个令人毛骨悚然的应用程序中的一只动物,但是他们错了编辑了兔子,会发生什么呢?

bunny.color = "black";bunny.legs = 8;

蜘蛛兔不酷,伙计!这和我们没有将代码封装到对象中一样糟糕。让我们确保不再发生这种事。

我们需要做的第一件事是使我们的对象私有化。这意味着没有任何东西可以在创建变量之后直接编辑它们。下面的代码显示更改私有变量会产生错误。

不过,变量确实需要可变。这就是能手和二传手的用武之地。

getter和setter是以受控方式访问和更改变量的函数。设置程序可以对更改的数据设置限制。而且getter可以改变检索到的数据。

这就是我们的类使用get和set函数来控制腿数的样子。

class Animal { private _name: string; private _legs: number; private _color: string; private _decoration: string; c***tructor(name: string, legs: number, color: string, decoration: string) { this._name = name; this._legs = legs; this._color = color; this._decoration = decoration; } get legs() { return this._legs; } set legs(legCount: number) { if(legCount > 1 && legCount < 5) { this._legs = legCount; } }}

学习封装和避免全局变量

这是最后的代码。重述所学内容以确保理解:

  • 为其余变量添加getter和setter。
  • 返回动物名称作为span标记:<span>llama</span>
  • 更改装饰变量以允许多个装饰。创建适当的getter和setter来反映这种变化。

如果你想让你的代码像一台运行良好的机器,你绝对需要使用封装。不惜一切代价避免全局变量。如果确实需要在对象之间共享变量,可以查看TypeScript文档,了解如何创建类/静态变量。

  • 发表于 2021-03-30 05:01
  • 阅读 ( 272 )
  • 分类:编程

你可能感兴趣的文章

什么是面向对象编程?用外行术语解释的基础知识

... 仅仅因为你想使用一些东西并不意味着你需要知道它是如何工作的。例如,浓缩咖啡机就很复杂。但你不需要知道它是怎么工作的。你只需要知道,当你开始时,你会得到浓缩咖啡。 ...

  • 发布于 2021-03-24 11:07
  • 阅读 ( 204 )

如何在python中创建简单类

在面向对象语言中,类是一段可扩展的代码,表示用于创建和使用该类对象的模板。类的对象只是引用所定义类的实例。 ...

  • 发布于 2021-03-26 20:18
  • 阅读 ( 248 )

保持代码整洁美观

...一个无关紧要的问题,但它会影响代码的质量和正确性、如何控制版本以及如何与他人协作。但是,如果你不想陷入每一个大括号的细节中,那么可以尝试将问题外包给开源工具Prettier。 ...

  • 发布于 2021-03-28 23:47
  • 阅读 ( 221 )

面向对象编程中抽象的初学者指南

...是全部。只要函数返回正确的数据,就不需要知道对象是如何工作的。以下是JavaScript/Typescript中的墨西哥煎饼: ...

  • 发布于 2021-03-30 04:01
  • 阅读 ( 254 )

物体(objects)和班级(classes)的区别

对象与类 面向对象编程语言使用对象和类。C++、.NET、java等都是面向对象的编程语言,它们使用对象和类。 在编程语言中,对象被描述为一个单元,通过使用命令可以使用它。对象的示例有:变量、函数、值和数据结构。在面...

  • 发布于 2021-06-23 17:37
  • 阅读 ( 230 )

抽象(abstraction)和封装(encapsulation)的区别

...不是无线的等等。每一个细节都描述了鼠标,但不管细节如何,它只是一个鼠标。您只需要一个接口来使用鼠标,在本例中是鼠标指针。这是封装。 抽象和封装的区别 虽然这两个概念都是面向对象的基本概念,在技术上是不可...

  • 发布于 2021-06-25 03:41
  • 阅读 ( 715 )

建造师(constructor)和方法(method)的区别

...组成。在类中定义的变量称为实例变量。方法是一组确定如何使用类的数据的代码。它更像是一个作用于数据并返回值的子程序。构造函数与方法非常相似,只是在创建对象实例时调用它。本文解释了两者的区别。 什么是java...

  • 发布于 2021-06-25 08:37
  • 阅读 ( 427 )

作文(composition)和继承(inheritance)的区别

...的方法。它是在OOP中实现代码重用的最强大的工具之一。使用继承时,可以通过与现有类建立父子关系来创建新类。对象组合是类继承的替代方法。在另一个对象中使用一个对象称为合成。在许多情况下,您可能希望将对象用作...

  • 发布于 2021-06-26 02:18
  • 阅读 ( 232 )

数据抽象(data abstraction)和封装(encapsulation)的区别

...(OOP)有助于将真实世界的场景建模到软件中。它是一种使用类和对象设计程序的范例或方法。类是创建对象的蓝图。换句话说,它是一个创建对象的结构。它由属性和方法组成。属性描述属性或数据,方法描述操作或行为。没...

  • 发布于 2021-06-30 17:01
  • 阅读 ( 1212 )

哦(oop)和流行音乐(pop)的区别

...。POP将程序分为多个函数。很难对代码进行修改,也很难使用POP对真实场景进行建模。OOP的引入克服了POP的局限性。 覆盖的关键领域 1.什么是OOP–定义,特点2.什么是POP–定义,特点3.OOP和POP的区别–主要区别比较 关键术语 抽...

  • 发布于 2021-07-01 00:03
  • 阅读 ( 303 )
6gK0nN64C
6gK0nN64C

0 篇文章

相关推荐