代码之家  ›  专栏  ›  技术社区  ›  dtb

规范化.skip()和.take()调用的链

  •  6
  • dtb  · 技术社区  · 16 年前

    我正试图规范化 .Skip() .Take() 打电话给一个人 SKIP() 呼叫后接可选单曲 取() 打电话。

    以下是一些预期结果的示例,但我不确定这些结果是否正确:

    .Skip(5)                        => .Skip(5)
    .Take(7)                        => .Skip(0).Take(7)
    
    .Skip(5).Skip(7)                => .Skip(12)
    .Skip(5).Take(7)                => .Skip(5).Take(7)
    .Take(7).Skip(5)                => .Skip(5).Take(2)
    .Take(5).Take(7)                => .Skip(0).Take(5)
    
    .Skip(5).Skip(7).Skip(11)       => .Skip(23)
    .Skip(5).Skip(7).Take(11)       => .Skip(12).Take(11)
    .Skip(5).Take(7).Skip(3)        => .Skip(8).Take(4)
    .Skip(5).Take(7).Take(3)        => .Skip(5).Take(4)
    .Take(11).Skip(5).Skip(3)       => .Skip(8).Take(3)
    .Take(11).Skip(5).Take(7)       => .Skip(5).Take(6)
    .Take(11).Take(5).Skip(3)       => .Skip(3).Take(2)
    .Take(11).Take(5).Take(3)       => .Skip(0).Take(3)
    

    有人能确认这些结果是预期的正确结果吗?


    下面是我从示例中导出的基本算法:

    class Foo
    {
        private int skip;
        private int? take;
    
        public Foo Skip(int value)
        {
            if (value < 0)
                value = 0;
    
            this.skip += value;
    
            if (this.take.HasValue)
                this.take -= value;
    
            return this;
        }
    
        public Foo Take(int value)
        {
            if (value < 0)
                value = 0;
    
            if (!this.take.HasValue || value < this.take)
                this.take = value;
    
            return this;
        }
    }
    

    你知道我怎样才能确认这是不是正确的算法吗?

    1 回复  |  直到 16 年前
        1
  •  4
  •   John Gietzen    16 年前

    这是TDD的完美场景。既然你已经定义了你的规格,这应该是 蛋糕 作为一系列的测试来实现。

    “正确”是相当主观的,但是 这些例子似乎是合理的。

    另外,我会把 .Skip(0) 电话。

    确保你清楚地定义你的边缘案例。例如,

    .Take(11).Skip(12).Take(1)
    

    应该被规范化为 .Take(0)


    编辑:

    skip的官方定义是:

    绕过序列中指定数量的元素,然后返回其余元素。

    并采取:

    从序列的开头返回指定数量的连续元素。

    根据您的示例,我认为您的测试用例正确地遵循了规范。