问题标签 [design-decisions]

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 投票
1 回答
4669 浏览

.net - .NET Tuple 和 Equals 性能

这是我直到今天才注意到的。显然,当执行基于相等的操作时Tuple<T>,经常使用的元组类(等)的 .NET 实现会导致值类型Tuple<T1, T2>的装箱惩罚。

以下是该类在框架中的实现方式(来自 ILSpy 的源代码):

我看到的问题是它会导致两个阶段的装箱拆箱,比如Equals调用,一是在comparer.Equals哪个盒子上装箱,二是EqualityComparer<object>调用非泛型 Equals,而非泛型的调用又必须在内部将项目拆箱为原始类型。

相反,他们为什么不做类似的事情:

我很惊讶地看到在 .NET 元组类中以这种方式实现了相等性。我在其中一个字典中使用元组类型作为键。

是否有任何理由必须按照第一个代码中所示的方式实现这一点?在这种情况下使用这个类有点令人沮丧。

我不认为代码重构和非重复数据应该是主要问题。同样的非泛型/装箱实现也落后IStructuralComparable了,但由于IStructuralComparable.CompareTo使用较少,所以它经常不是问题。


我用第三种方法对上述两种方法进行了基准测试,第三种方法仍然不那么费力,就像这样(只有要领):

对于几个Tuple<DateTime, DateTime>字段,有 1000000 次Equals调用。这是结果:

第一种方法(原始 .NET 实现)- 310 毫秒

第二种方法 - 60 毫秒

第三种方法 - 130 毫秒

默认实现比最优解决方案慢大约 4-5 倍。

0 投票
1 回答
824 浏览

precision - IEEE-754 单精度和双精度格式是如何确定的?

我对如何确定这些感兴趣:

  1. 单精度有:8 位 e 和其余(23 位)是尾数
  2. 双精度:11 位 e 和其余(52 位)是尾数 ofc 有 1 位符号。

那么如何确定尾数的位数,以及e的位数。我想这是菜鸟问题,但我想知道答案。

0 投票
1 回答
504 浏览

java - 为什么允许单个 EJB 会话 bean 有多个接口?

我正在从EJB 3 in Action一书中了解 EJB 3.0 。在会话 bean 的剖析部分中提到:

客户端调用 bean 的接口称为业务接口。该接口本质上定义了适合通过特定访问机制进行访问的 bean 方法。现在要注意的有趣的事情是单个 EJB 可以有多个接口这一事实。换句话说,EJB 实现类可以是多态的,这意味着使用不同接口的不同客户端可以以完全不同的方式使用它们。

我想了解为什么允许单个 EJB 具有多个接口的设计决策的原因?帮助理解此处概念的示例将非常有帮助。

0 投票
3 回答
1874 浏览

dom - 为什么 window.parent 会自引用?

我从文档和几个相关的 StackOverflow 帖子中了解到,如果没有其他父级,window.parent 将自我引用,因此永远不会被定义。

我似乎找不到一个正当的理由来解释为什么会这样。JavaScript 确实有它的特性,但这个特性看起来很奇怪。

MSDN简单地指出

如果当前窗口没有父窗口,即占据了整个浏览器窗口,则 Parent 返回当前窗口的 Window 对象。

MDN状态

如果窗口没有父窗口,则其父属性是对自身的引用。

以及W3 标准本身

Window 对象的 parent 属性的值必须是父文档的 Window 对象,如果没有父文档,则该文档的 Window 对象

我还没有看到其他语言有这样的行为,这种自引用设计的原因是什么?当您点击窗口中最顶部的元素时,'null' 或 'undefined' 会不会造成更明显的情况?

所以为什么?

0 投票
2 回答
222 浏览

c++ - 决策、复杂条件和规划 易于维护

我正在尝试找到一种优雅的方式来实现易于维护的决策算法,因为决策条件可能经常变化。

我将在这里尝试更具体的示例:

假设我正在尝试管理餐厅厨房中的烹饪厨师团队。

每个厨师都知道如何烹制 3 种派:苹果派、南瓜派和覆盆子派以及 2 种比萨:奶酪比萨和培根比萨。他们都知道如何烹饪所有东西。

现在,我想向这些主管发送订单,告知客户即将发生的事情。

条件是:

酋长一次只能做一个馅饼。例如,如果我命令厨师做苹果派,我不能命令他做覆盆子派或南瓜派,除非苹果派做好或我发送了取消苹果派的请求。

考虑到为不同的客户,我可以要求厨师一次最多做 5 个比萨饼。

