GO中的逻辑分布

GO中的逻辑分布,go,methods,logic,conceptual,repeat,Go,Methods,Logic,Conceptual,Repeat,我在围棋中玩得很自大,无意中发现了这个困境: (请记住,这纯粹是概念性的,我的目标是尽量减少逻辑重复等) 想象一下,我必须对两种类型的文件建模:二进制文件和文本文件。首先,每个都应该知道如何计算它们的大小,所以我声明了两个结构及其方法 type file interface { size() int ... } type text struct { ... } func (t text) size() int { ... } type binary struct { ... }

我在围棋中玩得很自大,无意中发现了这个困境:

(请记住,这纯粹是概念性的,我的目标是尽量减少逻辑重复等)

想象一下,我必须对两种类型的文件建模:二进制文件和文本文件。首先,每个都应该知道如何计算它们的大小,所以我声明了两个结构及其方法

type file interface {
 size() int
 ...
}

type text struct {
 ...
}

func (t text) size() int {
...
}

type binary struct {
 ...
}

func (b binary) size() int {
...
}
到目前为止,一切顺利。下一个要求是检查它们是否轻(它们的大小小于某些固定大小)。在OOP中,我会使用一个超类来避免重复,但由于我需要访问
size()
方法,所以我不能使用struct并对其进行修改

我有两个可能的选择:

  • 定义一个函数
    isLight(f file)bool
    ,但这会破坏界面,因为它不会显示文件应该知道它们是否轻

  • 尝试模拟一些OOP组合,但生成的代码看起来不像应该的那么可读(可能不在代码段中,但添加更多的方法会使其看起来像“中间人”代码味道,因为内容只会将消息重定向到相应的结构)

类型文件接口{
size()int
孤岛
}
内容接口的类型{
size()int
}
类型内容结构{
文件
内容类型
}
func(c内容)大小()int{
返回类型。大小()
}
func(c内容)isLight()int{
返回c.size()<100
}
这样做的“方式”是什么

干杯


Erwin

我建议您阅读这篇文章,这取决于您希望如何使用
isLight()
。对于硬编码的大小,我会使用一个函数,因为它可以在满足
文件
接口的各种类型之间进行缩放,并且对“light”的含义有一个一致的定义。如果将其定义为一个方法,那么所有想要满足
文件
接口的类型都需要定义
isLight()
方法的实现。如果使用一种方法,可能会出现对“光”的不同定义,但这可能是可取的。例如,一个10 MB的视频可能是“轻”的,而一个10 MB的“纯文本”文件可能是一本书的几个部分。您还可以定义一个方法,该方法返回一个值,该值构成“轻”文件的最大大小,而纯
isLight(f file)bool
函数可以将该方法与
size()结合使用
返回的方法,例如,
f.size()
。这将允许您将
isLight()
的行为定义为一个函数,这与
文件
界面上定义的方法不同,同时仍然允许该方法的灵活性。
    type file interface {
     size() int
     isLight() bool
    }

    type typeOfContent interface {
     size() int     
    }

    type content struct {
     file
     type typeOfContent
    }

    func (c content) size() int {
     return type.size()
    }

    func (c content) isLight() int {
     return c.size() < 100
    }