回答

3

我专注于使项目不可变。不可变对象允许您比“线程安全”对象更容易推断多线程代码。该对象具有一个可以在线程之间传递而没有任何同步的可见状态。它考虑了多线程编程。

如果您有兴趣,我已经发表了很多关于不可变对象的工作,特别是代码库上的不可变集合。该项目的名称是RantPack。在收集区我有

  • ImmutableCollection <牛逼>
  • ImmutableMap < TKEY的,TValue >
  • ImmutableAvlTree <牛逼>
  • ImmutableLinkedList <牛逼>
  • ImmutableArray <牛逼>
  • ImmutableStack <Ť>
  • ImmutableQueue <Ť>

有一个额外的垫片层,其(CollectionUtility),这将产生实现BCL接口如IList的<Ť>和ICollection的<Ť>包装对象。他们不能完全实现接口,因为它们是不可变的,但是所有可能的方法都被实现了。

包含单元测试的源代码(C#)也可在网站上找到。

0

请勿使用成员变量或全局变量。使用本地堆栈的函数/方法。当一个方法仅使用内部作用域变量和调用参数并使用out/inout/reference参数或返回值返回所有信息时,它是可用的。

+0

你没有涵盖这一切:[...]不使用I/O函数或函数返回随机值等,基本上不会有副作用的使用功能。 – Claymore 2008-12-09 09:07:29

1

我主要用Java编程。我正在耐心等待关闭语言的日子。但是由于我仍然停留在Java 1.4.2上,即使它们被添加了,这对我来说也不是很长时间!

也就是说,我的主要“功能性”编程方式是大量使用“最终”关键字。我试图让尽可能多的类完全不可变,而其余的则在瞬态和不可变之间有明确的区别。

+0

+1为“最终” - 不变性是你的朋友。如果您使用其中一种功能性JVM语言(例如Clojure或Scala),您也不需要等待关闭:-) – mikera 2011-03-08 16:40:29

0

使一切变得异步。 使用不可变对象,消息等。 通过队列进行通信。

+0

我可以看到MQ如何帮助并发,但功能如何? – Guillaume 2008-12-09 07:53:32