java erlang_Java开发人员的Erlang

java erlang

您可能没有注意到,但是距离我上次发布博客已经过去了几个星期。 这是由于我的Soleus骨折了,而且我的腿是石膏模型。 不能动弹,我认为调查完全不同的东西是个好主意–要么看那一天,要么看白天的电视,尽管Kojak和Magnum PI的重播很诱人,但对Erlang的调查却排在首位。

这里要记住的是,这不是一个
Erlang教程 ,这里的想法是检查Erlang和Java之间的一些相似之处,以尝试提供学习Erlang的起点。 如果我犯了任何啸叫错误,那么希望有更多Erlang经验的人会告诉我。
erlang徽标 入门时,他们首先告诉您有关Erlang的信息,这是一种功能语言。 但是,在您陷入困境之前,它是一种结构良好的功能语言,以为您正在处理对象。

那是什么意思 在Java中,代码存储在表示类的文件中,类是执行单一职责的一组数据和方法。 您可以实例化一个类并通过变量访问其方法,也可以通过其类名访问其静态方法。

在Erlang中,代码存储在称为模块的文件中,每个模块都是执行一项职责的一组功能。 您无法实例化模块,并且实例变量和类变量不存在。 您只能使用方法参数变量。 您可以通过其模块名称来访问方法,就像访问Java静态方法一样。 与Java类一样,Erlang模块具有私有和公共功能。 Java徽标

作为Java开发人员,我很高兴发现有一个
eclipse的Erlang插件 。 这是因为学习一种语言而不是一种语言和一套全新的开发工具会更快。 几个月前,我与几位Erlang顾问进行了交谈,他们说他们更喜欢使用emacs,而我确实想知道为什么要等到我发现eclipse插件才算不错。 仍然足以开始使用,并且它具有潜力。

Java开发人员应该有其他相似之处:Erlang模块源文件被编译为.beam文件,然后在Erlang虚拟机上运行; 还有eunit ,它是Erlang的等效于JUnit ,还有一个log4erl ,顾名思义,是Erlang的Log4J版本。 使用edoc (Erlang的Javadoc版本)和标准项目布局可以自动生成文档,这与Maven布局非常相似,如下所示:
屏幕截图2013年7月29日在18.39.29
其结构与Maven略有不同: 目标目录称为ebin ,并且srctest目录已在项目目录级别进行了拆分,但是易于遵循并且您已习惯了。

根据到目前为止的内容,您会认为Java和Erlang之间的最大区别是Java文件具有.java扩展名,而Erlang文件具有.erl扩展名。 不幸的是,还有更多的东西,首先是没什么大不了的,或者是Erlang看起来很奇怪的语法1

为了对此进行调查,我认为我将使用现有的ShoppingCartShoppingCartTest类并将其转换为Erlang。 我的telldontask项目中提供了这两个类,它们看起来像这样……

ShoppingCart类

public class ShoppingCart { private final List<Item> items; private PaymentMethod method; public ShoppingCart() { items = new ArrayList<Item>(); } public void addItem(Item item) { items.add(item); } public double calcTotalCost() { double total = 0.0; for (Item item : items) { total += item.getPrice(); } return total; } public double calcTotalCost(double shipping, double minShippingAmount) { double totalCost = calcTotalCost(); if (totalCost > minShippingAmount) { totalCost += shipping; } return totalCost; } public void setPaymentMethod(PaymentMethod method) { this.method = method; } public void pay(double shipping, double minShippingAmount) { double totalCost = calcTotalCost(shipping, minShippingAmount); method.pay(totalCost); } 
}

ShoppingCartTest JUnit

public class ShoppingCartTest { /** * Test method for {@link tell_dont_ask.ask.ShoppingCart#getAllItems()}. */ @Test public void calculateTotalCost() { ShoppingCart instance = new ShoppingCart(); Item a = new Item("gloves", 23.43); instance.addItem(a); Item b = new Item("hat", 10.99); instance.addItem(b); Item c = new Item("scarf", 5.99); instance.addItem(c); double totalCost = instance.calcTotalCost(); assertEquals(40.41, totalCost, 0.0001); } }

上面的代码演示了一些非常基本的购物车功能; 但是,有关这些类如何工作的更多详细信息,请参阅“ 定义告诉不要问”和“ 分解告诉不要问” 。

Erlang中的等效代码如下所示:

shopping_cart模块

