您如何决定是使用库还是编写自己的实现

Chs*_*y76 17 coding-style

灵感来自这个无辜地开始但正在变成一场大火焰战争的问题.

假设您需要一种实用方法 - 相当简单,但不是单行.引用的问题是如何重复X次字符串.您如何决定是使用第三方实施还是自己编写?

第三方方法的明显缺点是您正在为代码添加依赖项.但是如果你自己编写,你需要对它进行编码,测试它,(也许)对它进行分析,这样你最终可能会花费更多的时间.

我知道决定本身是主观的,但你用来达到它的标准不应该是.

那么,您使用什么标准来决定何时编写自己的代码?

Dav*_*vis 18

一般决定

在决定使用什么之前,我将创建一个库必须满足的标准列表.这可能包括大小,简单性,集成点,速度,问题复杂性,依赖性,外部约束和许可证.根据具体情况,决策所涉及的因素会有所不同.

通常,我会在编写自己的实现之前寻找合适的库来解决问题.如果我必须自己编写,我将阅读适当的算法并从其他实现中寻找想法(例如,使用不同的语言).

如果,在下面描述的所有方面之后,我找不到合适的库或源代码,并且我已经搜索(并在合适的论坛上询问),那么我将开发自己的实现.

复杂

如果任务相对简单(例如,MultiValueMap类),那么:

  1. 查找现有的开源实现.
  2. 整合代码.
  3. 如果它过多,重写它,或将其修剪下来.

如果任务很复杂(例如,灵活的面向对象的图形库),那么:

  1. 找到一个编译(开箱即用)的开源实现.
  2. 执行"Hello,world!" 当量.
  3. 根据需要执行任何其他评估.
  4. 根据问题域标准确定其适用性.

速度

如果库太慢,那么:

  1. 简介它.
  2. 优化它.
  3. 将结果返回给社区.

如果代码太复杂而无法优化,速度是一个因素,请与社区讨论并提供分析详细信息.否则,寻找一个等效但更快(可能更少功能丰富)的库.

API

如果API不简单,那么:

  • 写一个门面并将其贡献给社区.
  • 或者找一个更简单的API.

尺寸

如果编译的库太大,那么:

  • 仅编译必要的源文件.
  • 或者找一个较小的图书馆.

错误

如果库没有开箱即用,请寻找替代方案.

依赖

如果图书馆依赖于外部图书馆的分数,请寻求替代方案.

文档

如果没有足够的文档(例如,用户手册,安装指南,示例,源代码注释),请寻找替代方案.

时间限制

如果有足够的时间找到最佳解决方案,那么就这样做.通常没有足够的时间从头开始编写.通常会有许多类似的库来评估.请记住,通过细致的松耦合,您可以随时将一个库换成另一个库.找到最初有效的方法,如果以后成为负担,请更换它.

发展环境

如果库与特定开发环境相关联,请寻求替代方案.

执照

开源.

  • 如果非GPL,许可恕我直言将是最好的. (3认同)

mik*_*iku 6

10个问题......

+++(使用库)...... ---(写自己的库)

  1. 图书馆正是我需要的吗?可以通过几个步骤进行定制?+++
  2. 它几乎提供所有功能吗?容易扩展?+++
  3. 没时间?+++
  4. 一半是好的,与其他人一起玩得很好?++
  5. 难以扩展,但优秀的文档?++
  6. 难以扩展,但大部分功能?+
  7. 功能还好,但过时了吗? -
  8. 功能好,但奇怪(疯狂的界面,不健壮,......)? -
  9. 图书馆工作,但需要决定的人是hybris的状态?---
  10. 库工作,可管理的代码大小,组合需求更新?---

一些想法......

如果它是小而有用的东西,也可能对其他人来说,那么为什么现在写一个库并把它放在网上.发布这种小型库的成本下降,以及其他人调整的障碍(见bitbucketgithub).那么标准是什么?

也许它不应该完全复制现有的已知库.如果它复制了现有的东西,它应该从新的角度解决问题,或者更好的是它应该提供更短或更精简的*解决方案.

*/有趣


Amb*_*ber 5

如果它是一个微不足道的函数,那么就不值得引入整个库。

如果它是一个不平凡的功能,那么它可能是值得的。

如果它是多个功能,并且可以通过拉入单个库来处理,那么它几乎绝对是值得的。