JavaScript中的单一责任
#javascript #solid #sharingknowledges

介绍

绝不应该有一个班级改变的原因。

这意味着每个班级或对象应该有一个责任做某事。

内容

我们查看下面的示例:

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对象的目的是处理问题作为保存,列出,删除问题和打印的问题。在这种方法中,问题是printReportsaveDatabaseremove函数以及系统的机制日志-console.log

在上下文中,我们将saveDatabase的方法从Postgres更改为MongoDB,因此我们将更改对象引用的所有函数以保存数据方法。 printReportremoveconsole.log与那样。

因此,在后来轻松维护和重新计算。 SRP的任务将应用程序分为小块,每件作品都应该有做某事的任务 - 我认为。

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

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();

printReportsaveDatabaselog函数移动到其他对象,实现remove方法。因此,现在每个功能都做一件事。如果每个功能都更改逻辑,我们只能转到此功能,并根据另一个要求进行/更改逻辑,而无需修改其他功能并防止意外的错误。

概括

单一责任原则是创建应用程序的重要原则。我们易于维护/实现,并防止系统变化的意外副作用。

谢谢您的阅读。

祝您有美好的一天ð。