龙空技术网

通过 Javascript 理解单一职责原则

木偶网志 108

前言:

此刻看官们对“js职责链”大体比较关心,兄弟们都需要了解一些“js职责链”的相关知识。那么小编在网上网罗了一些对于“js职责链””的相关文章,希望各位老铁们能喜欢,朋友们一起来学习一下吧!

我相信很多人不知道设计软件中的 SOLID 原则是什么?下面是关于编程语言中单一责任原则 (SRP) 的一些事情。我使用 Javascript 编写示例代码。希望,您可以从我的帖子中得到一些东西。

1、什么是单一职责原则——SRP?

SRP 是一种软件设计原则,规定一个类、对象或模块等必须只有一个责任,并且只有一个更改原因。

换句话说,一个类或模块应该只有一个主要目的。所有方法和属性都应该与该职责相关。

它有助于降低模块或类之间的复杂性或耦合。使代码更易于理解、阅读或维护,并使其更易于重用。

SRP 是面向对象设计的 SOLID 原则的一部分。

SRP 于 2003 年在 Robert C. Martin(著名软件工程师)作者的《敏捷软件开发、原则、模式和实践》一书中首次提出。

2、为什么需要单一职责原则?

我们思考下,为什么在设计系统时需要遵循这个原则?根据我的经验,我正在做很多项目。一个项目只有几个人,而一个大项目有20个或更多的人一起工作。在那种情况下,我们将遇到有关可扩展的、复杂的业务需求、维护、修复错误的问题,即在这种情况下,原则是强大的控制系统结构以确保每个齿轮在大型机器中平稳工作.这就是为什么我们谈论一个原则——SRP。以下是我们在 SRP 中需要遵循的几个重要原因:

• 鼓励模块化:通过使每个模块或组件具有单一用途。系统更容易理解、阅读或维护,修复错误而不影响或影响系统的其他部分。• 提高可维护性:因为每个模块都有单一的职责,所以只有一个改变的理由,使得模块对系统其他部分的影响更小。• 促进可重用性:模块只有一个用途,因此更容易重用。因为它们只专注于特定的任务,没有任何耦合或复杂性依赖。• 减少耦合:如果模块或组件有很多依赖关系。它使应用程序更难更改或替换。因此,尽可能保持模块简单。3、 我们什么时候使用单一职责原则?

每当我们设计或重构软件组件或模块时,都可以应用 SRP。它在面向对象编程中很有用,其中类是系统的主要构建块。我们可以在以下场景中使用 SRP:

1、设计新模块:通过创建一个新模块,我们应该考虑确保它有一个单一的目的来做一件事——定义明确的责任。

2、当我们在重构已有模块的时候。考虑模块耦合依赖的复杂性。如果模块有 2 个以上的用途。我们应该将它们分解成具有明确职责且不与其他模块重叠的小模块。

3、设计软件架构:当我们设计软件系统的架构时。我们可以使用 SRP 来确保每个模块都有明确的职责,并且不会与其他模块重叠。

4、编写测试:编写测试是软件开发的一部分。我们可以使用 SRP 来确保每个测试都集中在模块逻辑或行为的一个方面。

4、 Javascript 示例代码。

我们看下面的例子:

function Question(questions) {  this.questions = questions;  this.printReport = () => {    console.log("Printer called");    console.log("3th party printer function called");  };  this.saveDatabase = (questions) => {    console.log({questions});    console.log(`Saved to database`);  };  this.remove = (question) => {    console.log("removed question " + question);    this.questions = this.questions.filter(q => q !== question);    this.saveDatabase(this.questions);  }  this.add = (question) => {    console.log("added " + question);    this.questions.push(question);        this.saveDatabase(this.questions);  }}const q = new Question([  "Question 1",  "Question 2",  "Question 3",  "Question 4"]);q.remove("Question 1");q.printReport();q.add("Question 5");q.printReport();

Question 对象的目的是将问题处理为保存、列出、删除问题以及打印。在这个方法中,问题出在printReport、saveDatabase、remove函数,还有系统的机制日志——console.log。

在这种情况下,我们将方法 saveDatabase 从 Postgres 更改为 MongoDB,因此我们将更改对象引用的所有功能以保存数据方法。 printReport 、 remove 和 console.log 是一样的。

现在,看看下面的新代码:

function printer(data) {    console.log("3th party function called");  log(`[${new Date().toLocaleString()}]--------------------------------`);  log(data, "info");}function log(message, type = "log") {  console?.[type](message);}function saveDatabase(data) {  log({data}, "info");  log(`Saved data to database`, "info");}function Question(questions) {  this.questions = questions;  this.printReport = () => {    printer(this.questions);  };  this.remove = (question) => {    log("removed question " + question);    this.questions = this.questions.filter(q => q !== question);    saveDatabase(this.questions);  }  this.add = (question) => {    log("added " + question);    this.questions.push(question);        saveDatabase(this.questions);  }}const q = new Question([    "Question 1",    "Question 2",    "Question 3",    "Question 4"]);q.remove("Question 1");q.printReport();q.add("Question 5");q.printReport();

printReport 、 saveDatabase 、 log 函数移动到其他对象,实现 remove 方法。所以现在每个函数只做一件事。如果每个函数都改变了逻辑,我们只去这个函数,根据另一个需求做/改变逻辑,而不修改其他使用它们的函数,防止意外的错误。

概括

有一些与单一职责原则(SRP)相关的重要关键字:

1、责任:责任明确。一个模块 - 一个目的 - 一个改变的理由。

2、内聚性:使设计系统成为一个不相关的低内聚模块。

3、耦合:使模块低耦合,即模块不依赖于其他模块。

4、关注点分离:将大模块分解成小模块。每个模块由系统的一小部分解决。

5、重构:通过打破对小和平的应用。重构更容易理解、阅读和维护模块,而不会影响或影响其他模块。

.preview-wrapper pre::before { position: absolute; top: 0; right: 0; color: #ccc; text-align: center; font-size: 0.8em; padding: 5px 10px 0; line-height: 15px; height: 15px; font-weight: 600; }

标签: #js职责链