为什么喜欢构图而不是继承呢?每种方法都有哪些权衡取舍?什么时候应该选择继承而不是作文?
许多模板语言都有"slots"或"yield"语句,允许进行某种控制反转,将一个模板包装在另一个模板中.
Angular有"transclude"选项.
Rails有收益率声明.如果React.js有yield语句,它将如下所示:
var Wrapper = React.createClass({
render: function() {
return (
<div className="wrapper">
before
<yield/>
after
</div>
);
}
});
var Main = React.createClass({
render: function() {
return (
<Wrapper><h1>content</h1></Wrapper>
);
}
});
Run Code Online (Sandbox Code Playgroud)
期望的输出:
<div class="wrapper">
before
<h1>content</h1>
after
</div>
Run Code Online (Sandbox Code Playgroud)
唉,React.js没有<yield/>.如何定义Wrapper组件以实现相同的输出?
我知道聚合和组合之间的概念差异.有人可以通过示例告诉我它们之间Java的实现差异吗?
在F#中,使用管道前向运算符|>非常常见.但是,在Haskell中,我只见过使用过的函数组合(.).我知道它们是相关的,但是有没有一种语言原因在Haskell中没有使用管道转发,还是其他什么?
如果我有两个接口,两者的用途完全不同,但是使用相同的方法签名,我如何在不强制编写一个为两个接口服务的单个方法并在方法中编写一些复杂逻辑的情况下创建一个类.检查正在进行调用的对象类型并调用正确代码的实现?
在C#中,这被称为显式接口实现所克服.Java中有没有相同的方法?
众所周知,应用函子在组合下是封闭的,但是monad不是.但是,我一直难以找到一个具体的反例,表明monad并不总是构成.
这个答案给出[String -> a]了一个非monad的例子.在玩了一下之后,我直觉地相信它,但是这个答案只是说"加入无法实现"而没有给出任何理由.我想要更正式的东西.当然有很多类型的函数[String -> [String -> a]] -> [String -> a]; 必须表明任何这样的功能必然不符合monad法则.
任何例子(附带证据)都可以; 我不一定特别想要证明上述例子.
在java世界中(更确切地说,如果你没有多重继承/ mixins),经验法则很简单:"赞成对象组合而不是类继承".
如果你还考虑mixins,我想知道它是否/如何改变,特别是在scala中?
mixins被认为是多重继承的方式,还是更多的类组合?
是否还有一个"赞成对象组成超类组成"(或其他方式)指南?
当人们使用(或滥用)mixins时,我已经看到了一些例子,当对象组合也可以完成这项工作时,我并不总是确定哪一个更好.在我看来,你可以用它们实现非常相似的东西,但也有一些差异,一些例子:
我知道简短的回答是"它取决于",但可能有一些典型的情况,当这个或那个更好.
到目前为止,我可以提出一些指导原则(假设我有两个特征A和B,A想要使用B中的一些方法):
在很多情况下,mixins似乎更容易(和/或更简洁),但我很确定它们也有一些陷阱,比如"神级"和其他两篇artima文章中描述的其他:第1 部分,第2部分(BTW it在我看来,大多数其他问题与scala不相关/不那么严重.
你有更多这样的提示吗?
composition ×10
aggregation ×3
java ×3
oop ×3
haskell ×2
inheritance ×2
associations ×1
f# ×1
interface ×1
javascript ×1
mixins ×1
monads ×1
proof ×1
reactjs ×1
relationship ×1
scala ×1
soa ×1
transclusion ×1
uml ×1