万事万物都是相互联系的
比能力重要一万倍的,是你的底层思维逻辑。
模型是对真实世界的一种主观抽象描写,代表正规化的思考。模型通过严谨的定义和数学逻辑关系,允许我们做精致的推演,从而获得精确交流、解释、判断、设计、预测、探索和采取行动的能力。而选择什么样的模型、选择一个还是几个模型,则是智慧。
开普勒的多面体宇宙模型
我们讨论的模型将来自各种学科,例如数学、物理学、化学、计算机科学、经济学、社会学、生物学、政治学、语言学、法律等等。
模型是对真实世界的一种主观抽象描写,代表正规化的思考。模型通过严谨的定义和数学逻辑关系,允许我们做精致的推演,从而获得精确交流、解释、判断、设计、预测、探索和采取行动的能力。而选择什么样的模型、选择一个还是几个模型,则是智慧。
数学模型可以是一个或一组代数方程、微分方程、差分方程、积分方程或统计学方程,也可以是它们的某种适当的组合,通过这些方程定量地或定性地描述系统各变量之间的相互关系或因果关系。除了用方程描述的数学模型外,还有用其他数学工具,如代数、几何、拓扑、数理逻辑等描述的模型。需要指出的是,数学模型描述的是系统的行为和特征而不是系统的实际结构。
A theoretical construct representing economic processes。
A mathematical model that usually specifies the relationship between one or more random variables and other non-random variables
A mathematical representation of any surface of an object in three dimensions via specialized software
A set along with a collection of finitary(有限性的) operations, and relations that are defined on it, satisfying a given collection of axioms(公理)。
The central component of the model–view–controller software design pattern
A proposed "set of procedures in which all doctors are trained"
你要解决一个怎样的问题? 你的问题领域是怎样的? 你的模型(数据结构)是什么? 你的算法是什么? 你对这个世界的本质认知是怎样的? 你的业务领域的逻辑问题,流程是什么? 等等。 Grady Booch:我对OO编程的目标从来就不是复用。相反,对我来说,对象提供了一种处理复杂性的方式。这个问题可以追溯到亚里士多德:您把这个世界视为过程还是对象?在OO兴起运动之前,编程以过程为中心–例如结构化设计方法。然而,系统已经到达了超越其处理能力的复杂性极点。有了对象,我们能够通过提升抽象级别来构建更大的、更复杂的系统–我认为,这才是面向对象编程运动的真正胜利。
1.万物皆对象,每一个对象都会存储数据,并且可以对自身执行操作。因此,每一个对象包含两部分:成员变量和成员方法。在成员方法中可以改变成员变量的值。
2.程序是对象的集合,他们通过发送消息来告知彼此所要做的事情,也就是调用相应的成员函数。
3.每一个对象都有自己的由其他对象所构成的存储,也就是说在创建新对象的时候可以在成员变量中使用已存在的对象。
4.每个对象都拥有其类型,每个对象都是某个类的一个实例,每一个类区别于其它类的特性就是可以向它发送什么类型的消息,也就是它定义了哪些成员函数。
5.某一个特定类型的所有对象都可以接受同样的消息。另一种对对象的描述为:对象具有状态(数据,成员变量)、行为(操作,成员方法)和标识(成员名,内存地址)。
面向对象语言其实是对现实生活中的实物的抽象。
每个对象能够接受的请求(消息)由对象的接口所定义,而在程序中必须由满足这些请求的代码,这段代码称之为这个接口的实现。当向某个对象发送消息(请求)时,这个对象便知道该消息的目的(该方法的实现已定义),然后执行相应的代码。
我们经常说一些代码片段是优雅的或美观的,实际上意味着它们更容易被人类有限的思维所处理。
对于程序的复合而言,好的代码是它的表面积要比体积增长的慢。
代码块的“表面积”是是我们复合代码块时所需要的信息(接口API协议定义)。代码块的“体积”就是接口内部的实现逻辑(API背后的实现代码)。
在面向对象编程中,一个理想的对象应该是只暴露它的抽象接口(纯表面, 无体积),其方法则扮演箭头的角色。如果为了理解一个对象如何与其他对象进行复合,当你发现不得不深入挖掘对象的实现之时,此时你所用的编程范式的原本优势就荡然无存了。
我们经常说一些代码片段是优雅的或美观的,实际上意味着它们更容易被人类有限的思维所处理。
对于程序的复合而言,好的代码是它的表面积要比体积增长的慢。 代码块的“表面积”是是我们复合代码块时所需要的信息(接口API协议定义)。代码块的“体积”就是接口内部的实现逻辑(API内部的实现代码)。
在OOP中,一个理想的对象应该是只暴露它的抽象接口(纯表面, 无体积),其方法则扮演箭头的角色。如果为了理解一个对象如何与其他对象进行复合,当你发现不得不深入挖掘对象的实现之时,此时你所用的编程范式的原本优势就荡然无存了。
FP通过函数组合来构造其逻辑系统。FP倾向于把软件分解为其需要执行的行为或操作,而且通常采用自底向上的方法。函数式编程也提供了非常强大的对事物进行抽象和组合的能力。
在FP里面,函数是“一类公民”(first-class)。它们可以像1, 2, “hello”,true,对象…… 之类的“值”一样,在任意位置诞生,通过变量,参数和数据结构传递到其它地方,可以在任何位置被调用。
而在OOP中,很多所谓面向对象设计模式(design pattern),都是因为面向对象语言没有first-class function(对应的是多态性),所以导致了每个函数必须被包在一个对象里面(受约束的函数指针)才能传递到其它地方。
和搞编程的一样,数学家喜欢将问题不断加以抽象从而将本质问题抽取出来加以论证解决,范畴论就是这样一门以抽象的方法来处理数学概念的学科,主要用于研究一些数学结构之间的映射关系(函数)。
在范畴论里,一个范畴(category)由三部分组成:
对象(object). 态射(morphism). 组合(composition)操作符, 范畴的对象 这里的对象可以看成是一类东西,例如数学上的群,环,以及有理数,无理数等都可以归为一个对象。对应到编程语言里,可以理解为一个类型,比如说整型,布尔型等。
态射 态射指的是一种映射关系,简单理解,态射的作用就是把一个对象 A 里的值 a 映射为 另一个对象 B 里的值 b = f(a),这就是映射的概念。
态射的存在反映了对象内部的结构,这是范畴论用来研究对象的主要手法:对象内部的结构特性是通过与别的对象的映射关系反映出来的,动静是相对的,范畴论通过研究映射关系来达到探知对象的内部结构的目的。
组合操作符 组合操作符,用点(.)表示,用于将态射进行组合。组合操作符的作用是将两个态射进行组合,例如,假设存在态射 f: A -> B, g: B -> C, 则 g.f : A -> C.
一个结构要想成为一个范畴, 除了必须包含上述三样东西,它还要满足以下三个限制:
结合律: f.(g.h) = (f.g).h 。
封闭律:如果存在态射 f, g,则必然存在 h = f.g 。
同一律:对结构中的每一个对象 A, 必须存在一个单位态射 Ia: A -> A, 对于单位态射,显然,对任意其它态射 f, 有 f.I = f。
在范畴论里另外研究的重点是范畴与范畴之间的关系,就正如对象与对象之间有态射一样,范畴与范畴之间也存在映射关系,从而可以将一个范畴映射为另一个范畴,这种映射在范畴论中叫作函子(functor),具体来说,对于给定的两个范畴 A 和 B, 函子的作用有两个:
将范畴 A 中的对象映射到范畴 B 中的对象。 将范畴 A 中的态射映射到范畴 B 中的态射。 显然,函子反映了不同的范畴之间的内在联系。跟函数和泛函数的思想是相同的。
而我们的函数式编程探究的问题与思想理念可以说是跟范畴论完全吻合。如果把函数式编程的整个的世界看做一个对象,那么FP真正搞的事情就是建立通过函数之间的映射关系,来构建这样一个美丽的编程世界。
很多问题的解决(证明)其实都不涉及具体的(数据)结构,而完全可以只依赖映射之间的组合运算(composition)来搞定。这就是函数式编程的核心思想。
如果我们把程序看做图论里面的一张图G,数据结构当作是图G的节点Node(数据结构,存储状态), 而算法逻辑就是这些节点Node之间的Edge (数据映射,Mapping), 那么这整幅图 G(N,E) 就是一幅美妙的抽象逻辑之塔的 映射图 , 也就是我们编程创造的世界
https://en.wikipedia.org/wiki/Model https://baike.baidu.com/item/%E5%85%B3%E7%B3%BB/4546