面向对象和函数式编程的基本概述

从Ruby切换到Javascript对我来说是一个令人讨厌的过渡。 我认为我之所以在学习Javascript基础的最初几天中苦苦挣扎的部分原因是,因为许多关注点已经从诸如类和继承之类的面向对象的概念转移到了专注于利用Javascript的功能多样性的概念,例如一等和高阶函数。 有鉴于此,我认为探索过去几周我们一直在使用的两种编程范例的基础知识以及某些利弊是有用的。

面向对象编程的基本原理

表征OOP的一些主要功能是:封装,继承和多态。

关于OOP的封装通常涉及两个概念:首先,一个可以限制对与对象有关的某些类型的数据的访问,其次,可以将数据与操作该数据的函数“捆绑”在一起。 例如,与“ Person”类有关的数据可以与该类上的类方法捆绑在一起,例如Person.name,Person.age等。

继承是新对象可以采用现有对象的属性的想法。 创建“父”类可以使您将来可能创建的所有“子”类都可以访问您在父类中定义的方法。

多态是一种想法,即子类具有重新定义从父类继承的方法/功能的能力。 这意味着即使一个函数的名称与在父类中被调用的名称相同,它也可能做不到相同的事情。

OOP的优点

  1. 它可以帮助您保持代码干燥。 继承使您不必一遍又一遍地编写相同的代码
  2. 它可以很容易地读/写。 具有明确定义的类和合理组织的继承链可以使您更轻松地重构代码,并使其他人更容易理解代码库中的某些类是负责什么的。
  3. 它可以帮助保持代码模块化。 将代码组织到类和子类中会促进一种设计原则,即关注点分离,这表明在设计程序时,应以这样的方式组织代码:每个部分都应解决程序功能的一个方面。 这使您的代码库更易于维护,重构和构建。 这种设计模式在概念上类似于“单一职责原则”,后者在Mod 1中作为组织类逻辑的技术进行了讨论。

OOP的缺点

  1. 如果您对组织类和管理继承的方式不谨慎和刻意,则您的代码很快就会变得难以维护,并且很容易中断。 对父方法的一小处更改可能会产生连锁反应,从而可能在无数意外地方破坏您的代码。

2.组织不良的OO代码会导致很多共享状态问题,因为许多对象可能正在与同一数据进行交互。 这可能会导致您应用中的一个重大缺陷,称为“竞赛条件”。 当两个执行线程试图同时更改同一数据时,就会发生竞争状况,这显然会导致代码中出现各种意外的副作用。

函数式编程的基本原理

正如我们最近在讲座中所讨论的那样,函数式编程是关于编写代码的:避免共享状态,更改数据并控制函数的输出。 与OO编程中的封装概念不同,功能编程将数据与功能分开,从而使输入/输出受到控制并且更加可预测。

函数式编程的优点

  1. 知道给定特定输入后函数将输出的内容,可以更轻松地判断函数何时不应该以应有的方式运行。
  2. 避免共享状态问题可以使并发问题的处理变得更加容易(例如前面提到的竞争条件)。
  3. 通过避免由于OOP中的粗心继承而引起的连锁反应,它可以使您的代码不那么“脆弱”,并且更具伸缩性。

函数式编程的缺点

  1. 与OOP相比,函数式编程可能难以阅读,特别是如果您将太多逻辑封装到单个函数中。
  2. 组合几个不同的功能会很快变得非常混乱。
  3. 对于许多人来说,由于诸如高度强调不变性之类的概念,因此函数式编程是不直观的,因此难以读写。

结论

在阅读这篇文章后,我希望人们留下一些重要的收获,那就是这些是编程范例,而不是固定的法律。 就像语言可以被视为开发人员工具箱中的工具一样,面向对象的编程和函数式编程也可以以相同的方式来考虑。 一种情况会比另一种更有意义,反之亦然,最重要的是要在必要时灵活切换。 同样,这两种风格都不是编写不良推理/组织代码的灵丹妙药,无论您选择使用哪种编程范例编写代码,都很难扩展和维护。