问题标签 [library-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
3722 浏览

c# - 为什么泛型 IList<> 不继承非泛型 IList

IList<T>不继承IListwhereIEnumerable<out T>继承IEnumerable

如果修饰符是唯一的原因,那么为什么(例如,)out的大多数实现都实现了接口。IList<T>Collection<T>List<T>IList

所以任何人都可以说好的,如果该陈述对于所有实现都是正确的,那么在必要时IList<T>直接将其转换为。IList但问题是虽然IList<T>不继承IList,所以不能保证每个IList<T>对象都是IList.

此外 usingIList<object>显然不是解决方案,因为没有out修饰符泛型不能分配给继承较少的类;并且在这里创建 List 的新实例不是解决方案,因为有人可能希望将 实际引用IList<T>IList指针;并且使用List<T>insteed ofIList<T>实际上是一种糟糕的编程习惯,并不能满足所有目的。

如果 .NET 想要提供灵活性,即每个实现IList<T>都不应该有非泛型实现的合同(即IList),那么为什么他们不保留另一个实现泛型和非泛型版本的接口,并且不建议所有具体的想要为通用和非遗传项目收缩的类应该通过该接口收缩。

铸造ICollection<T>toICollectionIDictionary<TKey, TValue>to也会出现同样的问题IDictionary

0 投票
1 回答
2292 浏览

c++ - 为什么是 std::this_thread 命名空间?

std::this_thread 命名空间有技术原因吗?为什么这个命名空间的成员没有被实现为 std::thread 类的静态成员?

0 投票
1 回答
1849 浏览

c++ - 将函数指针作为 API 接口传递给已编译的库

最亲爱的堆栈交换,

我正在编写核磁共振扫描仪。我不会过多介绍背景知识,但我在可以访问多少代码方面受到了相当大的限制,而且事情的设置方式……不是最理想的。我的情况如下:

  • 有一个用 C++ 编写的大型库。它最终会进行“转码”(以最坏的方式),写出DoesThings 的FPGA 程序集。它为“用户空间”提供了一组函数,这些函数被翻译成(通过预处理器宏和黑魔法的混合)16 位和 32 位字的长字符串。这样做的方式容易发生缓冲区溢出,并且通常会摔倒。*
  • 然后,FPGA 组件通过一个美化的串行链路连接到相关电子设备,后者执行它(进行扫描),并再次返回数据进行处理。
  • 程序员应该使用库提供的函数来做他们的事情,在与标准库链接的 C(不是 C++)函数中。不幸的是,就我而言,我需要扩展库。
  • 在您在代码中编写 doSomething() 和实际执行它的相关库函数之间发生了相当复杂的预处理器替换和标记化、调用和(通常)事情链。我想我在某种程度上已经弄清楚了,但这基本上意味着我对任何事情的范围一无所知......

简而言之,我的问题是:

  • 在一个方法的中间,在一个大块的数千行代码的一个很深的黑暗角落里,我几乎无法控制,天知道发生了什么变量范围,我需要:
    • 扩展此方法以将函数指针(指向用户空间函数)作为参数,但是
    • 让这个在库编译后编写的用户空间函数可以访问它出现的方法范围的本地变量,以及调用它的 (C) 函数中的变量。

这似乎是内存管理的绝对泥潭,我想我会在这里询问这些情况下的“最佳实践”,因为我可能会遇到很多微妙的问题——而其他人可能会有很多相关的智慧传授。调试系统是一场噩梦,我并没有真正从扫描仪制造商那里得到任何支持。

我计划如何进行的简要概述如下:

在 .cpp 库中:

占位符函数的要点是,如果用户函数没有链接进来,就让事情继续下去。我知道这可以用 a 代替#DEFINE,但编译器的聪明或愚蠢可能会导致奇怪(至少在我无知的头脑中) 行为。

在 userland 函数中,我们会有类似的东西:

如果这像泥巴一样清楚,请告诉我!非常感谢您的帮助。而且,顺便说一句,我真诚地希望有人能制作一个开放的硬件/源 MRI 系统。

*顺便说一句,这是制造商用来阻止我们首先修改大库的主要理由!

0 投票
2 回答
258 浏览

delphi - 为什么有些字符串例程会给出结果而有些会更改 Delphi 中的原始程序?

令我难以置信的是,我不明白为什么某些(大多数)字符串例程是给出结果的函数,而某些字符串例程是更改原始字符串的过程。

从 S1 将第 3 个位置开始的 2 个字符复制到 S2。

从 S 中删除从第 3 个位置开始的 2 个字符。

我会认为让 Delete (和其他一些)表现得像大多数其他字符串例程一样更一致,所以你可以写:

为什么不是这样?

0 投票
0 回答
432 浏览

c - 使用 C 编程语言的不透明指针与 id 数字的优缺点是什么?

我目前使用不透明指针作为我的标准封装技术,但是查看 OpenGL API 让我认为使用 id 编号可能是更好的选择。我想从经验丰富的 C 程序员那里得到一些建议(我只积极使用该语言大约 2 年)。

以下是我想要确认或纠正的最初想法。

身份证号码的可能优点:

  • 如果使用 id 编号,则在实现中使用对象/内存池相当简单

  • id 号不必映射到系统内存(在 GL 情况下可以参考图形内存)

身份证号码的可能缺点:

  • 使实现稍微复杂一些

考虑到使用共享库的情况,还有一个类似的问题: 我应该为我的不透明对象使用整数 ID 还是指针? 我的问题不是关于共享库,而是关于从用户代码中隐藏实现细节的一般情况。

我想您可以 typedef 一个 MyObjectHandle 以使库能够在 id 号和不透明指针之间切换。

问题是: 使用 C 编程语言的不透明指针与 id 数字的优缺点是什么?

0 投票
1 回答
1019 浏览

c++ - std::multiplies 和 std::divides 是否有任何理由成为第三人称?

今天我们发现用于乘法和除法的函子分别称为std::multipliesand std::divides,而不是例如 std::multiplystd::divide

考虑到这一点,至少可以说这是令人惊讶的,std::plus并且std::minus不是以相同的方式制定的。

有什么特殊的原因造成这种差异吗?

0 投票
4 回答
149 浏览

c# - 你会在这里做什么?返回 null 或抛出异常(框架设计指南)

我正在开发一个 C# .NET Framework 4.0 库。

我有这个代码:

cmd.ExecuteScalar();可以返回 null,但Convert.ToByte(o);返回 0。

如果cmd.ExecuteScalar();返回 null 它是一个错误,因为我要查找的值必须在数据库中。如果该值不在数据库中,则为错误。

你会在这里做什么?返回 null 还是抛出异常?

0 投票
1 回答
110 浏览

scala - 在 Scala 中编写数据库库 - 初始化代码

我想Neo4j用 Scala 语言编写小型数据库库。该库将与Neo4j数据库对话,主要将类映射到节点。我想让它像spray-json图书馆一样工作:https ://github.com/spray/spray-json

无论如何,我想知道一件事,在库中实现初始化代码的最佳方法是什么?

例如,Spring Data Neo4j当您使用Neo4jbean 创建应用程序上下文时,该行会调用一些基于注释val ctx = new ClassPathXmlApplicationContext(...)创建索引的代码。Neo4j

是否应该通过在构造函数/工厂方法中使用静态方法来实现这样的步骤(Scala其中可能是一些伴随对象)?如果是这样,如果我不想显式调用初始化代码,我将如何进行,这意味着我第一次使用库初始化中的某些内容时会发生但它被缓存在某处 - 我正在考虑使用惰性 vals 来存储我的库所需的信息在这种情况下。

0 投票
0 回答
41 浏览

javascript - 在 JavaScript 中创建库 - 为所有函数设置相对于实例的“this”关键字

我已经开发了一个库的草稿,并且来自 OOP Java 背景,在设置/访问正确的“this”-keyword 时遇到问题。

每个实例都链接到一个画布,它使用各种设置来绘制它,像这样实例化(命令返回this,所以可链接):

对象的功能在原型属性中设置:

我的主要问题是确保this的值是相关对象,因为我希望将某些功能作为回调调用。

为了设置 this 我在构造函数中绑定它们,它替换了对象的现有函数:

这是行不通的,因为它改变了实际的原型函数,而且你只能绑定一个函数一次,它不能用于多个实例。

编辑:构造函数看起来像这样

我的问题:有没有一种简单的方法可以在不覆盖原型方法的情况下绑定它?或者,我是否必须在构造函数中声明要绑定到当前实例的所有函数?

任何帮助将非常感激!

0 投票
7 回答
3942 浏览

c++ - 库设计:允许用户在“仅标题”和动态链接之间做出决定?

我已经创建了几个 C++ 库,它们目前是header-only。我的类的接口和实现都写在同一个.hpp文件中。

我最近开始认为这种设计不是很好:

  1. 如果用户想要编译库并动态链接它,他/她不能。
  2. 更改单行代码需要完全重新编译依赖于库的现有项目。

不过,我真的很喜欢仅标头库的各个方面:所有函​​数都可能被内联,并且它们非常容易包含在您的项目中 - 无需编译/链接任何东西,只需一个简单的#include指令。

有没有可能两全其美?我的意思是 - 允许用户选择他/她想如何使用图书馆。它还将加快开发速度,因为我会在“动态链接模式”下处理库以避免荒谬的编译时间,并以“仅头文件模式”发布我的成品以最大限度地提高性能。

第一个逻辑步骤是在文件中划分接口.hpp和实现。.inl

不过,我不确定如何前进。我已经看到许多库LIBRARY_API在它们的函数/类声明之前添加了宏——也许需要类似的东西来允许用户选择?


我所有的库函数都以inline关键字为前缀,以避免“...的多重定义”错误。我假设关键字将被文件LIBRARY_INLINE中的宏替换.inl?该宏将解析inline为“仅标题模式”,而对于“动态链接模式”则没有。