【问题标题】:golang inheritance to implement backbone like collection / modelgolang继承来实现像集合/模型这样的骨干
【发布时间】:2017-11-12 05:45:18
【问题描述】:

我正在寻找 golang 作为我的 web 后端的新 goto 语言。我目前的语言是 PHP,我在其中实现了一个类似于 Backbone Collection/Model 结构的数据结构。

excursus 集合/模型

这意味着我有一个包含多个ModelsCollectionModels 有一个 attributes 字典用于存储实际的“公共数据”。 Collections 有多种对Models 数组进行操作的便捷方法(排序、getByIndex、getByMatchingParameter 等)。 Models 也有他们分享的便捷方法。

在日常生活中,将有 90% 的“事物”以相同的方式表示。例如,我可以像存储User 一样存储Address。拥有一个包含我的AddressesAddressesCollection,我可以简单地要求我的AddressesCollection 给我所有AddressModels,其中city=Berlin。在我的基类中实现这种匹配,我可以在我的UserCollection 上做同样的事情,给我所有被deactivated=true 停用的用户。

但有时(10%)我需要一种特殊的方法。 getGeoDataAddresses 例如。现在,在我的 oop 世界中,我可以简单地创建一个新类,扩展我的 BaseModel 添加我的方法,并在使用我的基类的任何地方使用我的扩展类。

我的“我就是不明白”

这在 Go 中是如何工作的。我阅读了很多关于嵌入/组合的介绍。但根本不要让我的头脑明白这一点。

这就是我的立场,请记住,这是我学习“继承”概念的游乐场,而不是用于生产就绪的集合/模型实现。

GoPlayground

我得到的是我还没有“理解”如何编写一个接受不完全继承的类型的“通用”方法。我觉得我必须在某个地方使用接口才能获得这种“继承”/“扩展类”的感觉。但我目前的使用是......嗯......

但也许我完全错误地以这种方式实现我想要的结构的概念?也许有一种更优雅的方式。任何提示都非常感谢!

【问题讨论】:

  • 我能给出的绝对最好的建议,我不能说得足够强烈:像 Go 一样编写 Go。 不要试图模仿你在其他语言中使用过的模式.那样只会导致疯狂。

标签: inheritance go data-structures collections embedding


【解决方案1】:

您已经非常接近正确了,但是您混淆了多种不同的东西。

完整示例:https://play.golang.org/p/wpj82QRVUP

  1. 类型嵌入

所以你有两个模型UserAddress,它们都共享公共字段,也许还有方法。这是为两者创建公共结构的一个很好的理由:Model,如上面的链接所示。 所有三个结构都是不同的类型

  1. 收藏

您可以拥有一组接口或一组已定义类型。那么什么时候用哪个呢?

如果你有一个地址集合,定义如下类型: type AddrCollection []*Address。然后在AddrCollection 类型上实现你想要的任何方法。

如果您有一个模型集合,同样定义type ModelCollection []*Model,但随后将Address 传递给ModelCollection 将需要“提取”嵌入类型。

如果你有一些东西的集合,那么定义一个接口的集合(例子中是DescriberCollection),但是你不会在上面定义GetByAddress(),它只会存在于AddrCollection

  1. 接口

它们没有字段,它们只定义要实现的方法签名。在 Go 中,接口通常被接受并且永不返回,这给你带来了干净和面向目标的设计的好处。接口是一种允许其他用户(或其他包)以不需要实现您的类型而是某些方法的方式使用您的包/库的方法。他们可以重用您定义的类型,也可以插入他们自己的接口实现。那么什么是接口,它是一种说法:这里有一组方法签名,只要你实现了就可以使用我的包

【讨论】:

  • 感谢您的意见!我担心我们在某些时候处于不同的页面。我试图为帖子压缩Source,但现在我认为这使事情变得复杂。 Full Code我目前的问题是here。我想在我的“收藏”上有一个通用的 get(byId) 。而且我并没有摆脱在这里“反对 Go 的原则”工作的感觉
  • 我建议您尝试在 Go Slack 频道中询问,您所做的与惯用的 go 和它的原则相去甚远。如果您在该频道四处询问,您更有可能被设置在正确的方向。
【解决方案2】:

好吧,看来我真的不明白这样做的方法。

帮助我继续前进的流行语:

  • ORM
  • 去生成

看起来可以解决我的问题的项目:

无论如何,谢谢你的回答!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多