Questions tagged «third-party-libraries»

10
使用第三方库-始终使用包装器吗?
我参与的大多数项目都使用几个开源组件。作为一般原则,是否始终避免将代码的所有组件绑定到第三方库,而是通过封装包装器来避免更改的痛苦,是一个好主意吗? 例如,我们的大多数PHP项目都直接使用log4php作为日志记录框架,即通过\ Logger :: getLogger()实例化,它们使用-> info()或-> warn()方法,等等。在将来,但是,可能会出现一个假设的日志记录框架,该框架在某种程度上会更好。就目前而言,与log4php方法签名紧密相关的所有项目都必须在许多地方进行更改,以适应新的签名。显然,这将对代码库产生广泛的影响,任何更改都是潜在的问题。 对于这种情况下的面向未来的新代码库,我经常考虑(有时实现)包装器类来封装日志记录功能,并使其(尽管并非万无一失)更容易以最小的更改来改变日志记录的工作方式; 代码调用包装器,包装器将调用传递给日志框架du jour。 请记住,其他库中有更复杂的示例,我是否过度设计还是在大多数情况下是明智的预防措施? 编辑:更多考虑-使用依赖注入和测试加倍实际上要求我们无论如何都要抽象出大多数API(“我想检查我的代码是否执行并更新其状态,但不写日志注释/访问真实数据库”)。这不是决定者吗?

13
我老板的坏案是“这里没有发明”
我的部门专门致力于将客户数据转换为我们的数据库架构,以便他们可以使用我们的软件。 现在,我们有一些C#应用程序IDataReader(占99%的时间SqlDataReader),执行一些清理和映射,将其插入到DataRow对象中,然后使用将SqlBulkCopy其插入到我们的数据库中。 有时(尤其是当源数据库包含图像作为varbinary对象时),此过程实际上可能陷入从服务器到应用程序的SQL传输,然后又转过来再返回到服务器。 我觉得,如果我们将某些转换重写为SSIS软件包,则可以大大加快转换速度。但是,我遇到的最大障碍是当我的老板以“在这里没有发明”的方式退缩并说:“如果Microsoft放弃对SSIS的支持,那该怎么办?我们将拥有所有这些过时的代码,并且将被搞砸。” 这不是我第一次点击“如果他们删除了该功能...?” 我老板的回答。我没有时间以旧的方式编写转换,自我学习SSIS,也没有以新的方式编写它来演示/测试收益(我们都没有人使用过SSIS,所以会有一段时间必须学习如何使用它)。 在这种情况下我该怎么办?停止推广新技术?等到他离开部门后(我是继他之后部门中第二高的人,但是离职/退休可能还需要几年时间)?寻找一种新方法让他停止害怕第三方工具?

6
如何应对依赖依赖的恐惧
我所在的团队创建了可供公司合作伙伴用来与我们的平台集成的组件。 因此,我同意在引入(第三方)依赖项时应格外小心。当前,我们没有第三方依赖项,我们必须保持框架的最低API级别。 一些例子: 我们被迫停留在框架的最低API级别(.NET标准)上。其背后的原因是,有一天可能会出现一个仅支持非常低的API级别的新平台。 我们已经实现了自己的用于(反)序列化JSON的组件,并且正在对JWT进行同样的处理。在更高级别的框架API上可用。 我们已经围绕标准库的HTTP框架实现了包装器,因为我们不想依赖于标准库的HTTP实现。 同样,出于同样的原因,所有用于映射到XML或从XML映射的代码都是“手工”编写的。 我觉得我们走得太远了。我想知道如何处理这个问题,因为这会极大影响我们的速度。

