- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我目前正在阅读“Rails AntiPatterns”,提到的第一个模式是单一职责原则。在这一点上,我遇到 SRP 的次数已经足够多了,我意识到它是像我这样的初学者需要理解的一个基本概念,这就是为什么它如此令人沮丧以至于它还没有点击。
书中给出了一个Order类的例子:
class Order < ActiveRecord::Base
def self.find_purchase
#...
end
def self.find_waiting_For_review
#...
end
def self.find_waiting_for_sign_off
#...
end
def self.advanced_search(fields, option = {})
#...
end
def self.simple_search
#...
end
def self.advanced_search
#...
end
def to_xml
#...
end
def to_json
#...
end
def to_csv
#...
end
def to_pdf
#...
end
end
为了说明 SRP,本书建议将 4 个实例方法提取到单独的 OrderConverter 类中。这对我来说很有意义。但与此同时,这个 OrderConverter 类仍然可能有多种更改原因:
将这些方法中的每一个分离到一个单独的转换器类(即 PdfConverter、CsvConverter、XmlConverter 等)中不是更“正确”吗?这样,每个转换器类发生变化的唯一原因就是转换方法本身发生了变化。如果需要一种新格式,可以创建一个新类。如果不再需要旧格式,则可以简单地删除该类。原来的 Order 模型真的应该负责寻找它自己的实例吗?不能将“查找”方法分离到一个单独的“OrderFinder”类中吗?
我读过 Sandi Metz 的“Ruby 中的实用面向对象设计”的 SRP 章节,她建议进行以下测试以查看一个类是否具有单一职责:
How can you determine if the Gear class contains behavior that belongs somewhere else? One way is to pretend that it's sentient and to interrogate it. If you rephrase every one of its methods as a question, asking the question out to make sense. For example, "Please Mr. Gear, what is your ratio?" seems perfectly reasonable, while "Please Mr. Gear, what are your gear_inches?" is on shaky ground, and "Please Mr. Gear, what is your tire(size)?" is just downright ridiculous.
但极端一点,如果一个模型具有多个属性(即一辆汽车有多个门和一种颜色)以及相应的 attr_accessors,这是否已经违反了 SRP?难道每个新属性都不会为类更改添加另一个可能的原因吗?显然,答案不是将这些属性中的每一个都分离到单独的类中。那么,界限在哪里呢?
最佳答案
您写了有关 OrderConverter
类的内容,但没有显示该类的源代码。我假设此类包含方法 to_xml、to_json、to_csv 和 to_pdf。
Wouldn't it be even more "correct" to separate each of these methods into a separate converter class (i.e. PdfConverter, CsvConverter, XmlConverter, etc.)?
是的,将这些方法分离到转换器类可能是个好主意:每个转换器类将负责仅一种格式(一个责任)。
... if a model has more than one attribute (i.e. a car has a # of doors and a color) with corresponding attr_accessors, isn't this already a violation of SRP?
不,这些属性(如颜色、门的数量……)不是一组职责! Car
类的职责是描述一辆汽车(保存有关汽车的信息)。每个汽车实例将描述一辆汽车。例如,如果一辆汽车是一个模型类(假设你想在数据库中存储一辆汽车,而汽车的一个实例是数据库中的一行),那么如果你想改变 的方式,你必须改变汽车类在你的系统中描述一辆车。
但是,如果一辆汽车定义了生产商,生产商将通过名称和地址进行描述,那么我会将生产商的详细信息提取到其他类中,因为这是描述汽车生产商的责任 car 而不是 Car 本身。
还有一件事。 SRP 不是一种模式。这是一个原则(首先在 SOLID 中)。该术语由 Robert Cecil Martin 引入。这里http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod您可以找到更多信息。
关于ruby-on-rails - 单一职责原则——何时停止将代码提取到单独的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19553369/
Java 专家需要您的帮助。 今天我在一次采访中被问到这个问题,但我无法解决。所以我需要一个解决方案来解决这个问题; 反转字符串 Input : Hello, World! Output : oll
目标:单击按钮并将成分作为单独的项目添加到数组中。 当前设置: 这给出:蓝莓芒果柠檬汁 然后我希望能够通过单击按钮将成分作为单独的项目添加到数组中: var allI
如何编写正则表达式来匹配它(参见箭头): "this is a ->'' this is a "test' there is another "test' 第二种情况 /\b'/ Regex Demo
我有一个数组,其中包含有限数量的项目。我想随机删除项目,直到所有项目都被使用过一次。 示例 [1,2,3,4,5] 使用了随机数 5,所以我不想再这样了。使用了随机数 2,所以我不想再这样了。等等..
首先,抱歉,如果这太主观了,我只是不知道还能怎么问/去哪里问。 无论如何,鉴于我最近的所有问题,我准备很快发布一个 Android 应用程序,并且大部分测试都是在我的手机 Droid 上完成的。我真的
这可能不是这个问题的正确位置,如果不合适请随意移动它。我标记为 Delphi/Pascal 因为这是我在 atm 中工作的内容,但这可能适用于我猜的所有编程。 无论如何,我正在做一些代码清理,并考虑将
我像这样分隔了其余 api 的路由。有没有更好的方法来组织路由器?还是我现在的做法没问题? app.js app.use('/api/auth',auth); 应用程序/ Controller /au
我在 2 个单独的工作表中包含以下数据: 表1: A B C D a ff dd ff ee b 12 10 10 12 表2: A B C
我正在使用 jQuery,并在位于单独 HTML 文件中的表中获取了几行。单击时,每一行都会成功重定向到本地 HTML 文件。 (使用window.location) 我想要实现的目标 我想要完成的是
我有重叠背景图像的问题,当它们重叠时会导致阴影比不重叠时更暗,从而产生不均匀的阴影。 我有一个高度灵活的盒子,带有一些透明的背景图像和阴影以创建漂亮的边框。盒子本质上是 3 个元素。 您可以在此处找到
按照正常的微服务框架,我们希望将每个微服务放入其自己的 git 存储库中,然后为 Service Fabric 项目创建一个存储库。当我们更新其中一个微服务时,Service Fabric 项目将仅重
我想将多个片段嵌入到一个指令中。这是我的设置方式。 Everyone Development (3)
我希望在保留原件的同时将多个文件 gzip 到一个目录中(到多个 .gz 文件中)。 我可以使用这些命令来处理单个文件: find . -type f -name "*cache.html" -exe
有没有办法分别知道每个 Eclipse 插件消耗了多少内存? 最佳答案 进行堆转储并使用例如分析它Eclipse Memory Analyser . 如需更多信息,请参阅 Analyzing Equi
我们使用cusrom插件并以这种方式定义脚本(这是一个近似的伪代码): //It is common part for every script (1) environments { "env1"
我在控制台应用程序中托管了一个集线器,并有一个 WPF 应用程序连接到它。它工作得很好。然后我将集线器移到一个单独的项目中,并将主机的引用添加到新项目中。现在我收到 500 错误,没有其他详细信息。
是否可以在单独的 JAR 文件中为 JavaBean 构建类?具体来说,JavaBean 在一个 JAR 文件中具有 Bean 和 BeanInfo 类,而自定义属性编辑器类位于另一个 JAR 文件中
好的,所以我有一个 MAF 应用程序,它在单独的应用程序域中加载每个插件。这非常适合我的需要,因为它允许我在运行时动态卸载和重新加载我的插件。 问题是,我需要能够在子应用域中处理未处理的异常,捕获它,
在参加在线数据库类(class)(针对初学者)时,我注意到一个问题,我必须查找涉及...至少两个不同值的查询...例如, ELMASRI 书中的 COMPANY 数据库指出:查找至少从事两个不同项目的
(首先:我已经尝试了涉及边距、边框等的所有选项。) Link to problematic page. Link to similarly constructed, non-problematic p
我是一名优秀的程序员,十分优秀!