问题标签 [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.
c# - 具有第 3 方依赖项的库设计和 DI
我正在编写一个供内部使用的库。这个库的目的是抽象出对一些内部 REST API 的调用。在后台,我使用 Flurl 来提出请求。该库还提供扩展方法来设置 DI(Core Web)以轻松地将所有内容连接在一起(services.AddXYIntegration()
)。在 flurl 的情况下,我的库提供了DefaultHttpClientFactory
(inherits from IHttpClientFactory
) =>的实现X509ClientFactory
。为了避免使用我的库的应用程序的冲突或覆盖 DI,这些应用程序可能也使用 Flurl 进行 https 请求并希望为IHttpClientFactory
我创建一个空接口,只是为了“标记”我的库实现并在 DI 接线中使用它。
一点点代码:
因此,库不是注入X509HttpClientFactory
for ,而是IHttpClientFactory
为IX509HttpClientFactory
. IHttpClientFactory
仍然“可用于”注射。
我的问题不是针对 flurl 的,而是针对类似情况的一般性问题。
这是一个好的设计吗?您如何处理具有可配置的 3rd 方依赖项的这种情况?违反 CA1040 是否可行。
java - 如果存在允许正确处理的重载,catch(Exception) 是否适用于便捷方法?
我正在开发一个用于处理文件的库,并希望使其易于使用(即不必担心异常),但也尽可能完整(即允许适当的异常处理)。
为了实现这一点,我公开了两种方法。一种允许正常捕获异常的方法:
...以及一个使用泛型处理所有异常的方法Consumer<Exception>
:
这背后的意图是,如果您不需要区分异常并且只想在抛出异常时做一件简单的事情(例如打印堆栈跟踪,显示弹出窗口),您可以只使用第二个版本而不必写出一个 try-catch 块(并使单行不可能)。
即使 API 确实公开了一个允许对需要它的人进行适当异常处理的方法,这仍然是不好的做法吗?
c++ - 如果字符串有空格,则引发编译时错误
我有一个基类,旨在由我正在编写的代码的其他用户继承,其中一个抽象函数返回对象的名称。由于项目的性质,名称不能包含空格。
有没有办法在编译时检查Name()
函数的结果是否包含空格?我知道函数可以进行编译时操作,constexpr
但我不确定向代码用户发出信号的正确方法,即他们的函数返回一个顽皮的字符串。
我也不清楚如何让constexpr
编译器实际执行一个函数来执行这样的检查(如果constexpr
是这样的话)。
haskell - 为什么不是扩展 Functor 逆变的 Phantom 类?
我正在玩弄Data.Functor.Contravariant
. 该phantom
方法引起了我的注意:
或者,更具体地说,它的注释:
如果
f
两者兼而有之Functor
,Contravariant
那么当您考虑到每个类的定律时,它实际上就不能以任何有意义的能力使用它的论点。这种方法非常有用。fmap f ≡ phantom
在这两种情况都存在且合法的情况下,我们有以下法律:contramap f ≡ phantom
既然fmap f ≡ contramap f ≡ phantom
,为什么我们需要Contravariant
和Functor
实例?以另一种方式做这件事不是更方便:为一个类创建一个实例Phantom
,它引入了phantom
方法,然后自动推导出?Functor
和的实例Contravariant
在实现and的实例时,我们将让程序员不必重写它phantom
两次(以实现fmap
and contramap
,const phantom
如注释中所述)。我们将允许编写一个实例而不是两个!此外,对我来说,为所有 4 种差异情况都有类似乎很好而且很惯用:, , (然而,有些人建议使用interface 而不是) 和.Contravariant
Functor
Functor
Contravariant
Invariant
Profunctor
Invariant
Phantom
另外,这不是更有效的方法吗?() <$ x $< ()
需要两次遍历(就像我们可以遍历一个幻象函子一样......),只要程序员可以更快地执行这个转换。据我了解,当前phantom
方法不能被覆盖。
那么,为什么库开发者不选择这种方式呢?目前的设计和我所说的设计的优缺点是什么?
c++ - 为什么不制作 { "hello"s + "world"sv; 在 C++20 中有效吗?
见在线演示
为什么不在 "hello"s + "world"sv
C++20 中有效?
c++ - std::span 作为 std::vector 的基类
我目前正在开发一个自定义的 C++ 容器库,std::vector
它std::span
类似于- 类似的论点。std::span
std::vector
我能做的是构造一个类,比如说my_vector
,和另一个my_span
可以从类转换的类my_vector
。这就是 STL 所做的,我知道模仿标准库通常是个好主意。但是我有这个想法,my_span
基本上是my_vector
不拥有内存的,因此可以使用继承来实现这两个类。这是它在代码中的样子。
现在我的同事基于以下原因拒绝了这个想法。公平地说,我对他的反对意见的表述可能并不忠实。
- 在实际容器之前定义跨度是违反直觉的。
- 当派生类扩展时使用继承,但该类
my_vector
的条件是其成员start_
始终为0
. (有一些原因迫使指针data_
总是指向分配内存的开头。这就是为什么我不能只使用指针和跨度的长度。)
另一方面,我相信这种设计有以下好处。
- 如果你仔细想想,
my_vector
仍然是“是一个”my_span
。它只是一个my_span
拥有内存并且可以改变大小的东西。 - 每个在非拥有内存上操作的成员函数只能声明和实现一次;该类
my_vector
自动继承它。 - 要
my_vector
用作my_span
,您无需创建新my_span
实例。向上转换比构造函数更自然。
我还没有看到遵循这种模式的设计,所以我想获得更多关于这是否是一个好的设计的意见。