7
项目经理选择了一个过于复杂的设置,没有人有经验
最近,我启动了一个看起来并不难做的项目,这个概念是一个相当简单的应用程序,它必须不时地(也许一天10次)接受输入,并尝试对其执行一些操作并收集所有结果在末尾。然后,该应用程序将获得一个前端Web门户,供客户用来查看结果,而不是精确地了解火箭科学。 为此,我最初巧妙地使用了Python的内置并发库(ThreadPoolExecutor),并为前端使用了易于使用的库(我选择Flask是因为它对于初学者来说很容易,并且相对易于维护和测试)。 一旦我们完成了项目,项目经理表示我们必须使用第三方消息队列功能而不是线程,并且必须实现负载平衡,最终发生的事情是,我们最终开始与Celery,Redis,RabbitMQ,Nginx,uWSGI合作以及其他很多没有任何实际经验的大型第三方服务。 最终,这导致了许多意大利面条式代码,无法测试的任务(由于第三方库的复杂性,对代码进行修补甚至无法正常工作)和许多麻烦,因为没人知道这些服务的附加价值是什么。 。 在您说“是的,您应该使用那些服务”之前,请记住,除了引入竞争条件困扰的代码之外,没有人知道如何使用这些服务,甚至不知道他们的工作。 我该怎么办?在这一点上,即使现在最终产品的状况比开始时要差,恢复到原来的状态也太昂贵了,并且PM陷入了使用这些服务的僵局。与他讨论这件事还有什么用吗?我需要更多时间吗?还是苛刻的答案,我对工作太傻了吗?

12
如何使您的第三方库保持最新状态?
假设我有一个依赖于10个库的项目,并且在项目的主干中,我可以自由使用这些库的任何版本。因此,我从最新版本开始。然后,每个这些库每月平均更新一次。现在,要使行李箱保持最新状态,则需要每三天更新一次图书馆参考。 这显然太多了。尽管通常1.2.3版是1.2.2版的直接替代品,但如果不进行测试就不会知道。单元测试还不够;如果是DB /文件引擎,则必须确保它与使用较旧版本创建的文件一起正常工作,反之亦然。如果与GUI有关,则必须目视检查所有内容。等等。 您如何处理?一些可能的方法: 如果它还没有坏,那就不要修复它。只要您在应用程序中使用它时没有发现任何问题,就可以使用当前版本的库,无论库供应商多久发布一次更新。微小的增量更改只是浪费。 经常更新以使更改保持较小。由于无论如何都需要进行某天的更新,因此最好经常进行更新,以便在易于修复的情况下及早发现任何问题,而不是跳过多个版本并让潜在的问题积累。 介于两者之间。有一个甜蜜的地方吗?

1
Vanilla JS是否仍被视为库?
最近,我发现VanillaJS(文档?)是一个仅与99%的浏览器捆绑在一起的库,并且不完全是本机JavaScript(我一生的震惊)。在编写自己的库时,我通常会避免所有有用的事情,主要是库。现在我有三个问题: VanillaJS仍然被认为是库吗? 没有VanillaJS,有没有办法对DOM做任何事情? 是基于VanillaJS或本地JS的主要库(无文档资料)

4
如何减少用较大的对象模型包装第三方库的手动工作?
就像2012年这个问题 的作者和2013年这个问题的作者一样,我有一个第三方库,需要对其进行包装以正确测试我的应用程序。最高答案指出: 您始终希望将第三方类型和方法包装在接口后面。这可能是乏味且痛苦的。有时,您可以编写代码生成器或使用工具来执行此操作。 就我而言,该库用于对象模型,因此具有大量的类和方法,这些类和方法需要包装才能使该策略成功。除了“繁琐而痛苦”之外,这也成为测试的硬障碍。 自提出这个问题以来的四年中,我知道隔离框架已经走了很长一段路。我的问题是:现在是否存在一种更简单的方法来实现完全包装第三方库的效果?我如何摆脱这一过程中的痛苦并减少手工工作? 我的问题不是我最初链接的问题的重复,因为我的问题是减少手工包装的工作。这些其他问题仅询问包装是否有意义,而不是如何减少工作量。

5
我应该在实现之前编写接口API吗?
最近,我一直在研究更多的“有组织的”编程,并且我一直在学习应该对接口而不是对实现进行编程。考虑到这一点,在可能的情况下为项目编写实现之前,最好在接口中“略过”项目吗? 如果是这种情况,那么在使用第三方库(即Lidgren)的情况下,我是否也应该将它们包装在接口中并通过IOC容器进行解析,还是可以将它们公开给接口?