-module(shopping_cart). %% ==================================================================== 
%% API functions 
%% ==================================================================== 
-export([add_item/2,calc_total_cost/1,calc_total_cost/3,pay/3]). %% @doc Add an item to the order list 
add_item(OrderList,Item) -> [Item | OrderList]. %% @doc Calculate the total cost of all the items in a list. The List must have the following format: 
%%  [{itemName, Price}] 
%%  where 
%%  itemName -> atom 
%%  Price -> float() 
calc_total_cost(OrderList) -> round_dp(calc_total_cost(0,OrderList)). %% @doc Calculate the total cost of all the items in a list adding a shipping cost if the value is below a certain limit. 
%% The Order List must have the following format: 
%%  [{itemName, Price}] 
%%  where 
%%  itemName -> atom 
%%  Price -> float() 
calc_total_cost(OrderList,Shipping, MinShippingAmount) -> Cost = calc_total_cost(OrderList), TotalCost = Cost + shipping(Cost,Shipping,MinShippingAmount), round_dp(TotalCost). %% @doc @todo Method not implemented 
pay(_Order,_Shipping, _MinShippingAmount) -> unimplemented. %% ==================================================================== 
%% Internal functions 
%% ==================================================================== calc_total_cost(Result,[{_,Price} | TheRest]) -> calc_total_cost(Result + Price,TheRest); 
calc_total_cost(Result,[]) -> Result. shipping(Cost,Shipping,MinShippingAmount) when Cost < MinShippingAmount -> Shipping; 
shipping(_,_,_) -> 0. round_dp(Number) -> List = float_to_list(Number,[{decimals,2}]), list_to_float(List).

shopping_cart_tests模块

-include_lib("eunit/include/eunit.hrl"). -module(shopping_cart_tests). %% ==================================================================== 
%% API functions 
%% ==================================================================== 
-export([]). %% @doc Calculate total code - written to match the Java style 
calculate_total_cost_test() -> EmptyList = [], OrderList1 = shopping_cart:add_item(EmptyList,{gloves,23.43}), OrderList2 = shopping_cart:add_item(OrderList1,{hat,10.99}), OrderList3 = shopping_cart:add_item(OrderList2,{scarf,5.99}), ?_assertEqual(40.42,shopping_cart:calc_total_cost(OrderList3)). %% @doc Calculate total cost example - written in a better erlang style 
calculate_total_cost_2_test() -> OrderList = [{gloves,23.43},{hat,10.99},{scarf,5.99}], ?assertEqual(40.41,shopping_cart:calc_total_cost(OrderList)).

专家告诉我,使用Erlang可以用更少的代码行做更多的事情。 这里不是这种情况,但是我又添加了很多注释行(用'%'分隔符表示)。

与Java相比,上面的代码看起来很怪异(因为我没有从Erlang到HTML的转换器,所以看上去也有些丑陋)。 没有任何实例变量,因此所需的任何数据都作为函数参数传入。 如果看一下add_item(…)您会发现它将Item变量添加到列表的开头,例如: items.add(item) (请注意,在Erlang中,变量名始终以大写字母开头)。

转到calc_total_cost() ,事情开始看起来真的很奇怪…… calc_total_cost(OrderList)只是calc_total_cost(0,OrderList)的包装。 calc_total_cost(0,OrderList)是对calc_total_cost(Result,[{_,Price} | TheRest])calc_total_cost(Result,[])的调用,它们是循环执行从列表中添加商品价格的函数。 除非它不循环; Erlang中没有for循环,您必须使用递归,在calc_total_cost(Result,[{_,Price} | TheRest])逐步添加价格,然后递归调用自身,直到列表为空。

关于Erlang语法的问题是,尽管对于使用C派生语言的Java开发人员来说,它是非常合乎逻辑的,因此很容易上手。

要注意的一件事是,上面的Erlang是模仿Java编写的。 这可能不是您从头开始开发Erlang购物车的方式。

为什么选择Java而不是Erlang? 当然不是因为它与Java相似。 当Java的功能和优点可以帮助您更有效,更经济地解决问题时,您会选择Erlang而不是Java。 根据LenartÖhman的Google Tech Talk Erlang的目标应用程序,这些应用程序必须是:

  • 容错
  • 马不停蹄
  • 同时
  • 分布,可扩展和异构
  • 软实时
  • 需要“原型性”

这些目标已经以多种方式实现。 例如,进程之间传递的消息是语言的一部分,而不是单独的API。 要将消息发送到另一个进程,只需键入:

Pid ! theMessage,

…其中Pid是将接收theMessage的进程的ID。 要发送消息,请输入在另一个Erlang虚拟机上运行的另一个进程:

Pid ! theMessage,

