使用包(宝石,鸡蛋等)创建解耦的架构


10

主要问题

眼看着良好的支持最先进的编程平台有包管理(想想gemnpmpip,等),它是有意义的设计应用程序或系统由内部开发的软件包,从而促进并创建一个松散耦合的架构?

这样的一个示例是创建用于数据库访问以及用于身份验证和系统其他组件的软件包。当然,这些也使用外部程序包。然后,您的系统导入并使用这些软件包-而不是将其代码包含在自己的代码库中。

注意事项

对我来说,这似乎可以促进代码去耦并提高可维护性,几乎是一种基于Web的桌面应用程序方式(更新几乎是自动应用的,单一功能的单一代码库,等等)。

这看起来像是一个合理而理智的设计概念吗?如今,这实际上已用作构建应用程序的标准方法吗?

Answers:


12

我现在已经参与过两次这样的项目(都使用nuget和.NET),总的来说,这是一个好主意。但是您的里程可能会有所不同。

暂时不要认为这是万能药,它可以解决您的所有问题而不会引起新的问题。发布管理将带来全新的复杂性,您将需要处理从未存在过的版本相关性问题,并且您有时因为需要升级四个不同的软件包而不得不做出决定。您需要快速修复并发布的小错误。

另一方面,您说得很对,它可以很好地解耦。除非您做得过多,否则您会发现更多的场合会认为“哦,效果很好”,而不是“付出了很多努力”。如果您在多个应用程序之间共享代码,那么这特别有效,因为您可以轻松地独立升级应用程序。

而且,如果您像我一样,您将快速开始编写使用您的软件包的测试应用程序,以从查找错误的过程中删除整个应用程序层。而且,这本身可以超过成本。


精彩的输入。总的来说,所有事情都应该保持平衡,我喜欢您的评论保持这些立场。很高兴听到您认为它在更多情况下都可以正常工作……而且问题的出现无论如何都是一个常数。我喜欢您关于测试应用程序的技巧:)。+1。
Juan Carlos Coto 2014年

1
我还要补充说,在* nix世界中也有很多项目可以做到这一点。您通常将库与前端,GUI与开发资源等分离开来
David Cowden 2014年

有趣。听起来确实是组织复杂系统的好方法,但我担心这是过度设计的情况。看起来如果谨慎使用,应该不会。谢谢!
Juan Carlos Coto 2014年

3

总而言之,这是一个好主意。您将需要考虑建立一个内部软件包存储库(在Java世界中通常称为“ artifact存储库”,在Python世界中称为“ pypi服务器”),以便将那些您不想要或不能存储的软件包保存在那里。不能以开源形式发布。

正如@pdr所指出的,要准备好拥有自己的依赖地狱,对某个软件包的更改首先需要在另一个软件包中进行另一更改,这意味着不仅要更改一行代码,还要对其进行测试,并可能使更改被接受,构建发布,并将发布上传到上述软件包存储库。然后更改您打算更改的内容。

我可以根据经验为您提供唯一的方法,以尝试将其最小化:不要仅仅依靠将包中的常见概念抽象为“通用”或“框架”包。这似乎是一件很客观的事情,但是这会导致需要频繁,矛盾的变更和发布的怪物包。更好的是,考虑一下系统中的功能,并为每个功能创建一个帮助程序包,就像您在问题中概述的那样。

除此之外,您将获得的主要好处是您的应用程序不受(许多)依赖项的影响,因此您可以轻松进行交换。


很棒的小费。我没有将common软件包视为一种选择,但是,正如您所说,我认为它会成为将来的“合理”决定。我的意图更多地是沿着组件而不是代码行进来-因此,理想情况下,在不同的程序包中不要有太多的代码可以执行相同的操作,因为它们的意思是要执行不同的操作。我猜想,如果程序包之间存在共性,那么这种重复就不会违反良好的编程原则,因为根据定义,这些项目是分开的。
Juan Carlos Coto 2014年
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.