Mixins和Traits有什么区别?
根据维基百科,Ruby模块有点像特征.怎么会这样?
我知道之前已经讨论过这个问题,但似乎总是假设继承至少有时候比组合更好.我想挑战这个假设,希望获得一些理解.
我的问题是:既然你可以完成与对象组合东西,你可以用经典的继承和自经典的继承是很经常被滥用[1] ,自对象组合为您提供了灵活地改变委托对象运行时,为什么你会永远使用经典继承?
我可以理解为什么你会推荐Java和C++等语言中的继承,这些语言不能提供方便的委派语法.在这些语言中,只要不明显不正确,就可以使用继承来节省大量的输入.但是像Objective C和Ruby这样的其他语言提供了经典的继承和非常方便的委托语法.Go编程语言是我所知道的唯一一种语言,它认为经典继承比它的价值更麻烦,并且仅支持代码重用的委托.
陈述我的问题的另一种方式是:即使您知道经典继承对于实现某个模型不是不正确的,那么这个理由是否足以使用它而不是组合?
[1]许多人使用经典继承来实现多态,而不是让他们的类实现接口.继承的目的是代码重用,而不是多态.此外,有些人使用继承来模拟他们对"is-a"关系的直观理解,这种关系往往是有问题的.
更新
我只想在谈到继承时澄清我的意思:
我在谈论一种继承的类型,即一个类继承自部分或完全实现的基类.我不是在谈论继承纯粹抽象的基类,这与实现接口相同,我记录的并不反对.
更新2
我知道继承是实现C++多态性的唯一方法.在这种情况下,显而易见的是你必须使用它.所以我的问题仅限于Java或Ruby等语言,这些语言提供了实现多态的不同方法(分别是接口和鸭子类型).
我有一个模型从解析器对象获取其数据.我认为解析器类应该存在于lib /目录中(尽管我可以说服它应该存在于其他地方).问题是:我的单元应该在哪里测试解析器类?每次运行rake测试时,如何确保它们运行?
在Ruby中,一切都是对象.这就是为什么我不明白为什么我们有数学模块.在我看来,Math模块中的大多数(全部?)函数应该是Integer,Float等数值类型的方法.
而不是
Math.sqrt(5)
Run Code Online (Sandbox Code Playgroud)
拥有它会更有意义
5.sqrt
Run Code Online (Sandbox Code Playgroud)
这同样适用于sin,cos,tan,log10等等.
有谁知道为什么所有这些函数最终都出现在Math模块中?
Factory Girl是一个方便的rails框架,可以轻松创建测试模型实例.
factory_girl允许您快速定义每个模型的原型,并询问具有对手头测试很重要的属性的实例.
一个例子(也来自主页):
Factory.sequence :email do |n|
"somebody#{n}@example.com"
end
# Let's define a factory for the User model. The class name is guessed from the
# factory name.
Factory.define :user do |f|
# These properties are set statically, and are evaluated when the factory is
# defined.
f.first_name 'John'
f.last_name 'Doe'
f.admin false
# This property is set "lazily." The block will be called whenever an
# instance is generated, and the return value of …Run Code Online (Sandbox Code Playgroud) 我正在编写一个带有自定义键盘的机顶盒的门户网站.
键盘有大多数标准字符键但没有退格!
由于还有其他一些免费的自定义键,我想在输入字段或文本区域中将其中一个映射到退格键.
问题是:如何以编程方式将退格发送到输入字段?
或者就此而言:如何以编程方式将任何键(如箭头键)发送到输入字段?
在我看来,片段缓存和急切加载 - 至少有时 - 在某种程度上相互矛盾.假设我有一个用户,他有很多帖子,每个帖子都有很多评论,反过来也可以有很多评论等等.
当我必须渲染页面时,我可以选择热切地加载用户,所有帖子,所有评论等等,以避免数据库n-1次.或者我可以懒惰地加载每个对象并依赖片段缓存来仅查询数据库中的新对象或已更改的对象.使用片段缓存和急切加载似乎都是浪费,因为我可能会做一个非常复杂的查询并实例化很多对象只是为了使用它们中的一小部分.
但是,如果我有一个应用程序,其中一个用户有许多Foos,而这些Foos又有很多Bars等等,但是其中每个Foo都是同时创建完整的所有Bars及其相关对象,从那时起就永远不会改变.在这种情况下,我想对已经渲染的Foos使用片段缓存,但是当我必须加载一个带有所有相关对象的新Foo时,要使用预先加载.毕竟,在更细粒度的级别缓存片段没有任何好处.
Rails实现这一目标的最佳方式是什么?我想我可以做一个查询来获取Foo的id,然后在我必须渲染每个Foo时用急切加载进行显式查找.这样做有更好/更优雅/更惯用的方式吗?
performance caching ruby-on-rails fragment-caching eager-loading
我正在研究一个非常需要一些性能调整的项目.
如果我的优化不能提高程序的速度,如何编写失败的测试?
详细说明:
问题不在于发现要优化的部分.我可以使用各种分析和基准测试工具.
问题是使用自动化测试来记录特定优化确实具有预期效果.如果我可以使用测试套件以后发现可能的性能回归,那也是非常可取的.
我想我可以运行我的分析工具来获取一些值,然后断言我的优化代码会产生更好的值.然而,明显的问题是基准值不是硬值.它们因当地环境而异.
那么,总是使用同一台机器进行这种集成测试的答案是什么?如果是这样,您仍然必须在结果中允许一些模糊性,因为即使在相同的硬件上,基准测试结果也会有所不同.那么如何考虑到这一点呢?
或者答案是保留程序的旧版本并比较前后的结果?这将是我首选的方法,因为它主要与环境无关.有没有人有这种方法的经验?我想只有在最新版本的性能至少与前一版本一样好的情况下才能通过所有测试时,才需要保留一个旧版本.
这个话题在办公室变成了激烈的讨论,所以我很想知道你的想法.
我们正在开发一个仅针对某些特定浏览器的网络应用.这些浏览器目前包括不同风格的Opera 9和Mozilla 1.7.12.在未来,我们可能还需要支持Opera 10和不同版本的WebKit.但我们不太可能不得不处理任何版本的IE.
我们的网络应用程序在其doctype中声明HTML 4.0严格.
最近,我提出了在HTML中使用自定义属性作为特定问题的解决方案.我提出了一些看起来像这样的东西:
<span translationkey="someKey">...</span>
Run Code Online (Sandbox Code Playgroud)
由于这不是有效的HTML 4,它与我们的HTML人员并没有很好地相关,我们陷入了争论.
我的问题是:如果有的话 - 使用自定义属性的风险是什么?我知道页面不会验证,但是并非所有浏览器都忽略了他们不知道的属性?或者可以想象一些浏览器会改为"quirks模式"并将页面呈现为严格的HTML 4.0之外的其他内容?
更新:
Hilited提出的实际问题.
我经常被告知CSS 3D变换是Mobile Safari中的硬件加速,这让我想知道这意味着2D变换是不是?我可以想到他们没有理由,因为他们基本上都可以实现为3D变换,但我想知道.
如果事实证明2D变换不是硬件加速,那么任何关于为什么会有所了解的见解.
html ×2
java ×2
oop ×2
performance ×2
unit-testing ×2
caching ×1
composition ×1
doctype ×1
factory ×1
factory-bot ×1
inheritance ×1
javascript ×1
mixins ×1
paradigms ×1
ruby ×1
tdd ×1
traits ×1