OO难题在Ruby中有了新解 (原文最终修订于 2006-08-21 凌晨02:27:38)

2023-10-09 06:18

本文主要是介绍OO难题在Ruby中有了新解 (原文最终修订于 2006-08-21 凌晨02:27:38),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单一职责原则(SRP)认为,一个类应该有且只有一个改变的原由。换个说法,一个类中的方法应该出于同样的一种原由而改变,它们不应被不同原由所驱使,而导致朝着不同的方向改变。

举个例子来说,考虑一下以下的Java类:

class Employee
{
  public Money calculatePay() {...}
  public void save() {...}
  public String reportHours() {...}
}

这个类由于拥有三种改变的原由,所以违反了SRP。第一种,是跟支付薪水方式有关的商业规则;第二种,是数据库的结构;第三种,是报表的时间格式的字符串。我们不希望这样一个单一的类会被这三种完全不同原由所影响,不希望因为会计认为需要每天改变报表的时间格式,或是DBA每天都要改变数据库结构,也可能是管理人员每天要改变支付薪水的方式,而去改变Employee类。相反,我们希望把这些方法分离到不同类中,这样它们就既能彼此互不干扰,又可随意改变。

当然这好像又与OO的概念相违背,因为一个好的对象应该包含所有操纵它的方法。分解的做法的确有这种趋势,我们因为不希望商业规则与报表格式混杂起来,所以就需要将这些方法放入到不同的类中。

然而,在Ruby中,情况会有些不同。仔细想想下面三个文件:

employeeBusinessRules.rb

class Employee
def calculatePay ... end
end


employeeDatabaseSave.rb

class Employee
def save ... end
end


employeeHourlyReport.rb

class Employee
def reportHours ... end
end

由于在Ruby中,类是在运行时被创建的(也就是说,上面的代码也可视作是一段程序执行片断),类可能是在程序执行的任意时间被展开,更多的方法和成员也可能是在此时被赋到类上。在主程序中我们也许会看到一些诸如:

require 'employeeBusinessRules.rb'
require 'employeeDatabaseSave.rb'
require 'employeeHourlyReport.rb'

因此,类会在余下的程序开始执行前被构造完成。可是没有一个源文件包含了所有这三个不同的方法。实际上,这三个源文件对彼此一无所知,而这就意味着,这三个文件之间并没有耦合。

毫无疑问,我们必须要关注这些成员。为了能访问这些成员(分散在多个源文件中),我们搞不好会使得这些源文件拙劣的耦合起来。可是,假如你有那么一点点地关注并抽象的话,就能使得这些源文件非常漂亮的解耦,进一步的,还可以把这些方法保留在同一个类中(因此也在同一对象中)!

所以,在Ruby中,不用违反SRP原则,就可以把不同的方法放置在同一个类中,并且属于同一个类。你只需简单的将这些有着不同原由的方法放置在不同的源文件中即可。真是鱼与熊掌得其兼啊!

 

 (原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.SrpInRuby; Robert C. Martin的英文blog网址: http://www.butunclebob.com/ArticleS.UncleBob 

译者注:Robert C. MartinObject Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。MartinPattern Languages of Program Design 3More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。

 

 

这篇关于OO难题在Ruby中有了新解 (原文最终修订于 2006-08-21 凌晨02:27:38)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/170913

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

树莓派5_opencv笔记27:Opencv录制视频(无声音)

今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi)  本人所用树莓派5 装载的系统与版本如下:  版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今天就水一篇文章,用树莓派摄像头,Opencv录制一段视频保存在指定目录... 文章提供测试代码讲解,整体代码贴出、测试效果图 目录 阶段一:录制一段

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互