我想创建一个算法,返回我被允许发送给特定厨师的一组订单,关于他已经在做什么。

我正在使用 c++。我可以写一个简单的 switch/case 语句,但是如果条件改变或添加新的馅饼,维护将并不容易,所以......

我有点卡住了,真的不知道如何封装条件和决策以减少条件之间的耦合,并允许在馅饼烹饪条件下轻松维护。

你将如何处理复杂的决策算法实现?

0 投票
2 回答
47 浏览

sql - 我应该为我的事务日志选择哪个数据库

我有一个数据库问题。我正在开发一个应用程序,用户可以在其中发送一些请求并从供应商那里获得答案。我有一个服务器接收请求(通过休息呼叫或正在运行的 Web 服务,尚未决定哪个)。

每当有新请求进入时,它都应该记录在数据库中,并且当供应商响应时,应该更新记录,表明它是否被接受等等。存储事务的唯一原因是用于报告和记录目的。所以现在我已经说明了我的要求,我需要在这方面有更多专业知识的人的帮助。

到目前为止,我想出的是最好使用结构化数据库,因为所有记录都将具有一种类型和相同的信息,因此无需使用半结构化数据库浪费空间,每条记录都包含两者结构和信息。

但我不知道有没有什么数据库特别适合这种“仅创建/更新操作”??正如我所说,我可能只需要每月左右读取一次数据。任何输入表示赞赏!

0 投票
2 回答
185 浏览

c++ - 在解耦的设计层之间有效传递通知

我正在升级一个数据与 UI 轻微耦合的设计:

通过 UI 指针将更新通知推送到 ui 相当简单,但新的要求是数据与 UI 完全分离,并且不同对象具有多个不同的 UI 表示,因此单个 UI 指针不再这样做,也不是允许成为数据层的一部分。

QObject由于对象数量多(数亿范围内)并且QObject比层次结构中最大的对象大几倍,因此无法使用类似和信号之类的东西。对于 UI 部分,这并不重要,因为一次只有一部分对象是可见的。

我实现了一个 UI 注册表,它使用 multihash 来存储所有 UI,使用Object *为一个键,以便能够获取给定对象的 UI 并发送通知,但是 UI 的查找以及注册和注销存在考虑到高对象数,开销很大。

所以我想知道是否有一些设计模式可以在解耦层之间以更少的开销发送通知?

澄清一下:大多数更改都是在 UI 端完成的,UI 元素保留指向相关对象的指针,所以这不是问题。但是从 UI 端对某些对象进行的一些更改会导致数据层中的相关对象发生无法预测的更改,以便请求更新受影响对象的 UI。事实上,对一个对象的 UI 上的单个更改可能会导致对其他对象的一连串更改,因此我需要能够通知它们最终的 UI 表示进行更新以反映这些更改。

0 投票
0 回答
137 浏览

java - FileChooser.showOpenMultipleDialog 内部设计

我不得不使用Javafx的FileChooser,看到该方法在选择不选择时showOpenMultipleDialog会返回。nullFile

行为精度:只有在至少选择了一个文件时,才能使用“打开”按钮从对话框中返回。

有谁知道为什么要选择这样的返回值,而在这种情况下可以通过一个空列表来模拟值的缺失?

JavaFX 开发人员是否赞成null?还是有其他技术原因?

0 投票
1 回答
253 浏览

c# - 元组实现

对不起,如果它是重复的。我找不到关于这件事的完整解释。而且MSDN像往常一样含糊不清......

.Net 元组是否为 equals 和 GetHashCode 提供了现成可用的实现?(因此 == 运算符)

我可以期望一个元组默认比较它的所有项目,还是我必须提供一个 IEqualityComparer ,如此处所示net-tuple-and-equals-performance

它可以可靠地用作字典键吗?

我进行了一个小测试:

结果是假的和真的。我猜是实现了equals,但没有实现运算符。这是否意味着 == 运算符比较引用?此外,我找不到 IEqualityComparer(框架版本 4)的重载。

谢谢。

0 投票
1 回答
748 浏览

.net - 为什么ContinueWith传Task作为参数

我有一个Task<T> t1. 我想在完成Task t2后运行另一个t1。我选择使用的.ContinueWith方法t1

除了,我不能这样做,因为 Action 参数Task<T>传递的是Task<T>,而不是T它本身。相反,我必须将传递给我的操作的参数的结果与它进行交互。

如果 ContinueWith 的目的是向链中添加另一个动作,那么语言设计者为什么不简单地传递上一个任务的结果呢?或者,在非泛型任务的情况下,期望一个无参数的动作?