面向对象和函数式编程主要是抽象方式的区别,抽象方式的不同导致了优缺点的不同。
抽象方式
面向对象将现实抽象为一个个的对象,以及对象间的通信来解决问题。
函数式编程将现实抽象为有限的数据结构,以及一个个的对这些数据结构进行操作的函数,通过函数对数据结构的操作,以及函数间的调用来解决问题。
对象也是一种数据结构,面向对象实际是将现实抽象为了无数个具有有限操作的数据结构。
反过来函数式编程是将现实抽象为具有无数个操作的有限个数据结构。
两者的优缺点就很明显,面向对象可以很方便的增加类型,却很难在不修改已定义代码的前提下,为既有具体类实现一套既有的抽象方法(称为表达式问题)。而函数式编程可以很方便的增加操作,但很难新增一个适应各种既有操作的类型。
比如Java里的字符串本身没有capitalize方法,理想的方法应该是“abc”.capitalize(),但是Java里需要Util类来实现。虽然ruby可以通过猴子补丁实现,scala可以通过隐式转换实现,kotlin可以通过intern方法实现,但是实际上是通过各种手段弥补这个缺陷。
对于函数式语言来说,比如jvm上的lisp语言Clojure,它的集合都实现了n多个接口:Collection,Sequence,Associative,Indexed,Stack,Set,Sorted。使得一组函数可以应用到set,list,vector,map。如果要新增一个数据结构,就需要实现n多的方法。
不可变性
另外一个抽象方式的区别就是不可变性和可变性。这个很多地方有讲,就不细聊了。
函数式编程强调不可变性,所以易于支持并发编程,但对于状态的修改就需要特殊处理。面向对象编程则反之,状态想怎么变就怎么变,所以并发编程需要加各种锁。
抽象程度
抽象方式的不同,间接导致了抽象程度的不同。
函数式编程的抽象程度要高于面向对象,因为最终都是抽象为那几个数据结构。而面向对象可以构建贴近现实的数据对象。
抽象度越高,也就越难理解。但是抽象度越高,适应性就越强,代码相对就越简洁。
抽象粒度
抽象程度高,也就间接导致抽象粒度细。抽象粒度细,控制性更好,但也导致了相对较难维护。
比如面向对象的23种设计模式,对于函数式编程来说,就是一句话的事。
以策略模式来说,Java的实现如下:
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void contextInterface(){
strategy.strategyInterface();
}
}
public interface Strategy {
public void strategyInterface();
}
public class ConcreteStrategyA implements Strategy {
@Override public void strategyInterface() { //相关的业务 }
}
public class ConcreteStrategyB implements Strategy {
@Override public void strategyInterface() { //相关的业务 }
}
而对于Clojure来说,直接使用高阶函数就可以了:
(defn context [f] (f))
(defn strategy1 [] (println "Strategy1"))
(defn strategy2 [] (println "Strategy2"))
(context strategy1)
(context strategy2)
维护问题,可以把类看作一本书的章节,函数看作书的小节。一本书20个章节就算很多了,而小节至少有个大几十个,数量越多,越难维护。且因为抽象度高,函数如何放置的问题也需要花时间好好考虑。
什么编程语言简单易学,不需要记英语的?
外行眼里的常用编程语言对比
前端(可见部分代码编写/UI)
- *Html
- 超文本标记语言(标准通用标记语言下的一个应用,外语缩写HTML),是迄今为止网络上应用最为广泛的语言,也是构成网页文档的主要语言。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字、图形、动画、声音、表格、链接等。HTML的结构包括头部(Head)、主体(Body)两大部分,其中头部描述浏览器所需的信息,而主体则包含所要说明的具体内容。
- 用途:
- 网站前端(骨架)
- H5游戏
- H5动画
- 特点:
- 摆脱平台依赖
- *CSS
- 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。
- 用途:
- 前端展现(美化)
- *Javascript(JS)
- JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。
- 用途:
- 网站前端
- 分析
- 功能控件
- Web交互
- 特点:
- 速度出色
- 安全性差
- 负责功能
- react
后端(不可见部分代码编写/逻辑)
- *Python
- Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议[2] 。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
- 用途:
- web开发
- 视频游戏开发
- 图形用户界面
- 软件开发
- 特点:
- 简便易用
- 爬虫
- 难以应用在移动开发
- 应用场景:
- 网络编程
- 科学计算和数据分析
- 系统管理和工具
- 游戏或3D应用程序脚本
- 跨平台支持领域
- *PHP
- PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。
- 用途:
- Wordpress
- WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。
- Web开发
- 创建包含数据库页面
- 特点:
- 易上手功能丰富
- 入门语言门槛低
- 框架:
- *Java
- Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
- 用途:
- Android&iOS应用开发
- 视频游戏开发
- 图形用户界面
- 软件开发
- 特点:
- 国内Java程序员多
- 是很多语言的基础
- 除嵌入式设备和极其要求性能的地方,其余基本全能
- 稳定
- 应用场景:
- 主要是当你想访问一个非常大的开发商,即你想要别人维护你的软件
- 当你需要在尽可能多的硬件上跑你的程序
- *Ruby
- Ruby是一款动态、响应式、面向对象的通用型编程语言,其同时也是最适合新手入门的语言之一。
- 用途:
- 图形用户界面
- Web应用
- Web开发
- 特点:
- 易于学习
- 性能较Java差
- C
- 用于操作系统、硬件
- 几乎所有语言的基础
- C++
- 用于搜索引擎、操作系统、视频游戏
- 大规模应用构建语言
- C#
- 多用于windows应用、企业级业务应用
- 需要依靠.NET,跨平台能力差
数据库
- *MySQL
- 轻量易用便宜
- 互联网公司用的多
- SQL server
- 中小企业级应用
- 高度集成化
- Oracle
- 银行、金融这样的对可用性、健壮性、安全性、实时性要求极高的业务
- 零售、物流这样对海量数据存储分析要求很高的业务。
- 由于Oracle对复杂计算、统计分析的强大支持,在互联网数据分析、数据挖掘方面的应用
总结
- 开发Android
- Java
- 开发iOS/Mac OS
- Objective-C
- Swift
- 开发Web
- 后端
- PHP
- Java
- 前端
- JS
- Html5
少儿编程到底是什么?学习少儿编程的利弊又是什么?
少儿学编程,我觉得是非常好的一件事情。只是需要家长做严格地控制和引导。
我本人就是小学6年级开始学习的BASIC语言,大学时代又学习了PASCAL、C、C++,工作后自学了Matlab、JAVA和Python,还有其它2门偏门的仿真语言。从编程学习的过程来看,编程的学习对孩子的逻辑性和计算能力以及统筹能力都有很大的帮助。学过编程的孩子平时做事、思考问题的逻辑性、条理性都会变强。同时,编程的目的是为了解决某个问题,编程的学习可以和孩子现有的学习任务能够融洽的结合起来。例如,可以通过编程来解算物理中力学、电磁学相关的问题。
儿童学编程我觉得最大的问题在于视力问题,编程是必须面对显示器的,这点是无法避免的。但是现在的小孩学业负担已经很重,平时大量的孩子还有手机、pad可玩。视力的负担已经很重了,再加上编程,会对小孩的视力保持造成很大的负担。这里就需要家长的介入,控制并减少孩子平时看手机、玩pad的时间,为编程腾出时间来。尽量减少屏幕光线对孩子视力的影响。并且平时加强孩子身体的锻炼,以抵消过度常坐对孩子身体的影响。