当应用的某些部分用不同的语言编写时,如何避免数据结构重复?


12

例如,假设您正在用Java编写应用程序。

您的应用程序与使用Python编写的API服务器进行通信。

Python服务器与SQL数据库进行通信。

您还拥有一个用JavaScript编写的应用程序网站。

使用4种不同的语言,很容易以4次不同的时间重复基本相同的数据结构。

例如,User类型可能看起来像这样(伪代码):

type User {
  integer id;
  string name;
  timestamp birthday;
}

项目的每个部分都需要某种形式的表示User。Java和Python部分将需要两个不同的class声明。数据库将需要一个User表声明。前端站点也需要代表一个站点User

重复此类型4次确实违反了“ 请勿重复自己”原则。还有一个问题是,如果User更改了类型,则需要在项目的每个不同部分中重复这些更改。

我知道Google的protobuf库为该问题提供了一种解决方案,您可以使用特殊的语法编写数据结构,然后该库以多种不同的编程语言为您生成结构声明。但这仍然没有解决必须为您的类型重复验证逻辑的问题。

是否有人对此有任何建议或链接到书籍/博客文章?


这就是为什么许多人一直将所有开发都转移到JavaScript的原因之一。可在客户端(Web,移动设备上的离子,台式机上的电子设备),服务器(节点),数据库(MongoDB)上工作。
保罗

3
如果后端和前端使用相同的语言,则可以共享相同的数据结构。如果使用的是不同的代码库,则不要重复。使用工具从不同开发平台的xml模式或Json字符串生成类。
乔恩·雷诺

5
Repeating this type 4 different times really breaks the Don't-Repeat-Yourself principle。不,不是。您有4个不同的系统执行不同的操作。您将DRY调得太远了。根据我的经验,您想要做的可重用性是邪恶的种子,因为引入了紧密的耦合。这甚至比User用4种不同的语言重复4次更为糟糕。在分布式环境中,耦合是一个问题。不是DRY。
Laiv

没有时间回答:根据您的需要,您可以尝试使用OWL来制定验证规则(因此建立本体)。验证规则然后成为“数据”,可以在必要时使用。然后可以在一个中心位置更改规则。
Daniel Jour

Answers:


12

你不。或实际上,您不应该。

如果将应用程序,服务器和网站视为独立的上下文,那么有重复的结构就很有意义。可能是一件好事的原因:

  • 结构相似,但不相同。即使在所有上下文中90%的结构都是相同的。它的10%会让您头痛不已。
  • 模式和实现可能有所不同。当使用不同的语言和框架时,在所有语言和框架中实现相同的实现变得太困难了
  • 共享结构成为依赖项,需要进行管理。拥有共享的依赖关系极大地使开发复杂化,因为在一种情况下发生的巨大变化在另一种情况下发生了巨大的变化。因此需要付出很多努力来协调这种共享依赖的开发
  • 不同的上下文具有不同的部署。即使您确实设法在所有上下文中共享相同的数据结构和相同的验证代码,也仍然可能会在一个上下文的新版本已部署而另一个上下文在旧版本上的情况下进行部署,因此仍然需要在版本中出现不同步的情况被解决

尽管DRY原理令人惊叹,但我认为跨上下文或层共享数据结构会带来更多无法解决的问题。特别是如果项目足够大,以至于不同的人在不同的环境下工作。


5

我认为@Euphoric列出了一些不重复您的代码的充分理由。但是,如果必须这样做,建议您使用代码生成。

查找数据的规范形式

为了有效地做到这一点,您必须首先发现什么是数据的规范形式。是您的SQL模式,还是Java程序中的类?

从中派生(自动)其他形式

之后,设计一种从规范形式生成所有其他形式的方法。例如,假设您的规范形式是SQL模式,则可以轻松地从中生成JavaScript,Java和Python代码(SQL易于解析,并且是规范源的理想选择)。

容纳差异

将生成的代码的各个部分标记为“请勿触摸”应该很容易-这样,您就可以适应所有不同表示形式之间的要求差异(例如:您为JS前端和Java后端编写的自定义代码),需要跨更新保存。
以Git为例;当打开一个编辑器,让你输入提交信息的文件中已经包含了一些文字,但它的# -------- >8 --------标记知道你的内容的目的,并在自动生成的文本开始。

不过,如果可以的话-避免重复。即使您的大多数代码是自动生成的,它也是一个PITA。


这个答案只是一个故事时间,而不是“这里有一些最佳实践”。我所描述的正是我曾经遇到过与您相同的问题并且需要在系统的不同部分中表示相同数据时所做的事情(或者,在两个不同的系统中)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.