【问题标题】:What does really mean Single Responsibility单一职责的真正含义是什么
【发布时间】:2022-10-12 21:28:36
【问题描述】:

我正在学习 SOLID 原则。我读了很多关于单一责任原则的东西,但我并不完全明白。我将举例说明我想说什么。

假设我们有一个用于管理文章的文章服务。我应该如何设计单一职责的文章服务。

是这样的:

class ArticleService{

  create(){};  
  read(){};
  update(){};
  delete(){};

}

或者为每个操作创建一个类:

class ArticleCreateService{

  create(){};

}

class ArticleReadService{

  read(){};

}

// and so on ...

根据单一职责管理文章的最佳方式是什么?

谢谢。

【问题讨论】:

  • 你的第一种方法更好。职责是“管理数据存储中的文章”。
  • @RobertHarvey我两者都做过,但我真的不能肯定地说。消费者仍然会看到 ArticleService,因为他们可能希望以多种方式与之交互。他们可能会删除并重新加载最新状态的数据。然而,为了可维护性这实际上可能在几个子模块中。当操作开始变得更复杂时,(例如,删除通过预检查,也通过相关数据级联,甚至可能发出通知消息)其余代码不需要处理,因此可以分离进入自己的模块。
  • 永远不要期望你在所有代码中 100% 使用它的原则,平衡为王,尤其是性能代码和可读/严格的原则标准代码之间的平衡

标签: javascript oop design-patterns software-design solid-principles


【解决方案1】:

实心的 S 代表一个类或方法应该只有一个改变的理由。这意味着一个类、模块或方法应该有一个明确定义的职责。

在这种特殊情况下,您可能希望(无论出于何种原因)扩展读取或写入等功能,例如从/向不同来源读取和写入。因此,将这些职责分别放在一个类中,将更容易扩展,即:

读取类 -> 仅读取数据 -> 然后可以使用更多方法扩展该类,例如 readFromExcel 或 readFromDB。阅读是一项单一的责任。在该类中,每个方法都可以具有该一项职责的单独领域,即 readFromExcel 仅具有一项职责,即仅 readFromExcel。

class Read {
readFromExcel();
readFromDB();

}

一个好的经验法则是:我的班级有一个单一的职责吗?那是什么责任?我的方法和类可以在不失去单一职责的情况下扩展吗?在上面的示例中,类 read 具有仅读取数据的 (S) 单一职责,并且在其中方法 readFromDB();只从数据库中读取文件。

【讨论】:

    【解决方案2】:

    As Robert C. Martin (Uncle Bob) says about Single Responsibility Principle:

    改变班级的理由不应该不止一个

    因此,您的第一个选择最好遵守单一责任原则:

    class ArticleService {
        create(){};  
        read(){};
        update(){};
        delete(){};
    }
    

    当您想要编辑 ArticleService 时,编辑此类只有一个原因。而这个原因是编辑Article

    第二个版本看起来像Interface Segregation principle。但是,它应该稍作修改。

    class ArticleCreateService
    {
        void Create() { }
    }
    
    class ArticleReadService
    {
        void Read() { }
    }
    

    首先,我们需要隔离类的方法。我们可以通过Create()Read() 方法进行隔离。 所以让我们创建这些接口:

    public interface IReadable
    {
        void Read();
    }
    
    public interface ICreatable
    {
        void Create();
    }
    

    ArticleService 的修改版本可能如下所示:

    public class ArticleService : IReadable, ICreatable
    // public class ArticleService implements IReadable, ICreatable // in TypeScript
    {
        public void Read()
        {
            throw new NotImplementedException();
        }
    
        void ICreatable.Create()
        {
            throw new NotImplementedException();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-24
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 2012-03-30
      • 2011-10-10
      • 2012-08-03
      • 2012-01-30
      相关资源
      最近更新 更多