文档章节

重复性管理——从泛值到泛型以及泛函(下)

国栋
 国栋
发布于 2017/05/22 23:52
字数 1124
阅读 316
收藏 14
点赞 0
评论 10

在前面我们谈论了重复性管理上的一些具体做法,重点探讨了泛型范式泛函范式在解决重复性问题上的应用。因为前面的篇幅有很多被具体的代码例子占据了,所以留到现在这篇做一个归纳总结。

与数学的渊源

应该说,编程与数学还是颇有渊源的,或者说它们之间有很多相通的地方。数学的一个突出特点,那就是数学家总是在不断寻求更加一般化的表述,更为抽象的表达。我们来看一个具体的例子。

数学上有所谓的勾股数,最知名的就是我们所熟知的“勾三股四玄五”了。具体而言就是 3^2 + 4^2 = 5^2.

注:3^2 表示 3 的 2 次方(平方),因为上标较为麻烦,其余类似。

类似的正整数组合还有比如:5^2 + 12^2 = 13^2.

显然,我们都知道这些都是勾股定理的一些正整数特例而已,数学家们肯定不会只满足与此,很早他们就发现了所有的直角三角形都满足一个一般化的表达如下:

a^2 + b^2 = c^2.

这就是所谓的“勾股定理”了。

在西方,叫“毕达哥拉斯定理”(Pythagorean theorem)

那么,是否到这里,事情就结束了呢?如果你还记得曾经学过的数学,那么你应该还记得有个东西叫“余弦定理(law of cosines)”,具体如下:

image

当角度 γ 为 90 度时,因为 cos(90) = 0,这样“余弦定理”就简化成了所谓的“勾股定理”。所以,余弦定理是比勾股定理更加一般化的表述。

3,4,5 和 5,12,13 这些勾股数是勾股定理的特例,而勾股定理本身又是余弦定理的一个特例。

从勾三股四玄五到勾股定理再到余弦定理,从特殊到一般,从一般到更一般,显然,数学家从未停止他们抽象的脚步,总是在追寻更加一般化的定理,更加普适的定律。

事实上,这个平面上的余弦定理还可以进一步推广到立体的“四面体(tetrahedron)”上的余弦定理:

image

这个就比较深奥,比较抽象了,恐怕知道的人也不多,但数学家们是不会停止的!这个可谓是更加一般化的表述了。

反之,平面上的余弦定理可以视作为它的一个特例。

类似的例子还有很多,事实上你在中学里所学的好多定理都还可以进一步推广,不过因为在形式上也越来越抽象,很多已经超出了我们普通人的理解能力,这里也不再去挖掘那些例子了。

所谓的“泛”

现在,我们来看所谓的“泛”,前面的篇章中也一再说了,就是一个从特殊到一般的过程:

image

是一个从具体到抽象的过程:

image

函数已经是一种抽象,我们还不满足,我们还要追求更高阶的抽象:

image

还是那句话,从特殊到一般,从一般到更一般!无论是值的硬编码、类型的硬编码,还是行为的硬编码,能够被泛化的,我们都将其一一参数化,一般化。

在这一过程中,我们消除了重复,得到了极为抽象的代码,这些对值没有依赖,对类型也没有依赖,对具体行为也没有耦合的代码具有极强的普适性。依靠这些手段,我们不但消除了眼下的重复,甚至也消除了未来的重复。

当你写的代码越来越多,当你思考得越来越深,你一定对这一点体会越来越深。或许我们还不能将它清晰的表述出来,但我相信我们一定会逐渐地感受到,用陶潜的一句诗来结尾,可谓是:此中有真意,欲辨已忘言!

image

注:图片来自互联网。附上原诗:

饮酒(其五)—— 陶渊明

结庐在人境,而无车马喧。
问君何能尔?心远地自偏。
采菊东篱下,悠然见南山。
山气日夕佳,飞鸟相与还。
此中有真意,欲辨已忘言。

© 著作权归作者所有

共有 人打赏支持
国栋

国栋

粉丝 362
博文 79
码字总数 154046
作品 0
东莞
程序员
加载中

评论(10)

国栋
国栋

引用来自“木木小胖”的评论

感觉有时候抽象也不是有百利而无一害的,过度抽象也会带来重复
比如如果将列表求和再次抽象,变成列表求X,传入两个参数,函数用第一个参数处理每个列表项,收集返回值传入第二个参数里,这样可以实现列表求乘积,但是如果只需要求和,每次传入都必须传入一个求和函数
如果还有元组求X,集合求X,每次传入还得传入一个foreach()【或者对于一些不满足交换性的运算,得先进行某些预处理才能正确遍历】
那么代码可能会变成这样子
int sqSum = sum([1..100], (x,y)->x+y, x->x*x);

【可能有一些语法上的错误【我没学过Java】,但是只要不妨碍阅读就好】

当然应该还可以进一步泛化,但是这样每次调用都必须传入一些重复参数
所以,有时候针对场景进行的特化是有必要的(..?)

