四个程序员的一天

LIGGGHTS开源离散元仿真:从基础安装到高级应用实战 本文详细介绍了LIGGGHTS开源离散元仿真软件的基础安装、脚本编写及高级应用实战。从颗粒自由落体模拟到工业级复杂系统建模,涵盖CFD-DEM耦合、高性能计算优化等关键技术,帮助用户快速掌握这一强大的颗粒仿真工具。特别适合需要处理颗粒系统仿真的科研人员和工程师。 阅读详情

你,一个DotNet程序员,刚刚加入一个新项目组。除了你之外,其他的成员包括:Ceer,一直从事C项目的程序员,他刚刚转入C#不到一个月; Jally,整天抱着本Design Pattern(没错,就是GoF的那本)在啃的前Java程序员;以及Semon,你对他完全不了解,只是听PM介绍说他是搞Scheme的(传说中的第二古老的语言LISP的方言之一)。不过你也没在意,毕竟计算机这玩意,老东西是不吃香的。

周一,刚打开电脑,老板就跑到你们组的办公座面前:“好吧,伙计们,现在有个function需要你们来搞定。具体是这样的:用户输入2个数,并输入一个操作符。你根据输入的情况来得出相应的运算结果。“

Example: Foo(+, 1, 2) = 3; Foo(*, 3, 6) = 18; Foo(/, 2, 4) = 0.5  

Ceer最先作出反应:简单嘛,判断一下输入的操作符就好了。说着,他很快在白板上写出如下代码: 

public class CStyle_Calculator  
{  
 static public double Foo(char op, double x, double y)  
 {  
  switch(op)  
   case ’+’: return x + y; break;  
   case ’-’: return x - y; break;  
   case ’*’: return x * y; break;  
   case ’/’: return x / y; break;  
   default: throw new Exception(”What the Hell you have input?");  
 }  
}  

Jally只看了一遍,就捂着鼻子连连摇头:好一股的代码臭味。还不如看我用OO的方法来解决:

public interface I操作符 //谁说代码不能写中文的?恩恩  
{  
 double 运算(double x, double y);  
}  
public class OO_Calculator  
{  
 private I操作符 m_op;  
 public OO_Calculator(I操作符 op)  
 {  
  this.m_op = op; //依赖注入【注2】  
 }  
  
 public double Foo(double x, double y)  
 {  
  return this.m_op.运算(x, y);  
 }  
}  
  
public class 加法:I操作符  
{  
 public double 运算(double x, double y)  
 {  
  return x + y;  
 }  
}  
  
public class 减法:I操作符  
{  
 public double 运算(double x, double y)  
 {  
  return x - y;  
 }  
}  
  
public class 乘法:I操作符  
{  
 public double 运算(double x, double y)  
 {  
  return x * y;  
 }  
}  
  
public class 除法:I操作符  
{  
 public double 运算(double x, double y)  
 {  
  return x / y;  
 }  
}  
  
public class TheMainClass  
{  
 static public void Main()  
 {  
  I操作符 我的加法 = new 加法();  
  OO_Calculator 我的加法器 = new OO_Calculator(我的加法);  
  double sum = 我的加法器.Foo(3, 4);  
  System.Console.WriteLine(sum);  
  //sum = 7  
  
  //其他3个我就不废话了  
 }  
}

你看着Jally把白板写得密密麻麻之后,耸耸肩,暗叹,你们这些用java的废柴,就一个运算器还搞出Interface这些东西,烦不烦啊。 让你们见识见识DotNet的强大吧. 那个运算符我直接用delegate传进去不就好了么.
public delegate double TheOperator(double x, double y);  
  
public class Operators  
{  
 static public double Add(double x, double y)  
 {  
  return x + y;  
 }  
  
 static public double Sub(double x, double y)  
 {  
  return x - y;  
 }  
  
