标签: design-choices

Java泛型 - 为什么允许"扩展T"而不是"实现T"?

我想知道Java中是否存在使用always" extends"而不是" implements"来定义类型参数边界的特殊原因.

例:

public interface C {}
public class A<B implements C>{} 
Run Code Online (Sandbox Code Playgroud)

被禁止但是

public class A<B extends C>{} 
Run Code Online (Sandbox Code Playgroud)

是正确的.这是什么原因?

java generics syntax design-choices

293
推荐指数
7
解决办法
15万
查看次数

MongoDB中有向无环图的设计模式

问题

像往常一样,问题是在数据库中显示有向非循环图.我拥有的数据库的选择是关系数据库,如mysqlmongodb.我之所以选择mongoDb是因为关系数据库中 DAG是一团糟,但如果有一个技巧我就是找不到请告诉我.

目标是在一个或多个MongoDB文档中映射DAG.因为我们有多个孩子父母SubDocuments,没有可能.我遇到了多种设计模式,但我不确定哪种模式最适合.


具有祖先阵列的树结构

祖先阵列是由mongoDB文档建议的.而且很容易理解.据我了解,我的文档看起来像这样:

{
    "_id" : "root",
    "ancestors" : [ null ],
    "left": 1
}
{
    "_id" : "child1",
    "ancestors" : [ "root" ],
    "left": 2
}
{
    "_id" : "child2",
    "ancestors" : [ "root", "child1" ],
    "left": 1
}
Run Code Online (Sandbox Code Playgroud)

这允许我find像这样的元素的所有孩子:

db.Tree.find({ancestors: 'root'}).sort({left: -1})
Run Code Online (Sandbox Code Playgroud)

所有的父母都这样:

db.Tree.findOne({_id: 'child1'}).ancestors
Run Code Online (Sandbox Code Playgroud)

DBRefs而不是字符串

我的第二种方法是用 s 替换字符串键DBRef.但是除了更长的数据库记录,我没有看到比祖先数组更多的优点.

children …

database-design mongodb nosql design-choices

9
推荐指数
1
解决办法
1291
查看次数

为什么<$>左关联?

fmap也是<$>因为它是函数$类中的函数application().

(+5)  $  (*10)  $  10      -- 105
(+5) <$> (*10) <$> [1,2,3] -- [15,25,35]
Run Code Online (Sandbox Code Playgroud)

然后我想,在这种情况下<*>,应用程序仿函数类别中的函数应用程序,这应该工作:

[(+5), (+10)] <*>  [(*10), (*100)] <*> [1,2,3]  -- ERROR
-- however:
[(+5), (+10)] <*> ([(*10), (*100)] <*> [1,2,3]) -- [15,25,35,...]
Run Code Online (Sandbox Code Playgroud)

因此,<$>只有因为fmap函数恰好是后期合成才会成功,因此(+5) <$> (*10)(+5) . (*10)其应用于[1,2,3].

然而,对于所有应用程序运算符(<<=包括)而言,左边的关联性在我看来似乎是一个糟糕的设计选择,特别是在他们认识到$已经是正确关联的相似性之后.还有其他原因吗?

haskell design-choices

9
推荐指数
1
解决办法
220
查看次数