Wikibase数据模型服务

我很高兴地宣布,一款新的维基数据库图书馆:Wikibase数据模型服务(我将在本文中称之为DMS)。

图书馆背后的原理

引入这个新库的主要动机是减少技术债务,并在Wikibase代码中划定更坚实的架构边界。

在Wikibase项目开始时,我们将所有代码都保存在Wikibase.git存储库中。这可以细分为三大部分:Wikibase Repository(MediaWiki扩展)、Wikibase Client(MediaWiki扩展)和Wikibase Lib。后者用于保存Wikibase Client和Wikibase Repository所需的代码。虽然表面上这是一个合理的想法,但不幸的是,很多事情都可能出错。代码中没有创建真正的边界,导致了一个紧密耦合的blob,它甚至包括Wikibase Client和Wikibase Repository上的全局状态和循环依赖关系。对于应该或可以进入Wikibase Lib的内容,也没有签订合同。只添加了一个MediaWiki扩展所需的内容,因为它们在其他地方可能有用,而在其中一个扩展中保留了类似的代码。

项目进行大约一年后,我们意识到事情正朝着错误的方向发展。尽管在问题的严重程度上存在一些分歧,但随着时间的推移,消除Wikibase Lib的共识出现了。第一步是提取Wikibase数据模型这导致movedout代码的质量大大提高,远远超过了剩下的代码。这为创建其他组件(例如Wikibase DataModel序列化它取代了一大块Wikibase Lib代码。不幸的是,WikibaseLib中的许多代码并不属于像序列化组件那样具有内聚性的整体。这导致这样的代码没有被移出,实际上,随着时间的推移,许多新类被添加到Wikibase Lib中,这几乎否定了提取工作。

考虑到人们引入Wikibase Client和Wikibase Repository所需的新代码所面临的困境,这并不难理解。它要么需要进入Wikibase Lib,要么需要进入依赖关系图下面的组件,比如Wikibase DataModel。我当然已经在Wikibase DataModel中添加了几个类,因为这似乎是当时放置它们的最佳位置,并且使用了与DataModel相关的服务来污染此组件,但这些服务并不需要定义数据模型本身。第三个代码被错误地发现的地方是MediaWiki扩展本身。处理域逻辑或其他独立于应用程序的代码最好避免框架绑定。

所有这些都建议在Wikibase DataModel和MediaWiki扩展之间创建一个新库。一个库,用于收集无法为其创建内聚组件或创建不合理的功能。一个问题马上浮现出来:这个新的通用图书馆会不会像Wikibase Lib一样成为一个垃圾场和一团烂泥?为了避免任何此类命运,我们仔细定义了在允许代码进入组件之前必须满足的需求代码。此类代码必须…

  • 正在使用Wikibase DataModel
  • 不属于更特定的组件(例如序列化组件)
  • 不向该组件引入严重依赖项(数据库、框架、大型库等)
  • 不是演示代码

当前状态:Wikibase DataModel Services 1.1

第三方对这个库特别感兴趣,因为它可以重用以前绑定到Wikibase客户端和Wikibase存储库MediaWiki扩展的代码。以下列表包含新可用的类和接口:

  • DataValue\ValuesFinder
  • 实体\实体预取器
  • 实体\实体重定向ResolvingDecorator
  • 实体\NullEntityPrefetcher
  • EntityId\ EntityId格式设置工具
  • EntityId\ EntityId标签格式设置工具
  • EntityId\ EscapingEntityId格式设置工具
  • EntityId\PlainEntityId格式设置工具
  • 实体Id\后缀实体IdParser
  • 查找\实体查找
  • 查找\实体重定向查找
  • 查找\实体检索数据类型查找
  • 查找\实体检索Term查找
  • 查找\标签描述查找
  • 查找\语言标签描述查找
  • 查找\术语查找
  • 语句\语句GuidValidator
  • Tern\属性标签解析程序
  • 术语\术语缓冲区

这些都是从Wikibase Lib中删除的。DMS还包含以前存在于Wikibase DataModel中的代码,并在版本4.0中移出:

  • 中的实体差异和修补功能服务\差异
  • 实体IdParser和中的基本实现服务\实体ID
  • ItemLookup(项目查找),属性查找属性数据类型查找接口
  • 中的语句GUID分析器和生成器服务\声明
  • 按PropertyIdGrouper

走向未来!

我们从Wikibase Lib中迁移的大约20个类和接口只是一个开始。我们正在采取增量方法来移动代码,以避免需要维护两个副本,并将更改从Wikibase Lib同步到其移动的副本。因此,在不久的将来可能会发布具有附加功能的新版本。

其他Wikibase库,贡献是非常受欢迎的,并且可以在没有太多设置工作或需要了解整个代码库的情况下完成。您可以在其README文件。与库用户相关的更改总是在发布-注释.

关于的3个想法“Wikibase数据模型服务”

  1. 恭喜,为其他软件提供这样的组件真是太棒了🙂

    谈到重用:我喜欢Wikidata中的Lua接口🙂 这将考虑格式化程序等因素,并使Wikidata更加一致,允许社区进行更多测试、格式化等…

留下回复

该网站使用Akismet来减少垃圾邮件。了解如何处理您的评论数据.