关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。
27天前关门了。
改进这个问题
我正在学习robertmartin的书cleancode和clearchitecture。我正在研究单一责任原则,对此很困惑。
srp是面向对象设计的基本规则之一。
我研究了他的博客,并让我从那篇文章中添加一些上下文。
博客参考:https://blog.cleancoder.com/uncle-bob/2014/05/08/singlereponsibilityprinciple.html
它指出:
一个类应该有一个改变的理由。鲍勃叔叔举了一个例子:
public class Employee {
public Money calculatePay();
public void save();
public String reportHours();
}
These methods are called from different type of users(Actors).
calculatePay required by CFO.
reportHours required by COO.
save required by CTO
他进一步补充说,它打破了srp(根据我的理解)。
他的陈述是:
在编写软件模块时,您希望确保在请求更改时,这些更改只能来自单个人员,或者更确切地说,来自表示单个狭义定义的业务功能的单个紧密耦合的人员组。
在我回忆起面向对象的设计定义之前,我觉得一切都很好:
对象具有成员/字段和行为/函数。
事实上,让我引用干净代码章节“对象和数据结构”中的对象定义:
对象将其数据隐藏在抽象后面,并公开对该数据进行操作的函数。
对于上面的语句,让我创建一个示例。
class User{
private Integer id;
private String name;
private String email;
private String password;
private Boolean isActive;
// Constructor
// Only User can update password
public updatePassword(String newPassword, String oldPassword);
// Only Admin can de-activate the user.
public void deactivate();
// Admin and User both can update other fields like name, email, etc.
public void update();
}
上面的例子遵循面向对象的设计,但是它违反了srp,因为类有不同的参与者。
如果我在本例中尝试遵循srp,那么我会考虑创建不同的类,比如deactivateuser/adminactiononuser或updateuserpassword(类名应该是noun,但我找不到任何其他合适的名称)。
问题是用户类将通过getter/setter或public access修饰符公开其成员。而且,这些类可能非常小,比如只包含一个函数,这可能会导致主类有很多依赖关系。
我的问题是:
1). 我的理解正确吗?
If no, can you please explain the right definition?
If yes, How can we call SRP one of the basic rules of OOP?
2). 我们如何编写遵循oop和srp的代码?
请同时提供解决问题的方法,如用户示例?
1条答案
按热度按时间mrfwxfqh1#
首先,我强烈建议进一步研究oop和java的核心原理。i、 e.你从不给一个类命名,比如“deactivateuser”,它表示行为。类具有属性和方法,因此该类应命名为“admin”,后者具有停用用户配置文件的方法(=行为)。
srp与类没有直接关系(显然,在设计面向对象模型时,不应该将用户和管理员混合在一起),而更多地与方法/函数相关。一个函数应该执行一个任务。内部的逻辑可能很复杂,但方法的名称应该表明其职责。i、 有一个函数可以传递int值数组的中值。但是您应该避免使用一个函数来计算中间值并将其与此数组中的最大值一起返回。
最后一个提示:为了使对象能够处理其他类的对象上的操作,可以使用依赖注入,它允许在复杂的软件体系结构中进行松散耦合。