单一职责原则
A. 结构化设计方法强调高内聚低耦合,OO强调类的责任单一,这些设计原则共同追求的NFR 是什么
网络粘过来的,你看看:
基本解释
高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
高内聚
内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。 所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
低耦合
耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。) 对于低耦合,粗浅的理解是: 一个完整的系统,模块与模块之间,尽可能的使其独立存在。 也就是说,让每个模块,尽可能的独立完成某个特定的子功能。 模块与模块之间的接口,尽量的少而简单。 如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。 这样有利于修改和组合。[1]
编辑本段为什么要追求高内聚和低耦合
软件架构设计的目的简单说就是在保持软件内在联系的前提下,分解软件系统,降低软件系统开发的复杂性,而分解软件系统的基本方法无外乎分层和分割。但是在保持软件内在联系的前提下,如何分层分割系统,分层分割到什么样的粒度,并不是一件容易的事,这方面有各种各样的分解方法,比如:关注点分离,面向方面,面向对象,面向接口,面向服务,依赖注入,以及各种各样的设计原则等,而所有这些方法都基于高内聚,低耦合的原则。 高内聚和低耦合是相互矛盾的,分解粒度越粗的系统耦合性越低,分解粒度越细的系统内聚性越高,过度低耦合的软件系统,软件模块内部不可能高内聚,而过度高内聚的软件模块之间必然是高度依赖的,因此如何兼顾高内聚和低耦合是软件架构师功力的体现。 高内聚,低耦合的系统有什么好处呢?事实上,短期来看,并没有很明显的好处,甚至短期内会影响系统的开发进度,因为高内聚,低耦合的系统对开发设计人员提出了更高的要求。高内聚,低耦合的好处体现在系统持续发展的过程中,高内聚,低耦合的系统具有更好的重用性,维护性,扩展性,可以更高效的完成系统的维护开发,持续的支持业务的发展,而不会成为业务发展的障碍。[2]
B. PHP面向对象编程——单一职责原则(SRP)是什么
简单的模板引擎来说明一下PHP面向对象编程中单一职责原则的应用和作用
原文地址: http://www.chhua.com/web-note1121
C. ocp原则蕴含了单一职责原则 吗
单一职责原则
对于单一职责原则,其核心思想为:一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而大大损伤其内聚性和耦合度。通常意义下的单一职责,就是指只有一种单一功能,不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。
专注,是一个人优良的品质;同样的,单一也是一个类的优良设计。交杂不清的职责将使得代码看起来特别别扭牵一发而动全身,有失美感和必然导致丑陋的系统错误风险。
D. Java 设计模式,“单一职责原则”中说“每一个类只负责一项任务”。那么...
一些小职责可以用内部类,static class A{} ,源文件不须太多
设计也是对已经存在的问题进行分类,而不在抽象上做不实际的细分吧..
至于类多,可以参考一派的观点OOP是有残疾的,纯OO经常导致画蛇添足...代码量翻倍
退回到过程和对象混用...尽量少分类,多用函数式纯函数,
现在的python就持这类理念
E. 《单一职责准则》与《接口隔离原则》有什么区别
接口隔离原则表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中的方法分组,然后用多个接口代替它,每个接口服务于一个子模块。
接口隔离原则
不应该强迫客户端依赖于他们不会使用的接口。
实例
下面是一个违反了接口隔离原则的例子。我们使用Manager类代表一个管理工人的管理者。有两种类型的工人:普通的和高效的,这两种工人都需要吃午饭。现在来了一批机器人,它们同样为公司工作,但是他们不需要吃午饭。一方面Robot类需要实现IWoker接口,因为他们要工作,另一方面,它们又不需要实现IWorker接口,因为它们不需要吃饭。
在这种情况下IWorker就被认为是一个被污染了的接口。
如果我们保持现在的设计,那么Robot类将被迫实现eat()方法,我们可以写一个哑类它什么也不做(比如说它只用一秒钟的时间吃午饭),但是这会对程序造成不可预料的结果(例如管理者看到的报表中显示被带走的午餐多于实际的人数)。
根据接口隔离原则,一个灵活的设计不应该包含被污染的接口。对于我们的例子来说,我们应该把IWorker分离成2个接口。
3. interface IWorker {
4. public void work();
5.
6. public void eat();
7. }
8.
9. class Worker implements IWorker {
10. public void work() {
11. // ....working
12. }
13.
14. public void eat() {
15. // ...... eating in launch break
16. }
17. }
18.
19. class SuperWorker implements IWorker{
20. public void work() {
21. //.... working much more
22. }
23.
24. public void eat() {
25. //.... eating in launch break
26. }
27. }
28.
29. class Manager {
30. IWorker worker;
31.
32. public void setWorker(IWorker w) {
33. worker=w;
34. }
35.
36. public void manage() {
37. worker.work();
38. }
39. }
// interface segregation principle - bad example
interface IWorker {
public void work();
public void eat();
}
class Worker implements IWorker {
public void work() {
// ....working
}
public void eat() {
// ...... eating in launch break
}
}
class SuperWorker implements IWorker{
public void work() {
//.... working much more
}
public void eat() {
//.... eating in launch break
}
}
class Manager {
IWorker worker;
public void setWorker(IWorker w) {
worker=w;
}
public void manage() {
worker.work();
}
}
下面是遵循接口隔离原则的代码。通过把IWorker分离成两个接口,Robot类不需要再被强迫实现eat()方法。如果我们需要为Robot类添加其他的功能,例如重新充电,我们可以创建一个新的IRechargeable接口,其中包含一个重新充电的方法recharge。
Java代码 复制代码
1. //interface segregation principle - good example
2.
3. interface IWorkable {
4. public void work();
5. }
6.
7. interface IFeedable{
8. public void eat();
9. }
10.
11. class Worker implements IWorkable, IFeedable {
12. public void work() {
13. // ....working
14. }
15.
16. public void eat() {
17. //.... eating in launch break
18. }
19. }
20.
21. class SuperWorker implements IWorkable, IFeedable{
22. public void work() {
23. //.... working much more
24. }
25.
26. public void eat() {
27. //.... eating in launch break
28. }
29. }
30.
31. class Robot implements IWorkable{
32. public void work() {
33. // ....working
34. }
35. }
36.
37. class Manager {
38. IWorkable worker;
39.
40. public void setWorker(IWorkable w) {
41. worker = w;
42. }
43.
44. public void manage() {
45. worker.work();
46. }
47. }
//interface segregation principle - good example
interface IWorkable {
public void work();
}
interface IFeedable{
public void eat();
}
class Worker implements IWorkable, IFeedable {
public void work() {
// ....working
}
public void eat() {
//.... eating in launch break
}
}
class SuperWorker implements IWorkable, IFeedable{
public void work() {
//.... working much more
}
public void eat() {
//.... eating in launch break
}
}
class Robot implements IWorkable{
public void work() {
// ....working
}
}
class Manager {
IWorkable worker;
public void setWorker(IWorkable w) {
worker = w;
}
public void manage() {
worker.work();
}
}
总结
如果已经设计成了胖接口,可以使用适配器模式隔离它。
像其他设计原则一样,接口隔离原则需要额外的时间和努力,并且会增加代码的复杂性,但是可以产生更灵活的设计。如果我们过度的使用它将会产生大量的包含单一方法的接口,所以需要根据经验并且识别出那些将来需要扩展的代码来使用它。