- 浏览: 5171394 次
- 性别:
- 来自: 天津
博客专栏
-
实战 Groovy
浏览量:29392
文章分类
- 全部博客 (639)
- 代码之谜 (6)
- JavaScript quirks (5)
- 程序员 (92)
- Java (93)
- BT编程 (7)
- html/css (64)
- Groovy&Grails (42)
- Android (20)
- C/C++ (5)
- PHP/Perl/Python (46)
- 经典文章 (51)
- CodeIgniter (14)
- JQuery (10)
- 笑话 (4)
- 其他 (32)
- javascript (69)
- 云计算 (0)
- html5 (7)
- 面试 (8)
- google (3)
- nosql (2)
- nodejs (11)
- go (5)
- erlang (1)
- 小常识 (3)
- 冷知识 (5)
- database (4)
- web (12)
- 架构 (12)
- Exception (0)
最新评论
-
jqw1992:
https://www.chromefor.com/libra ...
[福利] 开发者必备的 Chrome 插件——ChromeSnifferPlus -
litjerk:
初步算了一下,目前最最精简的Win98版是5M,他5个小时多敲 ...
让人目瞪口呆的三位世界级电脑大师 -
379855529:
。。似乎重点没说NIO啊,前面基础只是铺垫的很好的,可是我要的 ...
Java NIO与IO的详细区别(通俗篇) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
一步步开发 Spring MVC 应用 -
匡建武:
Good
四个程序员的一天
你,一个DotNet程序员,刚刚加入一个新项目组。除了你之外,其他的成员包括:Ceer,一直从事C项目的程序员,他刚刚转入C#不到一个月; Jally,整天抱着本Design Pattern(没错,就是GoF的那本)在啃的前Java程序员;以及Semon,你对他完全不了解,只是听PM介绍说他是搞Scheme的(传说中的第二古老的语言LISP的方言之一)。不过你也没在意,毕竟计算机这玩意,老东西是不吃香的。
周一,刚打开电脑,老板就跑到你们组的办公座面前:“好吧,伙计们,现在有个function需要你们来搞定。具体是这样的:用户输入2个数,并输入一个操作符。你根据输入的情况来得出相应的运算结果。“
Jally只看了一遍,就捂着鼻子连连摇头:好一股的代码臭味。还不如看我用OO的方法来解决:
你看着Jally把白板写得密密麻麻之后,耸耸肩,暗叹,你们这些用java的废柴,就一个运算器还搞出Interface这些东西,烦不烦啊。 让你们见识见识DotNet的强大吧. 那个运算符我直接用delegate传进去不就好了么.
//dot net 下面还可以用CodeDom动态构造C#代码,然后在内存编译运行。
//如果觉得专门写个Operators很烦的话,可以试试C#2.0的匿名方法
很好,当你写完代码之后,挑衅的看着Jally,Ceer却开始抱怨起来:”这不就是C里面的函数指针么,我也会...“
“然则DotNet下面的Delegate是类型安全滴...”你继续洋洋得意.
而Semon,看了看你们3位华丽的代码,啥也没说,只是在键盘上敲下了2行代码
然后就下班了...
【注: scheme的代码稍微解释下:(+ 1 2) = 3, (* 3 4) = 12.】
至于Semon的解法:
看明白了么,上面的代码只有一个作用:第一行是函数头,定义了一个叫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开设了的)
看一大堆简单的代码的时间 < 看很少但难懂的代码的时间
经典,哈哈,精辟
看起来简单就是美,越接近问题的领域的语言使用起来就显得越简单。
呵呵 很多人都是 被各种思想 套牢了
做点东西 就结合各种编程思想。
先这样的问题,简单 解决问题 就好。
周一,刚打开电脑,老板就跑到你们组的办公座面前:“好吧,伙计们,现在有个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开设了的)
评论
25 楼
匡建武
2016-01-18
Good
24 楼
IamSungod
2010-04-18
俺来凑个热闹,写一段可运行的Scala代码:
object TestOperation { def main(args : Array[String]) : Unit = { println (Foo(_+_,1,2)) println (Foo(_/_,3,4)) } def Foo(op:(Double,Double) => Double,x:Double,y:Double) = {op(x,y)} }
23 楼
justjavac
2009-05-14
xieye 写道
看一大堆简单的代码的时间 < 看很少但难懂的代码的时间
经典,哈哈,精辟
22 楼
justjavac
2009-05-14
luck_donkey 写道
看起来简单就是美,越接近问题的领域的语言使用起来就显得越简单。
21 楼
wufan0023
2008-03-14
代码实现的方式真的非常多,但OO的结果就是好一点。
20 楼
lz726
2008-03-13
不同的写法又不同的好处.具体问题具体分析.
19 楼
luck_donkey
2008-03-13
看起来简单就是美,越接近问题的领域的语言使用起来就显得越简单。
18 楼
java9981
2008-03-13
oop是为了应付复杂多变的问题的,
如果问题稍有变化,不知会如何,
如加入一种自定义操作
如果问题稍有变化,不知会如何,
如加入一种自定义操作
17 楼
Kaede
2008-03-12
呵呵 很多人都是 被各种思想 套牢了
做点东西 就结合各种编程思想。
先这样的问题,简单 解决问题 就好。
16 楼
ericxu131
2008-03-12
看来我就类似那个java的废柴
15 楼
xieye
2008-03-12
看一大堆简单的代码的时间 < 看很少但难懂的代码的时间
14 楼
xiucai315
2008-03-12
不适应看中雯编程..谁叫我没用过呢?不过看了真的挺受用的
13 楼
wintersun
2008-03-12
就像Design Pattern一样,不同的模式,需要应用在具体合适的场合,不能一概而论。函数编程、闭包也有自己的使用范围,OO也有自己的适用场合,不是一杆子打死。两者结合将是最强大的组合。 欢迎加入Groovy!呵呵,怎么变成打广告了!
12 楼
hax
2008-03-12
fp虽好,楼主也不能这样投机取巧。只因scheme允许运算符作为函数使用而已。如果是其他要自定义的函数,那其实这个小例子上也看不出什么差异。
因为c#已经变得很接近fp了。
我再给个johnson的写法:
function foo(op, x, y) {
return eval('x'+op+'y')
}
foo('+', 1, 2) ==> 3
因为c#已经变得很接近fp了。
我再给个johnson的写法:
function foo(op, x, y) {
return eval('x'+op+'y')
}
foo('+', 1, 2) ==> 3
11 楼
tangfeng
2008-03-12
Scheme的代码量很大时,你读代码也会疯!
10 楼
sunwei_07
2008-03-11
刚看到描述Semon的时候,2行代码。第一感觉:好酷
但是如果真的那么简单,每人都容易学会,那我还有存在的意义么……大家都会
但是如果真的那么简单,每人都容易学会,那我还有存在的意义么……大家都会
9 楼
daisy
2008-03-11
太牛了,原来编程可以这样呀!
8 楼
weiertzw
2008-03-11
晕,在python中国社区都看烂了快。。。
7 楼
lenovo
2008-03-11
收藏一下
6 楼
hyl1234
2008-03-11
不错,的确很多事情换个方向去想,会方便的很多。
发表评论
-
干货分享:从零开始学编程 系列汇总
2015-01-08 10:50 3648程序员总爱重新发明轮 ... -
如何看待一些知名博客推广软文的行为?
2015-01-05 13:39 3194本文来自我在知乎上的 ... -
如何看待一些知名博客推广软文的行为?
2015-01-05 13:38 1本文来自我在知乎上的一个回答:http://www.zhi ... -
发福利,整理了一份关于“资源汇总”的汇总
2014-11-13 13:28 6329觉得有用的话,可以去github关注:https://git ... -
告别码农,成为真正的程序员
2013-12-25 10:38 756321本文是我借助 Google 从网上拼凑的文章,可能条理不是 ... -
苦B程序员们,你的法拉利呢?
2013-11-26 11:34 7000每当我说起「每月大概在亚马逊买100块钱的书」,别人都会问 ... -
整理了一些免费的编程中文书籍
2013-11-04 15:02 138272在 github 上整理了一些免费的编程中文书籍 http ... -
科普帖:线程与进程
2013-09-17 16:17 7003这么解释问题吧: 单进程单线程:一个人在一个桌子上吃菜 ... -
程序员在 5 月 20 日这天有什么特别的表白方式?
2013-05-21 08:52 6477昨天在知乎回答了一个问题,程序员在 5 月 20 日这天有 ... -
程序员选择字体的标准是?
2013-05-04 10:40 8065整理自我在 SF 上的回答: 本来在 大家都用什么 ... -
怎么成为技术大牛
2013-03-25 15:50 4666本文转载自淘宝 @玉伯也叫射雕。 微博和知乎上不时 ... -
GitHub无法访问,修改hosts文件解决
2013-01-22 12:30 30490前几天由于12306的抢票插件,导致了github无法访问 ... -
随想录(程序员和收入)
2013-01-21 15:39 11821距离上一次写博客已经很长时间了,大约过了三个星期。这三个星 ... -
程序员成熟的标志
2012-12-07 14:58 11201程序员在经历了若干年 ... -
精通one,学习another,关注next
2012-11-05 09:24 6641Tip 1 要方法而不是记忆 我的一个程序员朋友常 ... -
你为什么薪水那么低(二):生产力
2012-10-22 12:57 4305在上一篇文章中提到,升薪的关键在于『你可以做别人做不了 ... -
为什么中国的程序员总被称为码农?
2012-09-28 08:10 2326今天在知乎看到这个问题。涛吴给出了一个答案,看完收益颇丰。编程 ... -
你为什么薪水那么低
2012-09-21 15:20 2971在SCDN回复了我的博客 ... -
程序员之路——一个老程序员对刚上大学的学弟学妹的忠告
2012-09-20 09:48 14684始终认为,对一个 ... -
想成为最牛程序员吗?
2012-09-05 13:10 2383Tip 1 要方法而不是记忆 我的一个程序员朋友常跟我 ...
相关推荐
### 一个程序员每天该干的事 #### 一、工作日志与反思 - **撰写工作日志**:记录当天的任务完成情况以及遇到的问题。通过这种方式,不仅有助于回顾过去的工作,还可以帮助总结经验教训,为未来的工作提供参考。 - *...
【标题】中的“2017黑马程序员第一天Hibernate讲义,笔记,源码”表明这是一个关于Hibernate框架的初学者教程,由知名的IT培训机构黑马程序员在2017年制作,内容可能包括讲义、学习笔记以及相关的源代码示例。...
黑马程序员的这个课程,专注于第四天的内容,意味着它涵盖了Spring框架的一些关键点,包括但不限于依赖注入、AOP(面向切面编程)、Bean的生命周期以及Spring MVC的基本概念。 首先,让我们深入了解一下依赖注入(DI...
第一天到学校,其实没有一点新鲜的感觉。绝影的舅舅和舅妈就在这里教书,早在这学校还不叫“大学”的时候,绝影已经在学校足球场学骑自行车了。 要说念大学,最忌讳的就是在自己家门口念。哪怕你就住北大院子,也...
7. **时针、分针、秒针重合**:一天中时针转两圈,分针转24圈,秒针转1440圈。时针与分针每小时重合一次,秒针每分钟重合一次,所以共重合1441次。具体时间可以通过计算得出。 8. **等距植树**:可以在一条直线上...
这个压缩包文件包含的是某一天(2017年6月22日)的程序员老黄历内容,可能包括当日宜忌、编程技巧、技术资讯、代码段等内容。 一、程序员老黄历的宜忌 1. 宜:学习新技术,如人工智能、大数据分析、云计算等热门...
首层为“菜鸟”,是每个程序员起步时的必经阶段。初学者在这里开始接触计算机世界,学习一门基础的编程语言。在这个层次,许多人开始意识到编程并非他们原先想象的那么直观,但这一阶段的基础知识为他们之后的成长...
针对程序员提高英语水平这一课题,本文首先从“听说写读”四个方面分析了语言技能提升的难度,指出尽管在口语和听力方面达到母语水平较为困难,但程序员通常在书写和阅读方面同样存在不足,这恰好是他们可以着力提升...
**定义:**衡量程序员在一个季度内新增功能的数量与质量。 **关键知识点:** - **需求分析:**在开发新功能前,需要对用户需求进行深入分析,确保新功能符合实际需求。 - **技术选型:**选择合适的技术栈来实现新...
花费三四天的时间来整理,体现了作者对这个项目的投入和对读者的用心。作者希望这份资料能以合理的价格被认可,10分(可能是指满分)并不昂贵。 标签中的"程序员"、"英语"、"单词"和"带音标"明确了这份资源的主要...
该网站的内容包括服务器端编程、客户端编程和微软产品等方面的信息,对程序员来说是一个非常有价值的资源。 二、infoq infoq是一个专门提供敏捷开发相关信息的网站,内容非常丰富。该网站还提供中文版,但可能是...
**题目描述:**有四个相同颜色的球放在袋子里,每次随机取出两个球,如果取出的球颜色相同则放回一个同色球,否则放回一个白色球。问经过若干次操作后,最终袋子里会剩下什么颜色的球? **解题思路:** - 开始时...
- **问题描述**:使用1、2、3、4四个数字组成不同的三位数,要求每个数字只能使用一次。 - **核心概念**:这是一个典型的排列问题。由于数字不能重复,我们需要计算的是从4个数字中选取3个进行排列的数量,这可以...
5. 相互学习:工作并不是一成不变的,或许有一天你要去其他岗位帮助,所以同事之间的技术要相互学习,或许有一天,公司需要你发挥其他的技能帮助,所以相互学习也是很重要的。 四、工作教训 经过一个半月的工作...
11.7.4 计算销售单制单日期所在月份的第一天和最后一天 11.8 结果集转置 11.8.1 将结果集转置为一行 11.8.2 把结果集转置为多行 11.9 递归查询 11.9.1 Oracle中的CONNECT BY子句 11.9.2 Oracle中的SYS...
程序1:该题目要求编写代码,找出1、2、3、4这四个数字能组成的互不相同且无重复数字的所有三位数。代码通过三层嵌套循环遍历数组arr,通过if判断确保三个索引i、j、k均不相同,从而构成一个无重复数字的三位数。...
面试题27:张老师的生日是哪一天 面试题28:谁是M小姐的情人 面试题29:他们分别是哪国人 面试题30:他们分别是做什么的 面试题31:他们都会说什么语言 面试题32:怎么把马匹从甲村拉到乙村 面试题33:谁打碎了花瓶 ...
Hibernate,作为一个强大的对象关系映射(ORM)框架,极大地简化了Java开发者在数据库操作中的工作。它通过提供数据持久化的对象模型,使得开发者可以专注于业务逻辑,而无需过多关注底层的SQL语法。本文将基于黑马...
Hibernate,作为Java领域中的一个著名持久化框架,为开发者提供了强大的对象关系映射(ORM)功能,极大地简化了数据库操作。本资料集是黑马程序员2016年推出的Hibernate专题课程的讲义和笔记,涵盖了4天的全面学习...