是否有建议的方法来定义切片集合的常见行为?

时间:2018-03-16 17:44:20

标签: go slice

我正在尝试从社区获得建议,以便制定最佳做法。 请耐心等待,举例如下:

假设您使用半开启时间间隔,即启动时知道的事情。

例如

  • 可以HalfOpenInterval限制一天。例如:你从下午1点开始说"" (直到当天结束)。我们称之为 ClockInterval
  • 可以HalfOpenInterval限制宇宙的存在。例如:你说"从1810年7月9日起我们宣布独立性" (直到宇宙结束......假设)。我们称之为期间

对于这两种实体类型:您使用它们的集合,因此您的代码中通常只有slices 时钟句点

现在出现了问题:你必须找到给定时间的封闭间隔func FindEnclosingHalfOpenInterval两个时钟和句点,所以你开始写代码......

好吧,我开始讨论这个问题......我应该如何组织代码才能只编写一次常用函数。 (func FindEnclosingHalfOpenInterval)。

所以我进入了这段代码:https://play.golang.org/p/Cy7fFaFzYJR

但我一直想知道是否有更好的方法来定义切片集合的常见行为。

请读者你应该意识到我需要按元素"做一个"元素。对于每种类型的切片,转换(对于我定义的每种类型的具体HalfOpenInterval,我都有一种切片类型)。所以我想知道是否有任何方法可以让我引入新类型的HalfOpenInterval而无需做一些调整和自动"得到了func FindEnclosingHalfOpenInterval?也许我的富有基于java的头脑并不是在简单直接前进的世界中面对问题的正确方法。我听到了所有的建议。

2 个答案:

答案 0 :(得分:2)

关键问题是你需要将切片从一种类型转换为另一种类型。

转换切片

执行此操作的正确方法是创建一个新切片并在其上循环转换每个项目。如果事先创建数组,则可以快速执行此操作(呃):

func ToIntervalsFromClockIntervals(clockIntervals []ClockInterval) HalfOpenIntervals {
    intervals := make(HalfOpenIntervals, 0, len(clockIntervals))
    for _, clockInterval := range clockIntervals {
        intervals = append(intervals, clockInterval)
    }
    return intervals
}

组合物

除了该组合之外,您还可以通过另一种方式解决您只想编写GetEnclosingInterval函数一次的问题。我并不是说它更好:它有其他优点和缺点。什么更合适取决于你使用切片除了你在这里发布的内容以外的其他方式。

此处我的重构建议(并已修复):https://play.golang.org/p/Ko43hJUMpyT(TehSṕhinX您忘记使用baseIntervals.add而不是{{1}制作可变方法 pointer recievers }(或value recievers的名称))

non-pointer recievers不再存在。相反,HalfOpenIntervalsCLockIntervals有两种不同的类型,它们都有通过公共基础结构实现的排序和PeriodIntervals函数。

为方便起见,我为每个函数添加了GetEnclosingInterval函数和Add函数。这就是缺点:由于New...(和CLockIntervals)不再是一个切片,而是一个结构,你需要使用便利函数来处理来自外部的内部切片。

- 编辑 -

过于推广

我自己以oo为导向的背景,我知道不惜一切代价避免重复代码的动力。

现在在全职的基础上编写代码超过2年我了解到这并不总是最好的方法。如今,复制不同类型的代码是我常见的事情。但不确定是否所有人都同意这一说法。

答案 1 :(得分:1)

我想这可能是过于复杂的。将FindEnclosingHalfOpenInterval定义为独立函数,然后对于需要使用HalfOpenInterval结构的函数,make接受一个具有EnclosingHalfOpenInterval方法的接口,该方法通常只调用FindEnclosingHalfOpenInterval。这样,您可以在不更改签名的情况下执行任何类型的边缘案例数据封装。

这就是它的全部内容。 FindEnclosingHalfOpenInterval已经被共享,因为它不是任何结构的明确部分。