[Day 2] Reactive Programming - Programming paradigm

前言

在程序历史的进程中,就像是动物历史一样,是在漫漫的演变当中前进。动物会根据环境最适者生存,程序也会慢慢演进,根据环境、硬体资源等原因逐渐找出一个pattern是最适合某个条件的。Programming paradigm 就是指总结出来经典的程序典范,主要分成两大类指令式(Imperative programming paradigm)、宣告式(Declarative programming paradigm),里面又会再细分不同的种类。

Imperative programming

指令式,顾名思义就是一步步告诉程序如何运作,运用条件(if、switch)、回圈(for)来做流程控制,会有变数(variable)来记录状态,这通常也是刚接触程序所先学习到的,其优点也是可以具象化需求、容易想像也比较容易撰写,适合入门使用。做为Java开发者最耳熟能详的物件导向程序设计(Object oriented programming)也是属於指令式。

Declarative programming paradigm

宣告式/声明式,较为抽象,相对於指令式的繁琐,宣告式重点在於目标而不是流程。在学习这部分的时候我一直用Java角度来思考就会很难理解,这边建议用SQL查询来思考就单纯的多,只需要SELECT * FROM 就可以查询资料库,不需要知道资料库背後运作的流程与细节,还有後面会介绍到的Funtional ProgrammingReactive Programming,也都是宣告式,自己认为语言本身要有一定程度支援才能写出宣告式的程序。

通常只看到定义还是会很难了解差异,这边列出我整理出来的比较表

Imperative  vs Declarative

  1. WHAT + HOW vs WHAT + NOT HOW
    大部分文章都是说一个是what,一个是how,但我认为两者都会有what,都需要告诉程序你要做什麽,命令式你需要告诉他如何去做,宣告式则不用。
  2. state vs stateless
    指令式透过状态来控制而宣告式强调无状态
  3. cphpjava vs  scalahaskell

用简单的范例来比较,有一个1~10的list,印出其中是偶数的部分,指令式透过for回圈搭配if,声明式透过streamfilterforEach的方式。

public static void main(String[] args) { 
    List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
	List<Integer> result = new ArrayList<>(); 
	for (int i = 0; i < data.size(); i++) { 
        if ((data.get(i)) % 2 == 0) { 
            result.add(data.get(i)); 
        } 
	} 
	for (int i = 0; i < result.size(); i++) { 
        System.out.println(result.get(i)); 
    } 
}
public static void main(String[] args) { 
    List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
        data 
			.stream() 
			.filter(i -> i % 2 ==0) 
			.forEach(System.out::println); 
	}

结论

本篇主要是简单介绍一下Programming paradigm,可以在後面帮助了解Reactive Programming,指令式与宣告式这两种没有绝对的谁优谁劣,取决於需求与环境,下一篇会来介绍Funtional Programming

资料来源


<<:  Day2|【Git】使用MacOS 作业系统安装 Git - 以 Homebrew 网页安装

>>:  [day1]永丰Vue一下-从生活寻找灵感

第七天:加装 Build Agent

简单来说,TeamCity 的运作方式是 Server + Agent 的架构。平常我们看到的 Te...

每个人都该学的30个Python技巧|技巧 22:想怎麽设就怎麽设的自订函式(字幕、衬乐、练习)

在这个系列我们教过很多种函式嘛,但那些都是Python内建的,今天就要来教你怎麽自订函式。首先先带你...

【心得】你今天青蛙了吗?flex之路-flex设定了宽却没有用???

前言 曾经有一段瞎摸索的时间,老是不知道为什麽flex时灵时不灵 歪着脑袋想不通为什麽... 直到摸...

Day11 Channel

通道Channel Channel可以想像成是一种资料结构,可以push data进去也可以pull...