 //乘,除法 我也懒得废话了  
}  
  
public class DotNet_Calculator  
{  
 public double Foo(TheOperator op, double x, double y)  
 {  
  return op(x, y);  
 }  
}  
  
public class TheMainClass  
{  
 static public void Main()  
 {  
  TheOperator myAdd = new TheOperator(Operators.Add);  
  TheOperator mySub = new TheOperator(Operators.Sub);  
  
  DotNet_Calculator dc = new DotNet_Calculator();  
  double sum = dc.Foo(myAdd, 2, 4); //sum = 6  
  System.Console.WriteLine(sum);  
  double sub = dc.Foo(mySub, 3, 7); //sub = -4  
  System.Console.WriteLine(sub);  
 }  
}  

//dot net 下面还可以用CodeDom动态构造C#代码,然后在内存编译运行。

//如果觉得专门写个Operators很烦的话,可以试试C#2.0的匿名方法 

很好,当你写完代码之后,挑衅的看着Jally,Ceer却开始抱怨起来:”这不就是C里面的函数指针么,我也会...“

“然则DotNet下面的Delegate是类型安全滴...”你继续洋洋得意./

而Semon,看了看你们3位华丽的代码,啥也没说,只是在键盘上敲下了2行代码

(define (Foo op x y)  
(op x y))

然后就下班了...

【注: scheme的代码稍微解释下:(+ 1 2) = 3, (* 3 4) = 12.】

至于Semon的解法:

(define (Foo op x y)  
(op x y))  

看明白了么,上面的代码只有一个作用:第一行是函数头,定义了一个叫Foo的函数。该函数接受3个参数op, x, y。

第二行定义了函数的行为:把第一个参数op当作运算符,计算后面2个参数。

所以:(Foo + 1 2) = 3. (Foo / 12 6) = 2.

好了好了,不编故事了。

我只是想简单的让大家在繁忙的工作之余,也瞅瞅Function Programming(函数编程)世界的美妙。函数编程,最大的特点是它是将函数作为语言里1st class的元素来对待的。一个函数可以接受另一个函数作为参数,也可以把一个函数作为结果来返回。这样的函数我们称为Higher-order function。

那么,Function Programming和我们传统的面向对象有啥区别捏? 恩,这个嘛,扯得远可以扯到图灵机和冯·诺以曼这2种体系的差异...@_@不过那个太学术性,俺就不说了,有时间在『代码之谜』系列文章里面科普吧。不过有句话可以较好的概括FP和OO的区别(好吧,这个也是抄“紫皮书”上面的):

“Pascal是为了建造金字塔...Lisp是为了建造有机体...”“作为Lisp的内在数据结构,表对于这种可用性起着重要的提升作用...”“采用100函数在一个数据结构上操作,远远优于采用10个操作在十个数据结构上工作”“金字塔矗立在那里千年不变,而有机体则必须演化,否则就会消亡”。

而另一个总结得比较好的话是:(同样是抄来的)

一个对象:一组相同的运算上面,外加不同的数据。(想想你的object,是不是这样的?)

一个Closure:一组相同的数据,外加不同的操作。(Delegate就是这样的思想,有兴趣的话也可以去看看Ruby)

基本上,恩,没啥说的了。 如果你感兴趣的话,可以去看MIT SICP的课程(有在线版的,MIT也作为Open Course开设了的) 

原文链接:http://www.cnblogs.com/linkcd/archive/2005/07/19/196087.html

ESP-01S使用micropython,利用Thonny烧写固件 在家舒服的太久了,想学习点新的东西,这次看上了ESP8266系列的联网设备,想自己做点小玩意出来耍耍,下面跟我一起来学习吧。本篇主要记录固件的烧写及测试。Thonny下载链接不算难,但是网上资源较少。也是提醒自己不要忘记这个步骤,记录一下,也分享给和我一样开始接触的小伙伴,加油加油,万事开头难。 阅读详情

相关推荐

4个程序员一天

4个程序员一天本文来自: http://linkcd.cnblogs.com/PS: 这真是一篇很酷的文章, ShellEx强烈推荐.------------------------------------开始-----------------------------------------<B……...

钢窟. 594

SAP 固定资产采购简介

SAP 固定资产采购是指企业通过采购流程获取长期使用并记录为固定资产的物品。固定资产是企业为长期使用而购置的资产,如机器设备、办公设备、建筑物、车辆等,通常这些资产的使用期限较长,并且在资产负债表上记录。在SAP系统中,固定资产采购流程通常与物料管理(MM)模块和固定资产管理(FI-AA)模块相结合。这个过程涉及从需求的提出、采购订单的创建,到货物接收、发票校验和资产激活的多个步骤。

我小时候很黑的博客 1671

《4个程序员一天》(续) 由idior的问题想到的

在《4个程序员一天》一文中,idior问道: 不知道类似foo(+,-,+,*,/, a) //a is a array实现a[0]+a[1]+a[2]*a[3]/a[4]这种功能能实现吗?(用FP) 昨晚去看了看scheme的数据结构操作,得出以下解法:(;号后面是注释)(define (inner-runner 1st-number operators numbers)...

weixin_30745641的博客 131

程序员一天是怎样过的?

作者:互联网早班车 程序员一天是怎样过的? 01 阿里系程序员一天的工作 1、早上8点到公司,看15分钟微博,做一天的计划。 2、10点开个晨会,然后工作到12点。 3、中午出去吃个饭+聊天,1点半回来。 4、晚上6点下班,公司吃免费的晚餐,然后加班到8点到9点。 5、锻炼半个小时身体,洗澡看看书,12点睡觉。 周日出去玩两天。 当然加班和早到是个人行为,公司的氛围还是不早到不加班的。 ps:...

weixin_44476888的博客 7257

程序员一天到底在干什么?

因为项目经理有时觉得好不容易大家都在,就会把很多与这个会无关的内容加进来,比如讨论需求、讨论bug修复、讨论公司的代码评审制度,等等。然后他把那个代表新的软件功能的卡片,从TODO移动到DOING,表示他下午要为实现新需求写代码了。之后他喊业务分析人员过来,澄清了有关这个新功能的疑问,并讨论了检验这个新功能是否完成好的验收标准。之后他喊测试人员过来,澄清了有关这个bug的疑问,并讨论了检验这个bug是否修复好的验收标准。最后小张的代码提交后,过了几天,测试人员发现了bug,就找他来修复。

IT界那些事儿 1501

程序员一天程序员每天工作是怎样的?带你看看!!

今天我们来描述下,中国程序员一天是怎样的: CIODE是一家 IT 公司的 软件工程师,主要工作是开发与维护公司核心业务的代码库。我们来看看,他每天的工作工作有哪些: 9:00 到公司 让电脑开机,起身去茶水间接一杯白开水,然后返回工位上,打开outlook查收邮件。 程序员一天工作 程序员一天工作 又收到几十封新邮件,有人问项目进展,还有各种问题,开始回复邮件。 10:00 开会 处理完邮件,刚好有一个会,抱着笔记本电脑去会议室。 部门所有同事都在,这是一个关于项目进展的会议,

weixin_45820912的博客 1万+

殊途同归 四个程序员一天