从这个不愉快的笑话中,我可能已经猜到Erlang虚拟机上的进程是透明的。 这意味着它与运行它们的机器上的Erlang进程没有什么不同。 无论是在本地还是在不同的物理硬件上。 这是因为Erlang虚拟机可以互相通信并且可以集群。 JVM之外的某种方式。

要接收消息,请使用Erlang关键字: receive ,如下所示:

%% @doc Receive a message and print the contents 
print() -> receive Message -> io:format("The message is: ~p~n",[Message]) end.

进程本身非常轻巧,旨在以其他语言无法模仿的方式在大型多核处理器上利用超线程。 流程在Erlang中非常重要,我在某处读到,如果Java是一种面向对象的语言,那么Erlang就是一种面向过程的语言。

如果此博客的内容像是Erlang的广告,那是因为在将脚趾浸入水中之后,我可以看到它比基于Java的解决方案更经济,更省力地解决了许多问题。 另一方面,还有Java和Spring(此博客的常见主题)更适合的那些问题。 计算机语言只是简单的工具,您应该选择适合自己的最佳语言。

1奇怪的是,您是否基于Prolog而不是C而成为Java程序员。
可从Captain Debug Github存储库中获得此​​博客的Java代码示例:
https://github.com/roghughe/captaindebug ,而Erlang代码可从我的Erlang Samples Github存储库中获得: https://github.com/roghughe/erlang_samples 。

参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes的Java开发人员Erlang 。

翻译自: https://www.javacodegeeks.com/2013/08/erlang-for-java-developers.html

java erlang

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新!详细!win10下MySQL数据库干净卸载安装与配置

微信公众号&#xff1a;创享日记 发送&#xff1a;sqlyog 获取SQLyog客户端安装包 文章目录官方下载卸载清除安装变量配置测试SQLyog客户端下载官方下载 链接直达&#xff1a;点击官方下载 1、选择 2、下载&#xff1a;点击download进入下载页面&#xff0c;选择“No thanks,…

linux系统基本使用教程,Linux系统的基本使用入门

终端&#xff1a;用户与主机交互&#xff0c;必然会使用到的设备&#xff0c;在Linux中也使用文件进行标识物理终端:直接接入到本机的显示器和键盘设备&#xff1a;又叫控制台&#xff1a;console物理终端设备文件&#xff1a;/dev/console虚拟终端&#xff1a;附加在物理终端之…

最基础,MySQL基础查询SELECT

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 1、查询表中字段 USE 要操作的数据库名; SELECT 查询的字段 …

rest和rest ful_为什么REST如此重要

rest和rest ful这篇文章致力于REST&#xff0c;一种塑造Web服务的架构风格&#xff0c;以及IT历史上最容易被误解的概念。 这篇文章针对的是正在设计Web服务api的人&#xff0c;他们没有完全了解REST的实际含义。 我想给你个主意。 这篇文章也发给了那些想知道REST意味着什么的…

流利的接口不利于维护

流利的接口 &#xff08;最初由Martin Fowler 创造&#xff09;是一种非常方便的与OOP中的对象进行通信的方式。 它使他们的外墙更易于使用和理解。 但是&#xff0c;它破坏了它们的内部设计&#xff0c;使它们更难以维护。 Marco Pivetta在他的博客文章Fluent Interfaces is E…

减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现

文章目录基本介绍应用实例基本介绍 当一个数组中大部分元素为0&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: ①记录数组一共有几行几列&#xff0c;有多少个不同的值&#xff08;0除外&#xff09;。 ②把具有不同值…

C语言课程设计报告输出杨辉三角,C语言学习:在屏幕上输出杨辉三角

杨辉三角的规律是&#xff1a;它的两条斜边都是由数字1组成的&#xff0c;而其余的数则是等于它肩上的两个数之和。 代码如下&#xff1a;#include#includeint main(){int i,j,k,arr[10][10]{0};/*arr[11][11]必须初始化&#xff0c;初始化为{0}*/printf("打印出杨辉三角&…

习惯性朴实简单!一起学习MySQL常见单行函数,字符数学日期流程控制

文章目录一、字符函数二、数学函数三、日期函数四、其他函数五、流程控制函数一、字符函数 1、大小写控制函数 ①UPPER()&#xff1a;转换成大写 SELECT UPPER(Hello);②LOWER()&#xff1a;转换成小写 SELECT LOWER(Hello);2、字符控制函数 ①LENGTH()&#xff1a;获取参数…

不可上位!数据结构队列,老实排队,Java实现数组模拟队列及可复用环形队列

文章目录队列简介数组模拟队列&#xff08;无法复用&#xff09;数组模拟环形队列&#xff08;可复用&#xff09;队列简介 队列是一个有序列表&#xff0c;可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据&#xff0c;先取出&#xff0c;后存入的后取出…

