今天闲来无事去社区上逛了一下。发现一个好帖子,顺便说下个人的意见:
需求是这样的 ,对下面需求做重构:
Bob is a lackadaisical teenager. In conversation, his responses are very limited. Bob answers 'Sure.' if you ask him a question. He answers 'Whatever.' if you tell him something. He answers 'Woah, chill out!' if you yell at him (ALL CAPS). He says 'Fine. Be that way!' if you address him without actually saying anything.
from ruby-china 网址:http://ruby-china.org/topics/13178
有一下几种做法:
1.典型的if else判断的 :
class Bob def hey(words) if words.nil? || words.strip.empty? "Fine. Be that way!" elsif words.upcase == words "Woah, chill out!" elsif words[-1] == "?" "Sure." else "Whatever." end end end
2,将if else 部分抽出
class WordsParser def silent?(words) words.nil? || words.strip.empty? end def shout?(words) words.upcase == words end def question?(words) words.end_with?("?") end end class Bob def hey(words) @parser = WordsParser.new if @parser.silent?(words) "Fine. Be that way!" elsif @parser.shout?(words) "Woah, chill out!" elsif @parser.question?(words) "Sure." else "Whatever." end end end
还有一位做的更加简洁的,我也和喜欢 :
class Bob def hey(words) return "Fine. Be that way!" if words.nil? || words.strip.empty? return "Woah, chill out!" if words.upcase == words return "Sure" if words[-1] == "?" return "Whatever." end end
3但是我最喜欢的还是下面这种 :
class Bob Rules = [ [->w{w.nil? || w.strip.empty?}, 'Fine. Be that way!'], [->w{w.upcase == w }, 'Woah, chill out!' ], [->w{w[-1] == "?" }, 'Sure.' ], [->w{true }, 'Whatever.' ] ] def hey(words) Rules.each{|checker, answer| return answer if checker.call(words)} end end
也许你看不出来为什么我最喜欢第三种,但是稍微分析下就发现第三种做法的好处。先不说你能不能看懂lambda表达式,他整体的这样设计就是一种更容易扩展的做法。举个例子来说:现在我添加一种新的功能
Bob answers 'hello world.' if you tell him a programming language .
那会有怎么样的做法呢?
对于第1种:添加一个elsif 来满足这样的需求
对于第2种:在WordsParser里面添加一个ifelse 还要在Bob里面添加一个ifelse
对于第3种: 添加一个lumbda表达语句就好了。
下面详细的说下前两种的不好。
对于第1种来说,当年的需求种类少的话,还好说,多几个ifelse就好了。但是当需求大的时候呢,这一个函数里面充满了ifelse(不要笑,我见过一个类里面只有两个函数一个几行的函数,另外一个则都是ifelse)。这时候你会发现他比较大了。应该说可以把他抽成一个模块了。这时候你在去做,可能形成的就是第2种的样式。
对于第2种来说,其实已经很不错了,但是有一个设计原则他却违反了,那就是ocp(open-close-principle),不知道你有没有发现,你每添加一项功能的时候都会修改两个地方,一个是重构出去的函数里面添加一个ifelse。还有在Bob里面添加一个ifelse。ocp所说的就是对修改关闭,对扩展开放。所以来说第三种就是最合适的了。
你可以想象一下。如果扩充功能的话,对于第三种来说是多么的方便。当然在第3种方案里面可以将Rules抽出来作为一个扩展功能类。作为Expression的子类。
最后说一下,有人可能说他本来就懒你还让他做这么多。意思是:用户就这些需求,没有必要扩展,我只能说,我想多了。哈哈。。
相关推荐
开放-封闭原则(Open-Closed Principle, OCP)是软件工程中一个至关重要的设计原则,它由Bertrand Meyer于1988年提出,并由Robert C. Martin进一步阐述和发展。OCP的核心理念在于确保软件实体(如类、模块、函数等)对...
以下是对这一原则的详细解释和应用实例: 1. **定义**: - 开闭原则指出,一个软件模块应当对扩展开放,即能够容易地添加新功能而不影响现有代码。 - 对修改关闭意味着一旦模块完成,应尽量避免对其内部逻辑的...
4. **代码中国.url**:指向一个可能与Oracle技术、OCP认证相关的网站链接,可能是在线学习资源或社区论坛。 总结来说,OCP认证对于那些致力于在Oracle数据库领域建立专业职业生涯的人来说,是一项重要的里程碑。...
开闭原则(Open-Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它在软件工程领域具有举足轻重的地位。该原则由 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出,旨在提高...
面向对象 设计原则 单一职责原则--SRP 开放封闭原则--OCP Liskov替换原则--LSP 依赖倒置原则--DIP 接口隔离原则--ISP
开放计算项目(Open Compute Project, OCP)是一个致力于提高数据中心效率的组织,它制定了一系列硬件和软件标准,以支持更加开放、灵活和高效的计算生态系统。OCP NIC 3.0 设计规范即是该组织制定的网络接口卡...
ocp题库ocp题库ocp题库ocp题库ocp题库
在本案例中,我们关注的是 Oracle 10g 的 OCP 管理员认证,包括两个部分:管理一和管理二。这个压缩包文件包含了相关的学习资料,帮助考生准备 OCP 认证考试。 1. **Oracle 10g 简介** Oracle 10g 是 Oracle 公司...
- "OCP2" 可能是一个案例分析,通过具体的代码示例展示如何遵循开闭原则进行设计,可能包括如何使用抽象、接口和设计模式来实现这一原则。 - "OCP3" 可能是一份讨论或解决方案,探讨在实际开发中遇到的问题以及如何...
本篇文章主要基于一位名为韩思捷(hanson)的专业人士的经验分享,他在 Oracle 数据库领域有着丰富的学习和实践经验,包括 OCP 认证的备考经历和建议。 首先,对于打算学习 Oracle 数据库的新手,韩思捷强调了几个...
Oracle Certified Professional (OCP) 是 Oracle 公司提供的专业数据库管理员认证,对于 IT 从业者,尤其是专注于数据库管理和优化的专业人士来说,这是一个极具价值的证书。053 最新题库可能指的是 OCP 认证考试中...
通过以上内容,我们可以看出"OCP 053 206+711 VCE 2018"是一个针对Oracle Database 12c OCP认证的综合学习资源,涵盖了广泛的数据库管理和高级技术,对于准备该认证的考生来说,是一个宝贵的参考资料。
**OCP-IP**(Open Core Protocol Intellectual Property)是一个开放标准组织,致力于定义和推广用于芯片内部通信的标准接口——**OCP**(Open Core Protocol)。OCP-IP 3.0是该组织发布的最新版本规格,它为系统级...
MySQL 8.0 OCP考试中,自然语言理解系统视图和日志是重要的考试内容之一。自然语言理解系统视图是指使用自然语言来管理和维护数据库的视图,而日志是指数据库中的日志记录。 注册vue和oracle帐号: 在考试前,需要...
OCP(Oracle Certified Professional)是Oracle公司推出的数据库管理员认证,是全球范围内认可度极高的IT专业证书之一,特别是在Oracle数据库管理领域。这个认证旨在验证个人在Oracle数据库安装、配置、性能优化、...
这个“Oracle OCP 考试模拟器”是为准备OCP认证考试的考生设计的一个实用工具,它通过模拟实际的VUE考试环境,帮助考生熟悉考试流程和格式,提升备考效率。 模拟器的特点在于它能够随机出题,这意味着每次练习时的...
VCE(Virtual Certification Exam)是一种模拟考试的软件,它允许考生在正式考试前进行实战练习,熟悉考试环境和题型。 Oracle Certified Associate (OCA) 是Oracle认证体系的入门级别,针对Oracle数据库管理员(DBA...
- **包含关系**: SCP可以看作是OCP的一个子集,即SCP是OCP的一种特殊情况。 - **触发条件**: OCP一般在电流超过正常工作范围但还未达到短路级别的时候激活;SCP则是在检测到极端的短路电流时被触发。 - **保护策略**...
Oracle 12c OCP题库,Oracle OCP考试复习,OCP题库下载
2017OCP最新模拟器+题库