问题标签 [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 投票
13 回答
1705 浏览

c++ - 是否需要 C++ 中的#includes 的特定顺序是不良库/头文件设计的标志?

我使用了一些非常大规模的系统,从未见过所需的订单,但最近遇到了。STL 或 STD 库甚至 Boost 是否存在某些包含必须以特定顺序出现的情况?

0 投票
2 回答
7985 浏览

c++ - 为什么 std::fstream 以它的方式设置 EOF 位?

我最近遇到了一个由使用 fstream::eof() 引起的问题。我从这里读到以下行:

如果已到达相关输入文件的末尾,则函数 eof() 返回 true,否则返回 false。

并且(错误地)假设这意味着如果我使用 fstream::read() 并读取文件末尾,函数 eof() 会告诉我。所以我做了这样的事情(非常笼统):

问题的出现是因为稍后在上面链接的页面上解释的内容(由于第一段的误导,我最初没有阅读):

相反,如果在最后一个标记之后碰巧有任何空格,则流不会进入 EOF 状态,但尝试读取另一个标记仍然会失败。因此,EOF 标志不能用作循环中的测试,该循环旨在读取所有流内容,直到 EOF。相反,应该在尝试读取后检查失败情况。

所以我改变了,现在我的循环检查 file.fail() 而不是 file.eof(),我了解 eof() 是如何工作的。我的问题是,为什么它会这样工作?是否存在需要这样做的情况?在我看来,一旦你通过了 EOF,你就通过了 EOF,并且 eof() 应该返回 true。

更新 感谢您的回复,我想我明白了。我正在执行的唯一操作是read(),我立即检查fail(),所以我认为我没问题。现在,我的问题是,我使用 eof() 做什么?

0 投票
3 回答
439 浏览

oop - 一些可重用代码的架构

我正在编写一些小型、简单的应用程序,它们共享一个共同的结构,并且需要以相同的方式做一些相同的事情(例如日志记录、数据库连接设置、环境设置),我正在寻找一些关于构建可重复使用的组件。代码是用强类型和静态类型的语言编写的(例如 Java 或 C#,我必须在这两种语言中都解决这个问题)。目前我有这个:

有没有更好的办法?也许如下?我很难权衡取舍...

一个明显的权衡是,使用选项 2,“框架”无法将应用程序包装在 try-catch 块中......

0 投票
6 回答
4703 浏览

.net - 为什么 .Net 框架没有优先级队列类?

Stack Overflow 上有一些线程处理在 .Net 和 C# 中实现优先级队列

我的问题具有更基本的性质:为什么 .Net 框架中没有开箱即用的优先级队列?甚至 C++ 标准库也有一个。

0 投票
5 回答
609 浏览

.net - .NET 中的只读/常量在哪里?

在 C++ 中,您将void func(const T& t)随处可见。但是,我在 .NET 中没有看到任何类似的东西。为什么?

我注意到大量使用 struct 的参数。但我看不到带有只读/常量的函数。事实上,现在我试过了,我无法使用这些关键字来创建一个承诺不修改传入列表的函数。有没有办法向调用者承诺这个函数永远不会修改列表的内容?有没有办法说调用代码并说这个列表永远不应该被修改?(我知道我可以克隆列表或查看文档,但有时我喜欢编译错误)

0 投票
2 回答
1067 浏览

python - 我应该如何为我的 python 应用程序构建一个简单的数据库包?

我正在使用 sqlite3 作为基础为我的应用程序构建一个数据库库。我想像这样构造它:

所以我会在 Python 中这样做:

关于如何处理数据库连接,我正在遭受分析瘫痪(哦,不!)。我真的不想在这些模块中使用类,能够创建一堆可以以相同方式操作同一个数据库的“用户”对象似乎并不合适——所以继承一个连接是不行。

我是否应该与所有模块使用的数据库建立一个全局连接,然后将其放入每个模块中:

或者我应该为每个模块创建一个新的连接并保持它活着?

或者我应该为每笔交易创建一个新的连接?

这些数据库连接应该如何使用?游标对象也是如此:我是否为每个事务创建一个新游标?为每个数据库连接创建一个?

0 投票
9 回答
8001 浏览

c++ - 用 C 和 C++ 接口编写库,用哪种方式包装?

在准备一个库(我们称之为 libfoo)时,我发现自己面临以下两难境地:我是否将其编写为带有 C 包装器的 C++ 库:

还是将其编写为带有 C++ 包装器的 C 库更好:

你更喜欢哪个?为什么?我喜欢后者,因为这意味着我不必担心我的 C 函数会意外出现异常,而且我更喜欢 C 作为一门语言,因为我觉得它是一个较小的语义雷区。其他人怎么想?

编辑:这么多好的答案。谢谢大家。很遗憾,我只能接受一个。

0 投票
3 回答
488 浏览

.net - Reusable Class Library - INotifyPropertyChanged

I am developing a WPF application in which it will reference a class library that contains mostly business objects and some methods to manipulate those objects. Since this library is being used in conjunction with WPF, I have the need to use the INotifyPropertyChanged interface.

However, I do see future uses in the library which may not specifically rely on WPF (or posses the need for property change notifications) as the presentation layer. In your professional experience, would it be better to omit the interface to ensure the DLL is "clean" from unnecessary code for future uses by finding an alternative method, or use the interface and move on?

(obviously, this could be applied to a variety of other programming practices).

Thanks.

0 投票
3 回答
181 浏览

javascript - 是否有一个事实上的标准来识别要附加到 JavaScript 库的 HTML 元素?

我正在创建一个 JavaScript 库。这个库会将自己附加到 HTML 文档中的一个或多个 div。我想自动附加以方便用户集成库。对于 HTML 元素如何以这种方式向库标识自己,是否有事实上的标准或最佳实践?现在,我查找 ID 以某个前缀开头的所有元素,例如 id="fooLibDiv1" 或 "fooLibMyDiv" 等等。这感觉很脆弱。寻找像 'attachFooLib="yes"' 这样的非标准属性会更好吗?或者寻找特定的 CSS 类?等等。

(FWIW,我不想要求我的用户使用 jQuery。另外:不要在这里寻找代码,而应该是正确的设计方法。)

0 投票
5 回答
506 浏览

c++ - 通过自由函数或成员函数进行扩展的机制

包含标准的大量 C++ 库允许您调整对象以在库中使用。选择通常是在同一命名空间中的成员函数或自由函数之间。

我想知道用于调度调用这些“扩展”函数之一的库代码的机制和构造,我知道这个决定必须在编译期间进行并且涉及模板。以下运行时伪代码是不可能的/无意义的,原因超出了这个问题的范围。

上面的代码看起来像运行时代码:/。那么,库如何确定一个类所在的命名空间,它如何检测这三个条件,还有哪些需要避免的陷阱。

我提出问题的动机是让我能够在库中找到调度块,并能够在我自己的代码中使用这些构造。因此,详细的答案将有所帮助。

!!赢得赏金!!

好的,根据史蒂夫的回答(和评论),ADL 和 SFINAE 是在编译时连接调度的关键结构。我的头围绕着 ADL(最初)和 SFINAE(再次粗略)。但我不知道他们如何以我认为他们应该的方式一起编排。

我想看一个说明性示例,说明如何将这两个结构放在一起,以便库可以在编译时选择是调用对象中用户提供的成员函数,还是调用同一对象命名空间中提供的用户提供的自由函数。这应该只使用上面的两个结构来完成,而不是任何类型的运行时调度。

假设有问题的对象被调用NS::Car,并且该对象需要提供 的行为MoveForward(int units)作为 c 的成员函数。如果要从对象的命名空间中获取行为,它可能看起来像MoveForward(const Car & car_, int units). 让我们定义要调度的函数mover(NS::direction d, const NS::vehicle & v_),其中方向是枚举,v_ 是 的基类NS::car