
[影片](https://youtu.be/ZEyT9wtXN0Q)
[下篇:抽象機制與物件範式](https://hackmd.io/vdNw4pp3QqGVWznW80c-rg)
[博客來](https://www.books.com.tw/products/0010687596)
2008 網頁
2015 二版
## 函式庫、工具包 vs 框架
* 函式庫、工具包:程式碼複用,讓工程師不用從底層打造,帶來自由
* 框架:設計的複用,控制整體結構和流程,帶來限制。控制反轉(IoC)
## 設計模式 vs 架構
* 設計模式:戰術思想
* 架構:戰略決策 (MVC、MPV...)
## 設計模式 vs 慣用法(Idiom)
* 針對常發生問題提供解決方案。前者偏重設計;後者偏重實作
## 補充
* ASP、JSP:用於靜態網頁植入能在伺服器運行的程式,因為不涉及新的語言,故稱為模板、框架或腳本環境更合適。PHP則屬於新的程式語言,除了用於伺服器,還能編寫命令列腳本和桌面應用程式
# 範式
設計範式 Programming Paradigm
風格或典範
常用Oriented表述,某種傾向
## 1. 命令範式
* 結構化:循序、選擇、迴圈(while、util) - 只用這幾種才是標準的
* 單入口、單出口 = SESE = Single Entry Single Exit
* 善於互動式或事件驅動,使用者導向
* 提倡迭代不鼓勵遞迴
* 一般效能開銷較大
* 除了尾歸遞迴Tail Recursion
* 因為編譯器能把尾歸轉成迭代
*
## 2. 宣告範式
* 數學思維 x=6 定值
1. 函數式:宣告定義
* 閉包:創建匿名類別,記住外部類別的局部變數
包:環境變數綑綁打包
閉:變數是封閉,指給該函數使用
2. 邏輯式:表達邏輯
vs 命令式=提供演算法 i=i+1 定址,模擬電腦
* 後兩代語言基本上都是宣告式,模擬人腦
* 善於數理邏輯應用
* C# attribute就屬於宣告式應用
* 不支援迭代
| 範式 | 程式 | 輸入 | 輸出 | 程式設計 | 程式運行 |
| - | - | - | - | - | - |
| 命令式 | 自動機 | 初始狀態 | 最終狀態 | 設計指令 | 執行命令 |
| 函數式 | 數學函式 | 自變數 | 應變數 | 設計函數 | 運算式變換 |
| 邏輯式 | 邏輯證明 | 假設 | 結論 | 設計命題 | 邏輯推理 |

## 3. 物件範式
* 貼近真實世界的物質
* OOP是物件+繼承、多形
* 封裝使得物件擁有個體身份
* 繼承使得物件擁有家庭身份
* 多型使得物件擁有社會身份
* vs 程序式
* 物件式:資料為中心,自底向上,逐步合併 (民主制)
* 程序式:程序為中心,自頂向下,逐步求精 (君主制)
> 對一個沒有獨立思考習慣的人來講,與其說他認同一個理論,
> 倒不如說他認同該理論宣導者的權威。
> 而在他仰視權威的同時,也把自己的思想交託給了權威。
## 4. 並行範式
* 貼近真實世界的互動
* vs 串列式
* 基本單位:程序(Process)及執行緒(Thread)
* Precess-Oriented
* 生產體系:資源在各模組競爭與合作
## 5. 泛型函式 (演算法導向)
* C++ template、C #define、C# <>
* 打破靜態語言資料之間的壁壘
* 不犧牲效率又確保安全,提高演算法普遍性
* STL三要素
1. 演算法
2. 容器
3. 迭代器:演算法與容器之間的介面,抽象化的指標(因此行為也能被泛化)
> 1. 從一個整數陣列中隨機抽取十個數,對其中的素數求和
> 2. 將一個無序整數集中所有的完全平方數換成其平方根
> 3. 從成績表中,列出所各科及格且平均分數70以上的學生名單
> 4. 再一個著色二元樹中,將所有紅色節點塗成藍色
> 5. 將一個字串從倒數第三個字元開始反向拷貝到另一個字串中
> 6. 每從標準輸入讀取到一個非數字的字元X,於標準輸出列印出「X不是數字字元」
```c++
template< class Iterator , class Act , class Test >
void process( Iterator begin , Iterator end , Act act , Test test )
{
for( ; begin != end ; ++begin )
if( test( *begin ) ) act( *begin );
}
```
```c++
#include <iostream>
#include "prcess.h"
using namespace std ;
bool notDigit( char c )
{ return ( c < '0' ) || ( c > '9' ); }
void printNodDigit( char c )
{ cout << c << "不是數字字元" << endl ; }
int main()
{
process( istream_iterator< char >( cin ) , istream_iterator< char >() , printNonDigit , notDigit );
return 0 ;
}
```
## 6. 超級範式 (元程式Metaprogramming:寫程式的程式)
* 編寫操作程式的程式。傳統運算是動態,程式本身靜態;在元程式,兩者皆是動態
* 自編的元程式
* ~解碼器
* 可使資料簡化,隨時修改(自定義資料格式)
* 程式當作資料對待
* eq 編譯器:高階->組合
* ->語言導向程式設計(Language-Oriented Programming = LOP)。專用語言->通用語言
* -> 生程式程式設計(Generative Programming)
## 7. 切面泛式 Aspect of point = AOP
* Soc = Separation of Concerns 關注點分離
將結構混亂或是疊床架屋的程式碼抽象出關注議題,以此分解程式碼
* 切面為模組,橫切關注點(Cross-Cutting Concerns)
* 主流執行方向為縱向(OOP繼承、執行順序)
* 有些程式碼卻跨模組,難以實現Soc和DRY
* 接入點(Joint Point):執行處
* 切入點(Pointcut):符合執行的接入點集合
* 建議(Advice):被連結的程式碼
* 織入(Weaving):程式若是管道,AOP就是在管道上鑽孔,注入新的程式碼。分靜態和動態注入
* 如同三稜鏡:
1. 切面分解:設計者構思
2. 切面實作:程式設計師實作
3. 合成切面:AOP工具負責
* 額外效能開發,用於大中型的程式
## 8. 事件驅動 Event-Driven Programming = EDP
* vs 流程驅動式程式設計 Flow-Driven Programming
* 控制反轉:主從地位反轉
* 提供框架,其他類別填空
* 依賴反轉:解偶上下層
* Callback:底層可以呼叫上層
* 觀察者模式可看作簡化版的事件驅動
* 省略了管理器部分
* 事件:轉化、合併、排隊、分派

# 語言
## 五代語言
1. 機器語言
2. 組合語言
3. 高階語言:C常會被說中階語言,介於高階與前兩代語言
4. 問題導向語言:專門領域設計,但不再廣泛領域應用
5. 人工自智慧語言:能更口語開發廣泛設計
## 系統語言
### C++
* 反射功能不足 -> 為了效能
* 完全支援指標導致安全隱患 -> 底層所需
* 沒有GC (軟肋一:擔心造成過大的時空開銷)
* 替代方案RAII(Resource Acquisition Is Initialization) -> Smart Pointer
* 資源獲取及初始化
* RRIF (Resource Release Is Finalization)
* 資源釋放即終結化
* 沒有執行緒
* 沒有豐富標準函式庫 (軟肋二:僅有效率極低的標準委員會維護,缺乏大公司鼎力資助,D語言更慘)
## 平台語言(Java & C#)
* 編譯生成與機器無關的受控碼(Managed Code)或位元組碼(Bytecode)
* 執行於VM上
* '.' 機器性能、軟體規模過大 -> GC的方便
* b. 效能仍是需要重視的議題
* 禁用指標 -> 類型安全
### Java
* = C++++-- (c++加加減減)
* 一種語言跨平台(語言擴散)
* JVM (Java Virtual Machine)
### C#
* = 音符裡的高半音符號 != C四個加
* 多種語言在一種平台上.net執行(凝聚語言)
* CLR (Common Language Runtime)
* unsafe -> 指標操作
* Delegate、event
* 閉包、Lambda(函數式)
* checked、yield
* 匿名類型
## 前台語言
* 視覺化開發 (B/S架構 vs C/S架構)
* 效率要求低
### VB
* 前身BASIC (Beginner's All-Puppose Symbolic Instruction Code)
* 學習曲線短
### Delphi
* = Object Pascal。前身Pascal(教學語言)
* 不限於Window
### JavaScrip (動態語言。eq: Perl、PHP、Python、Ruby)
* X Java
* 可用於伺服器(SSJS)
* 配合HTML、CSS、XML和XSLT才能完成前台工作
* 基於原型的OOP (用現有的物件去擴充,而非定義類別來實現)
* 標準、普及
* 瀏覽器標準不統一、除錯工具不理想
## 後台語言
* Perl 強大複雜
* Python 簡單易學 效率差
* Ruby Perl + Python
* 執行緒件在使用者空間而非內核空間 (X充分利用多核)
* PHP 相較下過於簡單,但流行
* 動態語言->網路平台
* LAMP (Linux Apache MySQL PHP或動態語言)
## 資料類型
* 要素:
1. 值的集合
2. 允許的運算
* 意義:
* 機器物理意義:底層記憶體配置和數值運算
* 人邏輯意義:表達高層邏輯概念
### 類型檢查發生期間
1. 動態類型語言
* 執行期間
* != 動態語言
* 鴨子類型 (Duck Typing)
* 鴨&蛙:叫&游
* 動O靜X ShoutAndSwim( _animal )
* 雞&魚:前叫後游
* 動O靜X ShoutOrSwim( _animal )
* C++靜態語言類型
* B. 範本可實現And的類似功能,但Or無法
* 非繼承多型
2. 靜態類型語言
* 編譯期間
### 值轉換類型
1. 弱類型語言
* 允許隱性轉換
* 1 + "2"
* VB = 3
* JavaScript = 12
* c = 記憶位置偏移
2. 強類型語言
* 貫徹類型控制
* 鑄型Cast
### 安全性
1. 類型安全語言
2. 類型不安全語言
## 動態語言
* 目前動態語言沒有明確定義
* ~腳本語言
* A script is what you give the actor, a program is what you give the audience
* 字元導向
* 靜態語言數值導向。依賴函式庫
* 常見形式:
1. Shell script 介殼腳本
2. Batch File 批次檔案
* 膠水語言 (Glue)
* 用於系統管理及集成
* 不同語言之間結合
[下篇:抽象機制與物件範式](https://hackmd.io/vdNw4pp3QqGVWznW80c-rg)