多对一!分组查询!MySQL分组函数,聚合函数,分组查询

文章目录一、简单使用二、搭配DISTINCT去重三、COUNT()详细介绍四、分组查询一、简单使用 SUM&#xff1a;求和&#xff08;一般用于处理数值型&#xff09; AVG&#xff1a;平均&#xff08;一般用于处理数值型&#xff09; MAX&#xff1a;最大&#xff08;也可以用于处理字…

数据结构单链表SingleLinkedList,Java实现单链表增删改查

文章目录链表介绍应用示例链表介绍 链表是有序的列表&#xff0c;但是它在内存中是存储是不连续的&#xff0c;如下&#xff1a; 链表是以节点的方式来存储&#xff0c;是链式存储&#xff1a; ①每个节点包含data域存储数据&#xff0c;next域指向下一个节点 ②链表的各个节点…

c语言队列原理的实现,c印记(十二):队列queue原理与实现

一、简而言之在百度百科里面摘取了一段关于队列(queue)的介绍&#xff1a;队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端(front)进行删除操作&#xff0c;而在表的后端(rear)进行插入操作&#xff0c;和栈一样&#xff0c;队列是一种操作受限制的线性表。…

w ndows7与XP哪个好,Win7系统与Win XP系统哪个更好?Windows7与WindowsXP区别介绍-系统城·电脑系统下载之家...

虽然微软已经停止对xp系统的维护&#xff0c;但是仍有不少用户有这样一个疑惑&#xff1a;Win7系统与WinXP系统哪个更好&#xff1f;接下来&#xff0c;小编就向大家具体介绍Windows7与WindowsXP的区别&#xff0c;让你知道到底哪个系统会更好一些。首先跟系统城小编一起来看微…

一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接

文章目录笛卡尔乘积连接查询分类等值连接非等值连接自连接外连接交叉连接连接查询又称为多表查询&#xff0c;当查询的字段来自于多个表时&#xff0c;使用连接查询。 笛卡尔乘积 笛卡尔乘积现象&#xff1a;表1有m行&#xff0c;表2有n行&#xff0c;结果有m*n行 发生原因&a…

【PostmanJMeter】使用Postman和JMeter进行signature签名

一、前言 ​ 有些接口的请求会带上sign&#xff08;签名&#xff09;进行请求&#xff0c;各接口对sign的签名内容、方式可能不一样&#xff0c;但一般都是从接口的入参中选择部分内容组成一个字符串&#xff0c;然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…

詹金斯搭建_詹金斯的Maven报告

詹金斯搭建代码质量是一个敏感的话题。 它会影响您的维护成本以及客户满意度。 更不用说您的开发人员使用代码的动力了。 谁想要修复难看的代码&#xff0c;对吗&#xff1f; 讨论代码质量总是需要事实和数字&#xff01; 因此&#xff0c;这是一个简短的教程&#xff0c;介绍…

Oracle应用容器云的自由

在这篇博客文章中&#xff0c;我将介绍如何部署CloudEE封装在杜克大学应用自由尤伯杯罐子Oracle应用集装箱云端 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件&#xff0c;其中包含应用程序ber-jar和清单文件&#xff08;manifest.json&…

简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

文章目录简单介绍代码实现简单介绍 如果把单链表的最后一个节点的指针指向链表头部&#xff0c;而不是指向NULL&#xff0c;那么就构成了一个单向循环链表&#xff0c;通俗讲就是让尾节点指向头结点。 单向环形链表应用场景&#xff1a;Josephu(约瑟夫、约瑟夫环)问题&#xf…

荣耀v10Android9新功能,荣耀10、荣耀V10开启安卓9.0内测 日常领跑行业

【PConline 资讯】今天(8月9日)早上10点&#xff0c;荣耀总裁赵明发微博宣布荣耀已经有四款机型面向少部分用户推送安卓9.0内部测试版本。实际上&#xff0c;在8月8日晚上&#xff0c;花粉论坛就已经公布华为4款机型内测安卓 9.0 版本&#xff0c;荣耀手机两款旗舰进入升级名单…

状态模式 设计模式_设计模式:状态

状态模式 设计模式本文将介绍状态设计模式 。 它是行为设计模式之一 。 您无需了解许多理论即可了解模式的主要概念。 该文章将分为几个部分&#xff0c;在其中我将提供有关需要应用该模式的情况&#xff0c;它所具有的利弊以及用法示例的信息。 有时&#xff0c;当对象的内部…