从题外话说起:据我亲身经历,很多令人郁结的程序员最大的问题不是不熟悉语言和类库,不是不了解算法,不是不会用工具,而是对程序里的信息流没有概念——弄不清哪些信息应该在什么地方、信息从哪里来、经过怎样的转换、到哪里去。而顺序化编程语言(C、C++、Java、C#……)很大程度上加重了这个毛病:在一些不那么漂亮的代码里经常可以看到被滥用的static方法和变量,说到底还是不恰当的全局变量的延续,说到底还是没弄清楚哪些信息应该在哪些位置出现。
而Erlang的编程练习对此很有帮助。没有全局变量,变量赋值后就不能改变。于是一些常见的bad smell自然而然地就不会出现了,一些常用的重构手法自然而然地就用不上了。不过呢,这个世界毕竟是有状态的。比如说一个Stomp server就需要记住哪个client订阅了哪个频道。于是当你认真思考“什么信息应该在什么地方”这个问题时,Erlang的几种选择就显得很有意思了。
参数传递。只有当你认真思考的时候,你才会发现原来很多信息都是很容易得到的。要控制一个函数的行为,最简单也最常用的办法就是改变传递给它的参数。如果这个函数需要一种新的状态,也许那意味着给它增加一个参数。
进程字典 。调用put和get方法可以把信息放入一个“每个进程一个实例”的字典。例如random 在字典里放了一个名叫random_seed的变量,用来生成伪随机数。
ETS 。同样是一张二维表,ETS里的信息是所有进程都能访问的。例如Stomperl 需要记录哪个client订阅哪个mailer进程,显然所有监听socket的进程都需要了解这个订阅信息,才能正确分发消息。于是订阅信息就应该(至少)在ETS里保存。
DETS 。ETS只在内存中存在,这意味着两件事:第一,程序结束数据就消失;第二,数据只能在一个节点共享。DETS的API和ETS相似,但它是基于文件的,所以持久保存和多节点共享都是题中应有之义。注意,ETS和DETS保存的数据都必须是tuple。
Mnesia 。这是一个真正的数据库。功能齐备,并且仍然软实时。
以上四种方式的排列不是随机的。应该首先考虑靠前的手段,如果有明确的理由表明一种手段不能满足需要时才可以考虑比较靠后的手段。这很费脑子,有时让人沮丧。但经过深思熟虑的程序好过不假思索的程序,发现自己犯错好过犯错而不自知。
分享到:
相关推荐
【Erlang程序设计(第2版)】是由Erlang之父Joe Armstrong撰写的一本经典著作,专注于介绍Erlang编程语言在并发、分布式和容错系统中的应用。本书适用于初学者和有一定经验的Erlang程序员。作者在书中讨论了如何利用...
由于Erlang运行在BEAM虚拟机上,该虚拟机优化了并发执行和垃圾回收,使得系统在处理高负载时仍能保持稳定。此外,Erlang的"let it crash"哲学鼓励程序在遇到错误时崩溃,然后由监督树自动重启,这样可以快速恢复服务...
书中兼顾了顺序编程、并发编程和分布式编程,重点介绍如何编写并发和分布式的Erlang程序以及如何在多核CPU上自动加速程序,并深入地讨论了开发Erlang应用中至关重要的文件和网络编程、OTP、ETS和DETS等主题。...
通过对这些文件名的分析,我们可以看出这些Erlang程序涵盖了并发处理、进程通信、异常处理、服务器设计、数据处理和测试等多个方面,体现了Erlang在构建分布式系统中的强大功能。学习并理解这些示例,对于深入掌握...
**Erlang程序设计与入门** ...通过阅读《Erlang入门手册》和《Erlang程序设计》这两本书,你可以深入了解Erlang的基础知识、编程技巧以及最佳实践,从而在函数式编程和并发系统的世界里游刃有余。
在这些源代码中,你可以看到如何通过函数来构建程序,以及如何利用函数式编程的特性实现高效的数据处理和状态管理。例如,Erlang的列表处理函数(如`hd/1`, `tl/1`, `length/1`, `map/2`等)在代码中的广泛应用,...
**Erlang程序设计中文版**是一本深入探讨Erlang编程语言的书籍,旨在帮助开发者理解和掌握这种在并发处理和分布式系统中广泛使用的语言。Erlang以其强大的错误恢复能力、热代码替换以及对大规模并发的支持而闻名,是...
Erlang以其强大的并发处理能力而闻名,它采用了轻量级进程模型,使得在单个系统中可以同时运行成千上万个并发任务。这种设计灵感来源于Actor模型,每个进程都有自己的消息队列,通过消息传递进行通信,从而避免了...
**Erlang程序设计概述** Erlang是一种面向并发的、函数式的编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、容错性强的分布式系统。《Erlang程序设计》这本书,作者是Joe Armstrong,他是...
在Erlang中,函数式编程的特点体现为没有变量的概念,程序主要由纯函数构成,这意味着函数的执行结果只取决于输入参数,不受外部状态影响。这使得Erlang非常适合处理大量并行计算任务,因为并行执行的函数之间不会...
Erlang程序设计 第2版 Erlang程序设计 第2版Erlang程序设计 第2版
它的设计灵感来源于Prolog,因此在处理并发性和容错性方面表现出色,尤其适合构建高可用性、高并发性的分布式系统。 在"Erlang程序设计"].源代码这个压缩包中,我们可以找到学习和实践Erlang编程的相关材料。这些源...
11. Recursion:由于Erlang的函数式特性,递归是解决问题的常见手段,特别是在处理列表和其他集合数据时。 12. Hot Code Swap:在Erlang中,可以在不中断服务的情况下更新和替换运行中的代码,这是OTP框架的一个...
在探讨编写分布式的Erlang程序时,本篇文章聚焦于Erlang编程语言中的分布式特性,尤其是那些容易忽视的陷阱及其对应的解决方案。Erlang作为一种专为构建高度并发、容错性强的分布式系统的编程语言,其特性非常适合...
《Erlang程序设计第二版》是一本深入探讨Erlang编程语言的书籍,它旨在帮助读者掌握Erlang的核心概念和技术,以实现高并发、容错性和分布式系统的开发。课后习题是学习过程中不可或缺的一部分,它们能够检验并巩固...
在深入理解Erlang程序设计的源码之前,我们需要了解Erlang的一些核心概念和特性。 1. **并发性**:Erlang的并发模型基于轻量级进程(Lightweight Processes,LWP),它们类似于操作系统中的线程,但资源消耗小得多...
Erlang的过程与传统的进程不同,它们是轻量级的,并且具有内置的并发支持,这使得Erlang在处理大量并发任务时表现出色。 Erlang的错误处理机制也是其独特之处。它采用"let it crash"的理念,鼓励快速恢复而非避免...