Erlang(函数式编程)与面向对象编程的思维方式

Jef*_*eff 13 oop erlang functional-programming

我正在学习Erlang,我正在尝试创建一个非常示例的博客程序.然而,我的思想目前被困在OO世界中(var p = new Post(); p.Title =""; p.Save();).我想了解Erlang中的一些基本思路.而不是创建Post对象在数据结构方面应该做些什么(p.Title,p.DateCreated,p.Body)?我应该使用元组吗?我想了解推荐的做这种事情的方法(特定于Erlang和/或特定于功能编程).或者我在Erlang或FP中做的根本错误是什么?

要求(以OO术语,不确定如何用FP术语解释^ _ ^):

  1. 创建Post对象(id,title,date_created,body,IList)
  2. 创建Comment对象(id,post_id,created_by(name as string),date_created)
  3. 一个帖子可以有多个评论
  4. post.AddComment(点评)

谢谢.

更新:我不是在寻找在Erlang中进行OOP的具体方法,除非它是推荐的方式.我正在寻找标准/推荐的方式来做问题中描述的内容,但我并不是想在Erlang中复制OOP.

Vij*_*hew 6

Erlang 一种面向对象的语言.如果你像Alan Kay所描述的那样看OOP,这个陈述就有了更多的权力:

OOP对我来说意味着只有消息传递,本地保留和保护以及隐藏状态进程,以及所有事物的极端后期绑定.

正如您必须意识到的那样,Erlang提升了一种称为面向并发编程的编程风格,在该编程风格中,您将对象抽象为通过消息传递进行通信的独立进程.每个进程都有它的本地状态,它们生活在自己的并行世界中.动态多态性是通过以下事实实现的:您可以定义一可以响应一组公共消息的进程.由于Erlang'对象'生活在他们自己的微小过程中,它成为现实世界建模的自然媒介.您可以在Erlang中比任何其他语言更好地利用您的OOP技能.

无法在如此小的空间内给出Erlang中OOP的完整描述.我建议您阅读" 编程Erlang:并行世界的软件"一书.

另见这些链接:

  • @Jeffrey我不知道Joe Armstrong是否承认Erlang是OO,但如果你按照最严格的OOP定义,Erlang是一种罕见的语言,可以让你在这个范例中编程. (2认同)

TP.*_*TP. 5

我会用记录:

-record(post, {title, date_created, body, comments = []}).
-record(comment, {created_by, date_created, content}).
Run Code Online (Sandbox Code Playgroud)

然后,如果你想使用mnesia作为数据库:

Post = #post{title = "", body = "", date_created = erlang:universaltime()},
mnesia:transaction(fun() -> mnesia:write(Post) end).
Run Code Online (Sandbox Code Playgroud)

要添加评论:

Comment = #comment{created_by = "", content = "", date_created = erlang:universaltime()},
mnesia:transaction(fun() ->
    [Post] = mnesia:read(post, Title),
    PostWithNewComment = Post#post{comments = [Comment | Post#post.comments]},
    mnesia:write(PostWithNewComment)
end).
Run Code Online (Sandbox Code Playgroud)

我没有测试过代码,但这就是我要做的.我还假设每个标题都是独一无二的.

  • 我不会考虑在Erlang中进行OOP,因为它旨在成为一种函数式编程语言.要隐藏用户的详细信息,您可能需要创建一个新方法并返回一个对象,请查看ets:new/2(http://www.erlang.org/doc/man/ets.html#new- 2).如果你真的想做OOP,你应该阅读这个问题:http://stackoverflow.com/questions/1063497/hidden-features-of-erlang(继承和参数化模块) (3认同)