【总感觉我理解错文意了】
重要的是降低复杂性,如果你引入了抽象没有降低复杂性反而是增加了复杂性,那就不值得引入。
文中为了叙述方便及读者理解方便都是举的比较简单的例子,重点在于说明如何去做抽象,而不是谈论抽象是否合理或过度的问题。
木木小胖
木木小胖
感觉有时候抽象也不是有百利而无一害的,过度抽象也会带来重复
比如如果将列表求和再次抽象,变成列表求X,传入两个参数,函数用第一个参数处理每个列表项,收集返回值传入第二个参数里,这样可以实现列表求乘积,但是如果只需要求和,每次传入都必须传入一个求和函数
如果还有元组求X,集合求X,每次传入还得传入一个foreach()【或者对于一些不满足交换性的运算,得先进行某些预处理才能正确遍历】
那么代码可能会变成这样子
int sqSum = sum([1..100], (x,y)->x+y, x->x*x);

【可能有一些语法上的错误【我没学过Java】,但是只要不妨碍阅读就好】

当然应该还可以进一步泛化,但是这样每次调用都必须传入一些重复参数
所以,有时候针对场景进行的特化是有必要的(..?)

【总感觉我理解错文意了】
国栋
国栋

引用来自“飞天奔月”的评论

鼓掌, 上中下 三篇文章,我都仔细拜读了, 学到做, 做到说, 说到写, 每个阶段都浓缩在上面三个文章里面了, 不管是程序员, 架构师,还是"数学家", 都会有很大的感悟和受益
:smile:谢谢
国栋
国栋

引用来自“seal_90”的评论

写个文章也真是不易啊 果断各种知识都需要
:smile:
飞天奔月
飞天奔月
鼓掌, 上中下 三篇文章,我都仔细拜读了, 学到做, 做到说, 说到写, 每个阶段都浓缩在上面三个文章里面了, 不管是程序员, 架构师,还是"数学家", 都会有很大的感悟和受益
s
seal_90
写个文章也真是不易啊 果断各种知识都需要
国栋
国栋

引用来自“liuqiangchengdu”的评论

这一篇文章从总结升华到哲学化,然后诗化。能写下这样的好文,给个赞。

回复@liuqiangchengdu : :blush:过奖了~
liuqiangchengdu
liuqiangchengdu
这一篇文章从总结升华到哲学化,然后诗化。能写下这样的好文,给个赞。
国栋
国栋

引用来自“charles_wang”的评论

好文,要顶.

回复@charles_wang : :smiley:
charles_wang
charles_wang
好文,要顶.
Swift专题讲解二十二——泛型

Swift专题讲解二十二——泛型 一、以泛型为参数的函数 泛型是Swift语言强大的核心,泛型是对类型的抽象,使用泛型开发者可以更加灵活方便的表达代码意图。我们知道,有参函数的参数必须有一个...

珲少
2016/05/30
297
0
关于Java泛型深入理解小总结

1、何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声明一个变量...

胆小的石头
2017/11/04
0
0
[C# 基础知识系列]专题七: 泛型深入理解(一)

引言:   在上一个专题中介绍了C#2.0 中引入泛型的原因以及有了泛型后所带来的好处,然而上一专题相当于是介绍了泛型的一些基本知识的,对于泛型的性能为什么会比非泛型的性能高却没有给出...

技术小胖子
2017/11/08
0
0
Java泛型

泛型的好处 使用泛型的好处我觉得有两点:1:类型安全 2:减少类型强转 下面通过一个例子说明: 假设有一个Test类,通用的实现是: 我们可以这样使用它: 看一个使用泛型的例子: 从上面的对比...

德彪
2017/11/25
0
0
编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]

前言   泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能。基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确...

aehyok
2014/05/15
0
0
Java泛型——阅读

一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { public static void main(String[] args) { List list = new ArrayList(); list...

关河
2016/01/26
69
0
面对时代冲击,泛微的转型理念与动作

毋庸置疑,管理软件行业正在发生变革,“转型”也好,“创新”也罢,在以移动、云计算为代表的新技术驱动下,传统商业模式、技术架构、服务模式等等企业经营模式终归是在发生悄然而又激烈的变...

玄学酱
05/21
0
0
C#模板编程(1):有了泛型,为什么还需要模板?

C#泛型编程已经深入人心了。为什么又提出C#模板编程呢?因为C#泛型存在一些局限性,突破这些局限性,需要使用C#方式的模板编程。由于C#语法、编译器、IDE限制,C#模板编程没有C++模板编程使用...

最美的回忆
2017/08/01
0
0
Java泛型-类型擦除

一、概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变),奇怪的ClassCastException等。 正确的使用Java泛型需要深入的了...

lwwjing
2016/03/17
50
0
Java泛型的局限和使用经验

这篇文章主要总结泛型的一些局限和实际的使用经验 泛型的局限 任何基本类型不能作为类型参数 经过类型擦除后,List 任何在运行时需要知道确切类型信息的操作都无法工作。 由于Java的泛型是编...

阿杜
2017/12/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
13
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
2
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部