Questions tagged «composition»

组合是将程序的各个部分组合或组合成一个较大的程序的过程。




3
React.js:将一个组件包装到另一个组件中
许多模板语言都有“ 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> ); } }); 所需的输出: <div class="wrapper"> before <h1>content</h1> after </div> React,React.js没有<yield/>。如何定义包装器组件以实现相同的输出?




7
Java-接口实现中的方法名称冲突
如果我有两个接口,它们的用途完全不同,但是具有相同的方法签名,那么我如何使一个类同时实现两个接口,而又不被迫编写一个同时为两个接口服务的方法并在该方法中编写一些复杂的逻辑检查调用的对象类型并调用适当代码的实现? 在C#中,这可以通过所谓的显式接口实现来克服。Java中有什么等效方法吗?

5
一个具体的例子表明单子在组合下没有关闭(有证据)?
众所周知,应用函子根据组成是封闭的,但单子函数不是。但是,我一直在寻找一个具体的反例来说明单子并不总是构成的麻烦。 这个答案给出[String -> a]了一个非单子的例子。在玩了一段时间之后,我凭直觉相信了它,但是这个答案只是说“无法实现连接”而没有给出任何理由。我想要更正式的东西。当然有很多类型的函数[String -> [String -> a]] -> [String -> a]; 必须证明任何此类功能不一定满足单子法则。 任何示例(附带证明)都可以;我不一定要特别寻找上述示例的证明。

2
Mixins vs Scala中的成分
在Java世界中(更确切地说,如果您没有多个继承/混合),经验法则非常简单:“在类继承上是最喜欢的对象组成”。 我想知道是否/如果您也考虑混入,特别是在scala中,如何更改混入? 是否将mixin视为一种多重继承或更多类组合的方式? 还有“从对象组成到从类组成”(或相反)的指导原则吗? 当人们使用(或滥用)mixins进行对象组合也可以完成工作时,我已经看到了很多示例,但我并不总是确定哪一个更好。在我看来,您可以通过它们实现非常相似的事情,但是也存在一些差异,例如: 可见性-使用mixins时,所有内容都成为公共api的一部分,对于组合而言,情况并非如此。 冗长-在大多数情况下,mixin不太冗长,使用起来也更容易一些,但并非总是如此(例如,如果您还在复杂的层次结构中使用自身类型) 我知道简短的答案是“取决于情况”,但是当这种情况更好时,可能会有一些典型情况。 到目前为止,我可以提出一些准则示例(假设我具有A和B的两个特征,A希望使用B的某些方法): 如果要使用B的方法扩展A的API,则使用混合包,否则使用组合。但是,如果我正在创建的类/实例不属于公共API的一部分,则无济于事。 如果您想使用一些需要混合的模式(例如Stackable Trait Pattern),那么这是一个简单的决定。 如果您有循环依赖项,那么使用self类型的mixin可以提供帮助。(我试图避免这种情况,但这并不总是那么容易) 如果您需要一些动态的,运行时的决定,然后决定如何进行合成,然后进行对象合成。 在许多情况下,mixin似乎更容易(和/或不太冗长),但是我敢肯定,它们也存在一些陷阱,例如“上帝类”以及其他两篇artima文章中所述的其他内容:第1部分,第2部分(顺便说一句在我看来,其他大多数问题与scala无关/并不那么严重。 您还有更多类似的提示吗?

1
F#中的应用程序架构/组成
最近,我一直在C#中将SOLID进行到相当极端的水平,并且在某个时刻意识到,除了如今编写函数之外,我基本上没有做其他事情。在我最近再次开始研究F#之后,我发现对于我现在正在做的大部分事情来说,这可能是更合适的语言选择,因此我想尝试将一个实际的C#项目移植到F#中作为概念证明。我想我可以(以一种非常惯用的方式)发布实际的代码,但是我无法想象这样一个架构看起来会像我在C#中一样灵活地工作。 我的意思是说,我有很多小的类和接口是使用IoC容器编写的,而且我也经常使用诸如Decorator和Composite的模式。这导致(我认为)非常灵活和可发展的整体体系结构,使我可以轻松地在应用程序的任何位置替换或扩展功能。根据所需的更改量,我可能只需要编写一个接口的新实现,并在IoC注册中替换它即可完成。即使变化更大,我也可以替换对象图的一部分,而应用程序的其余部分将像以前一样保持原样。 现在使用F#,我没有类和接口(我知道我可以,但是我认为那是我想进行实际函数编程的要点),我没有构造函数注入,也没有IoC容器。我知道我可以使用高阶函数来完成类似Decorator模式的操作,但这似乎并没有像构造函数注入类那样给我带来灵活性和可维护性。 考虑以下C#类型: public class Dings { public string Lol { get; set; } public string Rofl { get; set; } } public interface IGetStuff { IEnumerable<Dings> For(Guid id); } public class AsdFilteringGetStuff : IGetStuff { private readonly IGetStuff _innerGetStuff; public AsdFilteringGetStuff(IGetStuff innerGetStuff) { this._innerGetStuff = innerGetStuff; } public …


2
结合Haskell代码片段以获得更大的画面
这是我在某处遇到的代码,但想知道它是如何工作的: findIndices :: (a -> Bool) -> [a] -> [Int] findIndices _ [] = [] findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs)) 输出:findIndices(== 0)[1,2,0,3,0] == [2,4],其中pred是(== 0)&xs是[1,2,0,3,0] 我将展示一些理解: (zip [0..] xs) 上一行所做的是将索引放入列表中的所有内容。对于上面给出的输入,它看起来像这样:[(0,1),(1,2,2,(2,0),(3,3),(4,0)] (pred . snd) 我发现这意味着像pred(snd(x))。我的问题是,列表是否由邮编组成?我倾向于是,但是我的猜测很脆弱。 接下来,是我对fst和snd的理解。我知道 fst(1,2) = 1 和 snd(1,2) = 2 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.