小编dku*_*ubb的帖子

施工人员是否应遵守Liskov替代原则?

我通常会尝试确保我的对象实例符合Liskov替换原则,但我一直想知道人们是否认为LSP也应该适用于构造函数?

我已经尝试使用谷歌搜索,但无论如何我都无法找到任何强烈的意见.

我应该注意到我的大部分编码都是在Ruby中,但我有时会发现我的子类构造函数与父类略有不同.它们使用相同的基本参数集,通常是额外的参数.有时这也会发生在其他类方法中.

在我的脑后,这总是感觉像LSP违规,但我想看看是否有其他人也有这种感觉.

constructor liskov-substitution-principle class-method

63
推荐指数
2
解决办法
2453
查看次数

从红宝石中的独家Range获得最大价值的最快方法

好吧,所以说你在红宝石中有一个非常大的范围.我想找到一种方法来获得范围中的最大值.

范围是独占的(由三个点定义),这意味着它不包括结果中的结束对象.它可以由整数,字符串,时间,还是真的是响应任何物体#<=>#succ.(这是Range中开始/结束对象的唯一要求)

以下是独家范围的示例:

  past  = Time.local(2010, 1, 1, 0, 0, 0)
  now   = Time.now
  range = past...now

  range.include?(now)  # => false
Run Code Online (Sandbox Code Playgroud)

现在我知道我可以做这样的事情来获得最大值:

  range.max  # => returns 1 second before "now" using Enumerable#max
Run Code Online (Sandbox Code Playgroud)

但这需要花费很多时间来执行.我也知道我可以从最终对象中减去1秒.但是,该对象可能不是Time,甚至可能不支持#-.我更愿意找到一个有效的通用解决方案,但我愿意将特殊案例代码与一般解决方案的后备结合起来(稍后会详细介绍).

如上所述,使用Range#last也不起作用,因为它是一个独占范围,并且不包括其结果中的最后一个值.

我能想到的最快的方法是:

  max = nil
  range.each { |value| max = value }

  # max now contains nil if the range is empty, or the max value
Run Code Online (Sandbox Code Playgroud)

这类似于Enumerable#max(Range继承),除了它利用每个值将大于前一个的事实,因此我们可以跳过使用#<=>来比较每个值与前一个(方式Range#max)保存一个一点点时间.

我正在考虑的另一种方法是为常见的ruby类型(如Integer,String,Time,Date,DateTime)提供特殊的案例代码,然后使用上面的代码作为后备.它有点难看,但是当遇到这些对象类型时可能效率更高,因为我可以使用减法Range#last来获得最大值而无需任何迭代.

任何人都可以想到比这更有效/更快的方法吗?

ruby optimization performance range

7
推荐指数
1
解决办法
1086
查看次数

红色,绿色和重构步骤之间的自动git提交?

我总是对使用我的工作流程尝试新事物感兴趣,并且我认为在红色,绿色和重构步骤之间自动提交可能是一个有趣的实验,但是一旦我完成特定功能(并且在推送之前)手动压缩提交).

我只是想知道其他人是否曾尝试过这个?我以为我曾经读过这个,但我找不到任何参考资料.

我希望一个好处可能是更多地关注经常提交,以及能够直观地看到我的工作流程以便我可以改进它.例如,在挤压之前,我可以看到我的红色和绿色之间的时间是否太长,或者我所做的代码更改次数是否大于每个步骤之间所需的时间.

我打算将它作为一个防护插件来实现,这样当我保存规范或库文件时,它会运行规范并使用提交消息提交更改,如:

Green: 1621 examples, 0 failures, 2 pending (1659 tests/s, 0.0006 p/test)
Run Code Online (Sandbox Code Playgroud)

我的想法是,我可以在压缩时进行可视化扫描,并确定通过逻辑更改对相关的Red/Green/Refactor进行分组的位置.

在最坏的情况下,我认为这可能是一个有趣的实验,充其量它可能会让我以不同的方式看到我的工作方式.

git tdd refactoring guard

6
推荐指数
1
解决办法
332
查看次数