软件设计之美
郑晔
推文科技技术VP,前火币网首席架构师
立即订阅
3183 人已学习
课程目录
已更新 20 讲 / 共 35 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 软件设计,应对需求规模的“算法”
免费
课前必读 (3讲)
01 | 软件设计到底是什么?
02 | 分离关注点:软件设计至关重要的第一步
03 | 可测试性: 一个影响软件设计的重要因素
了解一个软件的设计 (4讲)
04 | 三步走:如何了解一个软件的设计?
05 | Spring DI容器:如何分析一个软件的模型?
06 | Ruby on Rails:如何分析一个软件的接口?
07 | Kafka:如何分析一个软件的实现?
设计一个软件—程序设计语言 (5讲)
08 | 语言的模型:如何打破单一语言局限,让设计更好地落地?
09 | 语言的接口:语法和程序库,软件设计的发力点
10 | 语言的实现:运行时,软件设计的地基
11 | DSL:你也可以设计一门自己的语言
加餐 | 再八卦几门语言!
设计一个软件—编程范式 (7讲)
12 | 编程范式:明明写的是Java,为什么被人说成了C代码?
13 | 结构化编程:为什么做设计时仅有结构化编程是不够的?
14 | 面向对象之封装:怎样的封装才算是高内聚?
15 | 面向对象之继承:继承是代码复用的合理方式吗?
16 | 面向对象之多态:为什么“稀疏平常”的多态,是软件设计的大杀器?
17 | 函数式编程:不用函数式编程语言,怎么写函数式的程序?
18 | 函数式编程之组合性:函数式编程为什么如此吸引人?
软件设计之美
15
15
1.0x
00:00/00:00
登录|注册

17 | 函数式编程:不用函数式编程语言,怎么写函数式的程序?

郑晔 2020-07-03
你好,我是郑晔!
前面几讲,我们讲了结构化编程和面向对象编程,对于大多数程序员来说,这些内容还是比较熟悉的。接下来,我们要讨论的函数式编程,对一些人来说就要陌生一些。
你可能知道,Java 和 C++ 已经引入了 Lambda,目的就是为了支持函数式编程。因为,函数式编程里有很多优秀的元素,比如,组合式编程、不变性等等,都是我们值得在日常设计中借鉴的。即便我们使用的是面向对象编程语言,也可以将这些函数式编程的做法运用到日常工作中,这已经成为大势所趋。
但是,很多人学习函数式编程,刚刚知道了概念,就碰上了函数式编程的起源,遇到许多数学概念,然后,就放弃了。为什么学习函数式编程这么困难呢?主要是因为它有一些不同的思维逻辑,同时人们也缺少一个更好的入门方式。
所以,在这一讲中,我打算站在一个更实用的角度,帮你做一个函数式编程的入门。等你有了基础之后,后面两讲,我们再来讨论函数式编程中优秀的设计理念。
好,我们开始吧!

不断增加的需求

我们从一个熟悉的场景出发。假设我们有一组学生,其类定义如下:
// 单个学生的定义
class Student {
// 实体 ID
private long id;
// 学生姓名
private String name;
// 学号
private long sno;
// 年龄
private long age;
}
// 一组学生的定义
class Students {
private List<Student> students
}
如果我们需要按照姓名找出其中一个,代码可能会这么写:
Student findByName(final String name) {
for (Student student : students) {
if (name.equals(student.getName())) {
return student;
}
}
return null;
}
这时候,新需求来了,我们准备按照学号来找人,代码也许就会这么写:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《软件设计之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • 骨汤鸡蛋面
    基于函数切分逻辑跟基于对象切分逻辑有何异同嘛?

    作者回复: 下一讲会讲函数式编程的组合性,会提到这个问题,简言之,函数式切分的是动词,面向对象切分的是名词。

    2020-07-03
    3
  • Jxin
    demo里面,感觉消除重复不怎么明显(虽然调用侧少了恶心的ifelse,但整体代码量反而变多了)。反而适配的味道很重。将所有equest判断适配成统一规格的Predicate 函数。调用侧基于Predicate 函数(统一规格的接口)做职责链链式调用。挺复合统一多个类的接口设计的一应用场景。

    作者回复: 这取决于给使用端提供多大的灵活度,灵活度大,这个设计才有意义。

    2020-07-03
    2
    2
  • 被雨水过滤的空气
    函数式编程给我印象最深的就是“纯函数”的概念。想想看,如果程序是由一个个纯函数组成的,那么在实现每一个函数的时候,不需要关心外界的情况,并且还可以利用缓存提高性能。

    作者回复: 后面我们会讲到纯函数,也会讲到缓存的做法,敬请期待。

    2020-07-03
    1
  • Being
    尝试用C++模板实现了课程中的例子,咋一看不如常规的findByxxx好理解,不过仔细一琢磨,扩展模板的test方法,可扩展性是绝对比常规的扩展一个个findByxxx方法大太多了,一个新增的查找需求,只需要扩展一个模板实例的test方法就完美支持了。
    2020-07-03
  • qinsi
    zipper吧,对immutable的递归数据结构进行遍历和修改,很精致的copy on write

    作者回复: 很好地分享

    2020-07-03
    2
  • Demon.Lee
    拆成一个个小组件,然后就是随意组合搭积木。面向对象编程的基础组件就是类,而函数式编程就是函数。

    作者回复: 对,是这个意思。

    2020-07-03
  • 王十一
    C 语言的函数指针是不是也是一种函数式编程呢,感觉也符合函数是 “一等公民” 的所有定义
    2020-07-03
  • 阳仔
    函数式编程范式里,函数是一等公民,有了函数式编程就可以封装复用的逻辑代码,还可以组合这些逻辑代码
    语言设计越往后它是不断会进化的,毕竟这个世界里唯一不变的就是变化

    作者回复: 这个总结是到位的。

    2020-07-03
  • bigben
    java有空lambda之后好,代码精炼了很多,但有些人表示看不懂了,增加了理解难度

    作者回复: 用好 lambda 的第一条,不要在 lambda 里写太多代码。

    2020-07-03
    1
  • favorlm
    在实际开发中,我一般把查询条件放到sql里,现在我准备拿到代码里,但是以前的分页插件阻止了我这么做,分页插件是以sql为基础的。那么请问郑大,如果改造查询用函数式表示的话,如何评判利弊呢。最近在拯救一个很烂(完全没有测试)的项目。
    2020-07-03
收起评论
10
返回
顶部