  你,一个DotNet程序员,刚刚加入一个新项目组。除了你之外,其他的成员包括:Ceer,一直从事C项目的程序员,他刚刚转入C#不到一个月; Jally,整天抱着本Design Pattern(没错,就是GoF的那本)在啃的前Java程序员;以及Semon,你对他完全不了解,只是听PM介绍说他是搞Scheme的(传说中的第二古老的语言LISP的方言之一)。不过你也没在意,毕竟计算机这玩意,老东西

站在JAVA岛上看海 1517

四个程序员一天 【转载】

你,一个DotNet程序员,刚刚加入一个新项目组。除了你之外,其他的成员包括:Ceer,一直从事C项目的程序员,他刚刚转入C#不到一个月; Jally,整天抱着本Design Pattern(没错,就是GoF的那本)在啃的前Java程序员;以及Semon,你对他完全不了解,只是听PM介绍说他是搞Scheme的(传说中的第二古老的语言LISP的方言之一)。不过你也没在意,毕竟计算机这玩意,老东西是不

hhczy1003的专栏 452

关于一个程序员一天只写四个小时代码的反思

今天工作到差不多下午5点左右,觉得精神有点疲惫,面对着眼前的ABCD文档,眼睛扫描到的信息却迟迟不能入大脑,就趁机开溜了一下,飘到CSDN去啦。       看到一篇名为《每天工作4小时的程序员 》文章,讲述了一个老外每天只用四个小时来写代码足矣,顿时觉得我也应该开始重新思考应该如何工作,如何让自己变成更有效率的程序员。以下是老外的大概作息时间表(以下内容摘自老外文章):

z_shaowu的专栏 9118

最后一天了,四个关键字回顾程序员小跃的2020

都说2020很是艰难;都说2020是个悲痛的一年;都说2020我想快快过去,于是乎,终于在今天走向了终点,2020,再见啦! 虽然最近看到很多小伙伴发了2020的总结,以往我也是在月初的时候就会进行总结,但是今年我想等到最后一天,所以当今天早上把日历翻到最后一页的时候,我知道,是时候和2020做一个郑重的告别了。 翻看了2019年的flag(嗯,它仅仅是个flag而已),扑街的太多;翻阅了我今年写的每个月的总结(噢,原来我每个月还有这么多可以聊的),还是有收获的嘛,所以今天,我再挑选几个关键字来对2020做

程序员小跃的专栏 1338

巴西pg电子游戏源码/H5+PC端 前端vue编译后+后端PHP/修复图片资源失效

巴西pg电子游戏源码/H5+PC端前端vue编译后+后端PHP/修复图片资源失效后端测试环境:Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6,根目录public,伪静态thinkPHP,开启ssl证书

微积分基本知识点,适用于大一

微积分知识点

上一篇: 千万要避免的五种程序注释方式
下一篇: 程序员成熟的标志
迷渡
迷渡 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄19年 2399粉丝 124原创
评论 90
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值