面向对象设计中的单一职责原则强调的是不要给一个类赋予太多职责的重要性。
“开发一个满足规范的软件就跟走在水面上一样,除非是结了冰才行(或者需求冻结不变了)”——Edward V. Berard。
我们都清楚,软件开发的规格要求并不是一成不变的。你开发的软件随时都可能会发生变化。今天这个软件的确是在履行它的职责。但是这样就够了吗?你设计的软件能够拥抱变化吗(我觉得小微的人应该都懂)?
好的面向对象的设计才是关键。
好吧。我知道什么是面向对象设计,并且我也的确在项目中用到了它们。
如果你是这么想的,那么请你问自己几个问题。
1. 你的代码是可重用的吗?
2. 如果需求改变了,是否很容易能修改完成?
3. 能否在不修改代码的前提下进行扩展?
别担心。并不是你一个人会面临这些问题。我们会一块学习如何能让我们的软件在面对改变时能更具灵活性。
这个问题已经有不少人研究过了,他们得出的结论是OOD原则。
下面就是我们需要掌握的5项原则。
S = 单一职责原则
O = 开闭原则
L = 里氏替换原则
I = 接口分离原则
D = 依赖反转原则
单一职责原则:
类有且应当只有一个改变的理由。
我们来用一个现实生活中的例子来说明下这点。
想像一下你在一家印度的软件公司上班(阿三?)。你会在业余时间写点东西,编辑报纸或者完成些例行任务(写代码)。一般来说,你的生活中会有多个职责/兴趣。
当公司出现了些不好的问题,你的老板挑你的毛病,你就会变得很心烦。通常来说,福无双至,祸不单行,别的事也会一团糟。
最著名的一个例子:
codeProject.com
如果只是因为一个设备里能够实现多个特性你就会这么做吗?这样很难维护和管理。
因此这个原则告诉你的是,如果你有一个类承担了多项职责,那么你应该重新考虑下这个类,将它进行拆分。完全正确!通常我们会在函数或者方法上应用这个原则。
考虑下面这段代码:
<?php
class Student {
public $studentName = '';
public $studentRegNo = '';
// Responsibility 1
function insertStudent($aStudent) {
// Logic for inserting a student to database.
}
function selectStudent($aStudent){
//logic
}
function deleteStudent($aStudent){
//logic
}
// Responsibility 2
function generateMarkSheet($aStudent) {
//logic for generating marks.
}
}
?>
注意一下你会发现"Student"这个类有多个职责。它会处理所有的CRUD操作,同时还会为学生打印成绩单。问题就在于类中的方法是互相依赖的。
只要有一个方法变了,别的方法可能就得改变,因为它们都住在同一个家里,爸妈都是同一个。
解决方案:
类层面的单一职责:
我们将这个类拆分开来,这样每个类就都满足单一职责了。
类1:Student
类2:StudentDB
类3:StudentReport
class Student {
private $studentName = '';
private $studentRegNo = '';
public function getstudentName()
{
return $this->studentName;
}
public function setstudentName($studentName)
{
$this->studentName = $studentName;
}
}
class StudentDB {
function selectStudent($aStudent){
//logic
}
function deleteStudent($aStudent){
//logic
}
}
class StudentReport {
function generateMarkSheet($aStudent) {
//logic for generating marks.
}
}
}
方法层面的单一职责:
在方法层面的话更应该严格遵循单一职责原则,这样才能避免代码变得混乱不堪。
比如说:
public function insertStudent($aStudent){
/*
1. establish mysql connection.
2. validate aStudent object.
3. insert data to database.
}
我们可以看到insertStudent的职责是将学生数据插入到数据库中,而不是去创建数据库连接,或者说校验对象。我们可以将别的功能委托给其它的函数来完成。这样的话万一出现问题我们也方便进行调试。
原创文章转载请注明出处:
http://it.deepinmind.com
英文原文链接
分享到:
相关推荐
单一职责原则(SRP) 单一职责原则(SRP)是面向对象设计的五个基本原则之一。该原则规定,一个类应当只有一个引起它变化的原因。换言之,一个类应该只有一个职责,避免一个类承担多个职责,从而降低类的耦合度和...
本文将深入探讨这六大原则中的第一个——单一职责原则(Single Responsibility Principle, SRP),并结合AcountYear.java这个文件名来解析该原则的应用。 单一职责原则指出,一个类或者一个模块应该只有一个引起它...
单一职责原则可以使类的复杂度降低,实现什么职责都有清晰明确的定义;类的可读性提高,复杂度降低;可读性提高了,代码就更容易维护;变更(需求是肯定会变)引起的风险(包括测试的难度,以及需要测试的范围)降低...
设计模式6大原则:单一职责原则
【标题】"C#俄罗斯方块源码(单一职责原则)" 涉及到的核心知识点主要是C#编程语言以及软件设计原则中的“单一职责原则”(Single Responsibility Principle, SRP)。C#是一种广泛用于开发Windows应用程序、Web服务和...
【单一职责原则】是软件设计中的一个重要原则,它是SOLID原则的首字母S代表的含义。SOLID原则是由五个设计原则组成的,分别是:单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open-Closed ...
其中,"单一职责原则"(Single Responsibility Principle,SRP)是面向对象设计的基本原则之一,也是Java设计模式中的重要组成部分。本篇文章将深入探讨单一职责原则的概念、意义、应用及其在Java编程中的实际运用。...
在软件设计领域,单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的六大原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Code》中提出。这个原则强调一个类或者模块应当...
【单一职责原则】是软件设计中的一个重要原则,它源自于"设计模式:可复用对象的设计与模式"这本书,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者共同提出,通常被简称为SOLID原则之一。...
**单一职责原则(Single Responsibility Principle, SRP)**是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)提出,并在《敏捷软件开发:原则、模式和实践》中阐述。这一原则是SOLID原则的首...
《单一职责原则详解》 在软件工程领域,设计原则是构建高质量、可维护代码的关键指导方针。其中,“单一职责原则”(Single Responsibility Principle,SRP)是面向对象设计的五个核心原则之一,由罗伯特·C·马丁...
单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计(OOD)中的一个基本原则。它强调每个类应该只有一个改变的理由,意味着一个类应该只有一个职责,只有一个因素能引起这个类的变更。当类...
单一职责原则(SRP)是面向对象设计中的一个基本原则,它要求一个类应该只有一个引起它变化的原因。在PHP等面向对象编程语言中,遵守这一原则可以帮助开发人员编写出结构更清晰、维护性更强的代码。接下来,我们将详细...
Java设计模式中的单一职责原则(Single Responsibility Principle,SRP)是面向对象设计的基本原则之一,它的核心思想是:一个类或者一个模块应该只有一个引起它变化的原因。这意味着一个类应该只负责一项职责,使得...
图形编辑器GraphicEditor类需要遵循单一职责原则,即一个类只负责完成一个功能或职责.uml
【单一职责原则】是软件设计中的一个重要原则,它源自于面向对象设计的SOLID原则,由罗伯特·C·马丁(Robert C. Martin)提出。该原则的主要思想是,一个类或者模块应该只有一个引起其变化的原因,也就是说,类应该...
设计模式
在软件设计领域,单一职责原则(Single Responsibility Principle, SRP)是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Code》中提出。这一原则强调一个类或者模块应该有且...
单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的基本原则之一,由罗伯特·C·马丁(Robert C. Martin)在其著作《Clean Architecture》中提出。这一原则主张一个类或模块应当有且仅有一...