2014-11-02 39 views
2

尽管使用了Google,我找不到明确的答案来解决我的疑问。单一责任原则和知识库

我想尽可能地应用“固体”,并尝试使用常识,并避免模式,当我看到模式创造更多的问题比它试图解决。我不想应用模式,并使对于其他人使用我的代码只是为了“我写模式”,如果你明白我的意思,就难以做到了。

现在我正在努力应对我认为最容易掌握的原理之一“SRP”

你如何实际应用这些原则到知识库?

让我们假设我有一个

  1. IEmployeeRepository
  2. IUserRepository
  3. IProductRepository

和通常他们将有类似的论文

public interface IUserRepository 
{ 
    User GetUser(int id); 
    IEnumerable<User> GetAllUser(); 
    void DeleteUser(int id); 
} 

同为EMP方法loyees和产品。

我们是不是说每个方法都应该是一个类?即使有时我们正在谈论一行代码?

任何地方的任何建议或示例应用程序将不胜感激。

千恩万谢

+0

可能在这里更好:http://programmers.stackexchange.com/ – jessehouwing 2014-11-02 17:37:07

回答

2

如果你有一个很难搞清楚的单一责任模式的限制,那么你可以代替去寻找的不使用SRP类明显的例子。例如,一个为用户实现业务规则的类,以及配置用户数据库的备份的方式,另外还有一些特殊的日志记录,因为它是一个非常整洁的黑客攻击,因此它公开公开的文件。你一定要避免这种情况。

您似乎能够一路应用SRP的原因之一,以便每个方法可以在一个单独的类中,可能是因为您有一个贫血域模型。也许你的应用程序只是在数据库之上暴露CRUD操作,并且你的应用程序中没有实现真正的业务规则?

在任何情况下,它都没有应用SRP将UserRepository划分为每种方法的类,但是您甚至可以得到这个想法可能是UserRepository在您的体系结构中没有任何目的。

1

对于基本的CRUD操作,它的共同使用一个通用存储库:

public interface IRepository<T> 
{ 
    T Get(int id); 
    IEnumerable<T> GetAll(); 
    T Update(T item) 
    void Delete(int id); 
} 

或相似。然后你的具体实现可以从一个基地继承。

+0

您好,我其实有一个通用的存储库,但仍不能以某种方式回答问题 – developer9969 2014-11-02 18:31:25

0

我想说这取决于您在哪里设置“单一职责”的范围。在我看来,你可以说:

  • 每个存储库都有单一的责任来管理只有一种类型的实体。这意味着您的UserRepository中的所有方法都应与User实体相关,但不与其他方法(如产品)相关。这意味着您的UserRepository中不应该有任何方法,如GetProducts或类似的东西。

  • 存储库中的每个方法也应该有其唯一的责任。这意味着每个方法只能处理一个特定的情况(如创建,删除等)。

这样一来,你仍然会履行SRP原则(根据其周围上下文),而不必创建为每个函数的类(这似乎是在我看来有点大材小用)。