前言:
此刻看官们对“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职责链