1
包括开源软件的许可要求
在一个开放源代码项目中,已经包含了许多其他开放源代码库来实现所需的功能,有些作为库(LGPL),有些作为源代码(非LGPL)。为该项目选择了新的BSD许可证。包含的开放源代码库已获得新的BSD,MIT,Apache和LGPL许可,但没有GPL许可代码。 这些其他开放源代码库应如何入账? 是否所有库许可证都需要包含在主项目许可证文件中? 仅在“帮助”->“关于”对话框和文档中提供指向项目网站的链接就足够了吗? 真的需要信贷吗?

3
如何使参数保持低计数并仍保持第三方依存关系独立?
我使用第三方图书馆。他们向我传递了一个POJO,出于我们的意图和目的,可能是这样实现的: public class OurData { private String foo; private String bar; private String baz; private String quux; // A lot more than this // IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR OurData(/* I don't know what they do */) { // some stuff } public String getFoo() { …

6
作为一名初学者,我应该更喜欢使用第3方库来构建自己的库吗?
作为Python的初级程序员,在跳到包含所需功能的高级第三方库之前,先构建并了解我自己的库是个好主意吗? 对于这种方法,某些项目(例如Django之类的Web框架)可能太大。但是其他项目(例如Web Crawlers,图形库,HTML解析器)似乎是可行的。 我担心过早依赖第三方库会阻碍我的成长。 注意:这个问题和这个问题似乎更侧重于经验丰富的程序员,他们可能更注重重用的效率,而不是学习的好处。我认为我的问题是针对初学者的。

2
如果有两种处理任务的方法,应该如何选择呢?
我有一个特定的用例,并发现了在Internet上进行三种方法的定义,这些方法是针对模糊的用例定义的。我盯着这三个要应用的问题。 我倾向于坐在那里,不知道该怎么做-然后什么也不做...是否有选择的好方法?我应该尝试所有这些吗? 为了在某​​些情况下更具体,我正在尝试制作一个非常轻巧的棋盘游戏,在其中我需要屏幕的一部分,可以旋转棋盘游戏网格,放大到网格并在该网格上移动棋子。我不知道如何执行此操作,但是我在网上找到了诸如Core Animation,Core Graphics,Sprite Kit之类的东西,并且看到了支持和反对它们的理由-例如Sprite kit是高级别的,但是将帧频保持在60,当屏幕上没有任何实际动静时,会浪费电池。Core Animation是一个较低级别的API,它反对Apple提出的“采用最高级别的抽象”的指导。我不想学习3件事。1.有没有办法我可以选择并摆脱困境? 我故意将此问题保留为一个模糊的问题,因为我认为它适用于整个软件领域。

3
第一方和第二方是谁?
因此,这纯属好奇。我已经听过“第三方”一词,就像在“第三方库”中一样。 我不知道为什么我们说第三而不是第二(或第四)? 第一方和第二方是谁,该术语来自哪里?

3
两个组件提供相同的功能,但依赖关系不同
我正在使用Zend Framework 1和Doctrine2作为ORM层在PHP中构建应用程序。一切进展顺利。现在,我偶然发现ZF1和Doctrine2都附带并依赖于它们自己的缓存实现。我对两者都进行了评估,虽然每个人都有自己的优点和缺点,但就我的简单需求而言,它们都不比其他人优越。这两个库似乎都是针对各自的接口而不是针对其实现编写的。 我之所以认为这是一个问题,是因为在应用程序的引导过程中,我必须配置两个缓存驱动程序-每个都有自己的语法。这样很容易造成不匹配,因此,与缓存后端建立两个连接的效率很低。 我正在尝试确定最佳的前进方式,并欢迎您可能提供的任何见解。 到目前为止,我想到的是四个选择: 不执行任何操作,请接受存在两个提供缓存功能的类。 创建一个Facade类,将Zend的接口粘贴到Doctrine的缓存实现上。 选项2的另一种方法-创建一个Facade,以在Zend Framework后端上映射Doctrine的界面。 使用多接口继承创建一个接口来统治所有接口,并祈祷不存在任何重叠(即:如果两个都有“保存”方法,由于PHP的原因,它们将需要以相同的顺序接受参数)缺乏适当的多态性)。 哪个选项是最佳选择,或者我不知道有没有“以上所述”变体?
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.