使用统一建模语言图表对Go进行编程

使用统一建模语言图表对Go进行编程,go,uml,paradigms,Go,Uml,Paradigms,我刚刚开始使用Go(GoLang),我发现它是一种很棒的语言。然而,在使用了多年的UML和面向对象的方法之后,我发现建模Go程序(逆向工程)有点问题,因为Go结构包含属性/状态,但没有方法,以及使用结构作为参数的方法/函数(即使是那些使结构看起来像对象的神奇方法),不包含方法或状态 这是否意味着我应该使用另一种方法来建模Go程序,或者UML是否充分地建模了语言结构 是的,我知道如果你在结构上使用方法,UML中对象的行为可以通过结构和结构方法的组合映射到Go中,但我发现这是错误的,各种范式中的阻抗

我刚刚开始使用Go(GoLang),我发现它是一种很棒的语言。然而,在使用了多年的UML和面向对象的方法之后,我发现建模Go程序(逆向工程)有点问题,因为Go结构包含属性/状态,但没有方法,以及使用结构作为参数的方法/函数(即使是那些使结构看起来像对象的神奇方法),不包含方法或状态

这是否意味着我应该使用另一种方法来建模Go程序,或者UML是否充分地建模了语言结构

是的,我知道如果你在结构上使用方法,UML中对象的行为可以通过结构和结构方法的组合映射到Go中,但我发现这是错误的,各种范式中的阻抗不匹配

是时候采用一种新的(让思想消失吧!)绘图技术了吗?是时候进入一个行为不再受对象控制的勇敢的新世界了吗?行为是否可以在不参考其影响的状态的情况下建模

更新:

我正在尝试绘制数据流图,看看它们是否更适合这个范例。到目前为止还不错,但当我对结构的方法进行建模时,我想我会失败,DFD中的折衷之处在于它们被视为函数(

Go支持继承!!!arghhh!!!(头被吹干净了。)你可以用另一个结构组成一个结构,这个结构有方法,子结构现在继承了…你明白了吗?我的想法被吹了。这意味着UML是有效的…完全的,但它感觉脏兮兮的


Go不支持继承,它只是看起来是这样的。:)DFD就是这样

如果您更喜欢规划和建模而不是编程,那么您应该坚持使用Java


如果你喜欢构建和维护实际的代码和工作系统,你应该试着在一张纸或白板上规划你的Go程序,然后开始编程。

在结构本身定义之外声明方法的事实应该不重要;这只是一个小的语法差异。这些方法属于struct类型,就像它们在大括号中一样。(它们在大括号外声明,因为方法不限于结构。)

将UML与Go结合使用的真正潜在问题是,UML通常用于传统的面向对象设计(即类层次结构),而Go对继承和多态性采取了不同的方法。也许UML可以适应Go的类型系统——我对UML还不太熟悉,但无论您是否继续使用UML,您的设计方法都可能需要有所改变


Go不打算在Smalltalk和Java的everything is a object样式中使用。惯用的Go程序通常包含大量的过程代码。如果您的设计过程侧重于对象建模,那么它将无法很好地用于Go

UML仍然为您提供了分析和设计组件、接口和数据的有用工具。Go不是一种OO语言,因此您不能使用继承、多态性、方法等。您不需要新的范例,您可能需要旧的范例:

Go结构包含属性/状态,但不包含方法,以及 使用结构作为参数的方法/函数(即使是 使用魔法使结构看起来像一个对象),而不包含 方法或状态

正如您所知道的,在C++中,也可以声明结构上的方法——就像在类中,只有一个不同之处,就是不能使用访问修饰符。 在OOP语言中,您在类定义中声明类的方法,让人感觉这些方法在某种程度上是类的一部分。大多数语言都不是这样,Go让这一点变得显而易见

在传统OOP语言中声明类似以下伪代码的内容时:

class Foo {
    public function bar(x int) {
        // ...
    }
}
链接器将导出一个类似以下内容的函数:

Foo__bar(this Foo, x int)
然后执行时(假设
f
Foo
的一个实例):

事实上,您正在(间接地,稍后会详细介绍)做:

类实例本身将只包含一个所谓的vtable,其中包含指向它实现和/或继承的方法的函数指针

此外,方法不包含状态,至少在当代编程世界中不包含状态

这是否意味着我应该使用另一种方法来模拟围棋 编程还是UML对语言结构进行了充分的建模

UML应该足够了

例如,是时候采用一种新的(消除这种想法!)图表技术了吗 勇敢的新世界,那里的行为不再由人控制 反对

Naa

行为是否可以在不参考其当前状态的情况下建模 影响

是的,这就是接口的用途

我正在尝试绘制数据流图,看看它们是否更适合 范式到目前为止还不错,但我想我会在 我对结构的方法进行建模,DFD中的折衷是 它们被视为函数:(


不要迷失在抽象中,打破它们。没有完美的范例,也永远不会有。

你会得到一些很好的反馈,但可能不会在这里。如果你理解我的意思,这更多的是白板而不是键盘。没有白板,就没有键盘。范例是软件,在讨论中没有二分法。步骤aw远离管道。远离键盘Damien.:-)这个问题和一些答案可能会混淆问题。对于那些感兴趣的人来说,这是一个问题,也有一个问题。我不同意“只是语法”的思维过程,如果是这样的话,go只会遵循对象范式。go做数据结构的组合,也因为函数是第一类,这些可以以复合样式传递,您仍然可以进行基于对象的设计,并且
f.bar(3)
Foo__bar(f, 3)