軟體開發
他的英文是 Software Develope
目錄
- 工作流
- 軟體開發
- 從觀點來解釋架構
- 設計模式
工作流
寄生有寄生上流,工作也有工作上流
工作流 Workflow
用個最簡單的方式表達工作流
![](https://s3.amazonaws.com/media-p.slid.es/uploads/689641/images/6546776/photo_2019-09-17_10-49-59.jpg)
流程圖
![](https://s3.amazonaws.com/media-p.slid.es/uploads/689641/images/6561842/512628.jpg)
工作流程 (非程式觀念)
由多個部門、多個崗位、經多個環節協調及順序工作共同完成的完整過程。
簡單地講,工作流程就是一組輸入轉化為輸出的過程。
包含元素、過程、表示
元素(表)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/689641/images/6546805/工作流程示例.jpg)
過程
工作流程的重要性
一方面規定了員工的工作內容;另一方面規定了員工怎樣去實現工作內容的工作流程。制度對員工在什麼崗位上要做什麼事情都規定得很好。
![](http://ithelp.ithome.com.tw/upload/images/20141005/201410051501465430ecda4eb41_resize_600.png)
工作流 Workflow
工作流是一種工作流程的電腦(?)模型
屬於電腦支持的協同工作(Computer Supported Cooperative Work,CSCW)的一部分
屬於企業工程的一部分
有專屬的工作流引擎
或稱作工作流管理系統(不同於ERP)
![](https://upload.wikimedia.org/wikipedia/commons/thumb/a/ae/Workflow.png/1280px-Workflow.png)
工作流 Workflow
為了更好地實現某些業務工作目標,可以利用電腦在很多個參與人之間按某種既定原則自動傳遞文檔、資訊內容或者任務
![](https://pic3.zhimg.com/80/v2-e6e7cacf4a6192822e158a7299298f0b_hd.jpg)
1.流程工作流(Process Workflow)
2.專案工作流(Project Workflow)
3.案例工作流(Case Workflow)
Mantis 可歸類在案例工作流
軟體開發
大部分時間都在聊天(?)
![](http://www.fansysoft.com/web/images/services/project-flow.png)
軟體開發 - 開發流程
![](https://pic.pimg.tw/ux/1490336960-1207056762_n.png)
軟體開發 - 需求分析
![](http://images.kenming.idv.tw/medias/soft-imgs/arch_view_bu.png)
軟體開發 - 需求分析
確認需求後,針對每個需求 ( 使用案例 ) 進行分析
每個使用案例對應一張穩健分析圖(robustness diagram)
軟體開發 - 需求分析
![](https://s3.amazonaws.com/media-p.slid.es/uploads/689641/images/6547875/Screen_Shot_2017-07-13_at_12.07.56_PM.png)
軟體開發 - 需求分析
確認(物件節點)流向後
每個穩健分析對應一張循序圖(sequence diagram)
軟體開發 - 系統分析
![](https://www.itread01.com/uploads/images/20161018/1476780329-1085.jpg)
物件
生命線
控制焦點
消息
軟體開發 - 系統分析
![](https://www.itread01.com/uploads/images/20161018/1476780330-3217.jpg)
軟體開發 - 系統分析
![](http://4.bp.blogspot.com/-E5A05nV9Zjg/VNcrKbDjo8I/AAAAAAAAAHQ/rbaSAaf11J8/s1600/abstract%252B%25E7%25A4%25BA%25E6%2584%258F%25E5%259C%2596.jpg)
軟體開發 - 系統分析
![](http://cdn.ithelp.ithome.com.tw/upload/images/20121009/201210092132505074278241ee7_resize.png)
軟體開發 - 系統分析
![](https://s3.amazonaws.com/media-p.slid.es/uploads/689641/images/6547938/圖15_1_.png)
軟體開發 - 與工作流的關係
![](http://www.fansysoft.com/web/images/services/project-flow.png)
軟體開發 - 開發流程
軟體開發 - 自動化測試 (automation )
![](http://1.bp.blogspot.com/-r6pdP1FtGDg/UFmJGAGsWgI/AAAAAAAAAOA/5ZI7pI0HjRQ/s1600/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2012-09-19+%25E4%25B8%258B%25E5%258D%25884.57.36.png)
軟體開發 - 自動化測試 (automation )
![](https://demoblog.blob.core.windows.net/blog/836/1485603431_02793.png)
軟體開發 - 自動化測試 (automation )
軟體開發 - 章節小結
從觀點解釋架構
是一種整體觀
架構 Architecture
若真要一言以蔽之
”架構” 是一種整體觀
需要保持從各角度看待架構時
仍有一致性與調和的觀點
![](http://c.blog.xuite.net/c/1/7/4/11767048/blog_1575979/txt/25408186/0.jpg)
架構 Architecture
一即是全,全即是一
觀點即是整體的部分
整體的部分即是觀點
金剛經有云:「凡所有相,皆屬虛妄,見諸相非相,即見如來」。
架構 Architecture
![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/LOM_base_schema.png/600px-LOM_base_schema.png)
![](https://www.researchgate.net/profile/Akram_Idani/publication/220764647/figure/fig1/AS:669465284988928@1536624370056/Correspondances-entre-meta-modeles-B-et-UML.png)
![](https://www.controleng.com/wp-content/uploads/sites/2/2012/02/ctl1203it-a3-UML-SD-interaction-Slider.jpg)
![](https://cdn.visual-paradigm.com/guide/uml/what-is-package-diagram/08-package-diagram-order-subsystem.png)
架構 Architecture
當組合起來可以做到更多功能,
才是系統存在的意義。
而設計模式則是為了實現某些架構的小模塊。
如果一個系統的功能等於其部件的功能之和,
那這個系統就沒有存在的意義,
只有在這個系統組合時能湧現出新的功能,
那才算是組成了一個系統。
架構 Architecture
public abstract class Drink {
SugarType sugar;
IceType ice;
private Drink(){}
public Drink(SugarType sugar, IceType ice) {
this.sugar = sugar;
this.ice = ice;
}
public SugarType getSugar() {
return sugar;
}
public void setSugar(SugarType sugar) {
this.sugar = sugar;
}
public IceType getIce() {
return ice;
}
public void setIce(IceType ice) {
this.ice = ice;
}
enum SugarType{
REGULAR,LESS,HALF,QUARTER,FREE
}
enum IceType{
REGULAR,EASY,FREE,HOT
}
}
架構 Architecture
public class Tea extends Drink {
TeaType teaType;
public Tea(SugarType sugar, IceType ice) {
super(sugar, ice);
}
public void setTeaType(TeaType teaType) {
this.teaType = teaType;
}
public TeaType getTeaType() {
return teaType;
}
enum TeaType{
LEMON,OOLONG,GINGER,HONEY
}
}
public class Coffee extends Drink {
private CoffeeType coffeeType;
public Coffee(SugarType sugar, IceType ice) {
super(sugar, ice);
}
public CoffeeType getCoffeeType() {
return coffeeType;
}
public void setCoffeeType(CoffeeType coffeeType) {
this.coffeeType = coffeeType;
}
enum CoffeeType{
LATTE,MOCHA,WHITE,BLUE_MOUNTAIN,AMERICANO,ESPRESSO
}
}
架構 Architecture
public class DrinkShop {
public Drink order(String drink,Drink.SugarType sugarType, Drink.IceType iceType){
drink.toLowerCase();
switch (drink){
case "coffee":
return new Coffee(sugarType,iceType);
case "tea":
return new Tea(sugarType,iceType);
default:
return null;
}
}
}
架構 Architecture
public class Client {
@Test
public void test(){
DrinkShop drinkShop = new DrinkShop();
//點一杯烏龍茶
Tea tea = (Tea)drinkShop.order("Tea", Drink.SugarType.FREE, Drink.IceType.EASY);
tea.setTeaType(Tea.TeaType.OOLONG);
//點一杯美式
Coffee coffee = (Coffee)drinkShop.order("coffee", Drink.SugarType.QUARTER,Drink.IceType.HOT);
coffee.setCoffeeType(Coffee.CoffeeType.AMERICANO);
}
}
糖度跟冰塊總共有20種組合,
咖啡有六種,茶有四種,
經過組合店員可以做出120種咖啡和80種茶。
觀點 Viewpoint
- 需求面的觀點
- 結構面的觀點
- 實做面的觀點
觀點 Viewpoint - 需求面的觀點
簡而言之,一個需求便是一個使用案例 (Use Case)
何謂需求,代表著系統外部的觀點
也就是從 "Actor" 的角度去看待系統需要什麼功能
觀點 Viewpoint - 需求面的觀點
![](http://images.kenming.idv.tw/medias/soft-imgs/arch_view_bu.png)
主要產出:使用案例圖
觀點 Viewpoint - 結構面的觀點
系統的結構設計
可以說才是決定系統的彈性、延展、效能、穩定等主要成敗因素。
觀點 Viewpoint - 結構面的觀點
![](http://database.klab.tw/teach/img/t1_02.png)
觀點 Viewpoint - 結構面的觀點
![](https://s4.itho.me/img/107/53692_3_3_l.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/689641/images/6547479/1458463817_89239.png)
主要產出:循序圖、設計類別圖
觀點 Viewpoint - 結構面的觀點
![](http://images.kenming.idv.tw/medias/soft-imgs/arch_view_sequence.png)
觀點 Viewpoint - 結構面的觀點
![](http://images.kenming.idv.tw/medias/soft-imgs/arch_view_class.png)
觀點 Viewpoint - 結構面的觀點
結構的設計,若以層次(Layer)之分,又分為高階抽象的領域模型,與細部、平台面相依的軟體規格模型。
觀點 Viewpoint - 實作面的觀點
主要產出:程式碼 Source Code
觀點 Viewpoint - 實作面的觀點
CI/CD
![](https://stackify.com/wp-content/uploads/2019/04/big-Feature-Image-on-What-Is-CI_CD.jpg)
觀點 Viewpoint - 章節小結
觀點 Viewpoint - 章節小結
觀點 Viewpoint - 章節小結
![](http://images.kenming.idv.tw/medias/soft-imgs/arch_view_rup_41_view_model.png)
設計模式
本次簡報重點終於來了
設計模式 design Pattern
什麼是設計模式
![](http://cdn1.blog.genmymodel.com/wp-content/uploads/pattern-full.png)
設計模式 design Pattern
設計模式 - 工廠模式 Factory Pattern
你跟工廠說 你想要的那種規格 的商品,
而工廠負責製造 你想要的那種規格 的商品,
當中可能需要某些組裝或是特殊步驟,
但是作為消費者你不知道這些組裝方式和步驟,
你還是可以買到 你想要的東西。
設計模式 - 簡單工廠模式
public interface Product {
//敘述自己是什麼商品
public void describe();
}
public class SaltedFrenchFries implements Product{
@Override
public void describe() {
System.out.println("我是加鹽薯條");
}
}
public class FrenchFries implements Product{
@Override
public void describe() {
System.out.println("我是無鹽薯條");
}
}
public class FrenchFriesFactory{
public static FrenchFries creatFrenchFries(String name){
if("加鹽".equals(name)) {
return new SaltedFrenchFries();
}
elis if("無鹽".equals(name)) {
return new FrenchFries();
}
else {
return null;
} } }
public class SimpleFactoryTest {
public static void main(){
SaltedFrenchFries sf =
(SaltedFrenchFries)FrenchFriesFactory.creatFrenchFries("加鹽");
FrenchFries f =
(FrenchFries)FrenchFriesFactory.creatFrenchFries("無鹽");
sf.describe(); // 我是加鹽薯條
f.describe(); // 我是無鹽薯條
} }
設計模式 - 簡單工廠模式
public class PizzaStore {
Pizza orderPizza(String type){
Pizza pizza;
if(type.equals("cheese")){
pizza = new CheesePizza();
}else if(type.equals("greek")){
pizza = new GreekPizza();
}else if(type.equals("pepperoni")){
pizza = new PepperoniPizza();
}
pizza.prepare();
pizza.cook();
return pizza
}
}
設計模式 - 簡單工廠模式
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if(type.equals("cheese")){
pizza = new CheesePizza();
}
else if(type.equals("greek")){
pizza = new GreekPizza();
}
else if(type.equals("pepperoni")){
pizza = new PepperoniPizza();
}
return pizza;
}
}
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.cook();
return pizza;
}
}
設計模式 - 簡單工廠模式
設計模式 - 簡單工廠模式
![](https://www.jyt0532.com/public/factory1.png)
public class SimplePizzaFactory {
public Pizza createPizza(String style, String type) {
Pizza pizza = null;
if(style.equals("NY")){
if(type.equals("cheese")){
pizza = new NYStyleCheesePizza();
}else...
...
}else if(style.equals("chicago")){
if(type.equals("cheese")){
pizza = new ChicagoStyleCheesePizza();
}else...
...
}
return pizza;
}
}
![](https://miro.medium.com/max/718/1*8HH633_nYO0w6Mvunz9RKQ.jpeg)
設計模式 - 簡單工廠模式
public class ChicagoPizzaFactory extends SimplePizzaFactory {
public Pizza createPizza(String type) {
retrun super.createPizza(type);
}
}
public class NYPizzaFactory extends SimplePizzaFactory {
public Pizza createPizza(String type) {
retrun super.createPizza(type);
}
}
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
pizza = factory.createPizza(type);
pizza.prepare();
pizza.cook();
return pizza;
}
}
設計模式 - 簡單工廠模式
NYPizzaFactory nyFactory = new NYPizzaFactory();
PizzaStore nyStore = new PizzaStore(nyFactory);
nyStore.orderPizza("cheese");
ChicagoPizzaFactory chicagoFactory = new ChicagoPizzaFactory()
PizzaStore chicagoStore = new PizzaStore(chicagoFactory);
chicagoStore.orderPizza("cheese");
![](https://www.jyt0532.com/public/factory3.png)
設計模式 - 工廠方法模式
![](https://upload.wikimedia.org/wikipedia/commons/4/43/W3sDesign_Factory_Method_Design_Pattern_UML.jpg)
![](https://ithelp.ithome.com.tw/upload/images/20181113/20112528fb3BbVITVH.png)
設計模式 - 工廠方法模式
public abstract class PizzaStore {
abstract Pizza createPizza(String type);
public Pizza orderPizza(String type) {
Pizza pizza = createPizza(type);
pizza.prepare();
pizza.cook();
return pizza;
}
}
public class NYPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new NYStyleCheesePizza();
} else if (item.equals("veggie")) {
return new NYStyleVeggiePizza();
} else if (item.equals("clam")) {
return new NYStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new NYStylePepperoniPizza();
} else return null;
}
}
PizzaStore nyStore =
new NYPizzaStore();
Pizza pizza =
nyStore.orderPizza("cheese");
設計模式 - 工廠方法模式
![](https://www.jyt0532.com/public/factory4.png)
-
Product(Pizza): 定義factoryMethod(createPizza)所造物件的介面
-
ConcreteProduct(NYStyleCheesePizza): 實作Product
-
Creator(PizzaStore): 宣告factoryMethod(必須傳回Product) 和其他client可以call的API
-
ConcreteCreator(NYPizzaStore): 實作factoryMethod 回傳ConcreteProduct的instance
設計模式 - 抽象工廠模式
設計模式 - 單例模式
我將於茫茫人海中訪我唯一靈魂之伴侶,得之,我幸;不得,我命,如此而已。或得則吾生,不或則吾滅。
徐志摩 《致梁啟超》
設計模式 - 單例模式
![](https://www.jyt0532.com/public/singleton1.png)
設計模式 - 單例模式
public class SoulMate{
private SoulMate() {}
}
public class SoulMate{
private SoulMate() {}
public SoulMate getInstance(){
return new SoulMate();
}
}
public class SoulMate{
private SoulMate() {}
public static SoulMate getInstance(){
return new SoulMate();
}
}
public class SoulMate{
private static SoulMate uniqueInstance;
private SoulMate() {}
public static SoulMate getInstance(){
if(uniqueInstance == null){
uniqueInstance = new SoulMate();
}
return uniqueInstance;
}
}
設計模式 - 單例模式
![](https://www.jyt0532.com/public/singleton1.png)
保證一個class只會有最多一個instance 同時提供一個存取方法
![](https://ithelp.ithome.com.tw/upload/images/20181114/20112528d85wEM7c50.png)
設計模式 - 策略模式
一般的 OOP 繼承
![](https://www.jyt0532.com/public/strategy1.png)
reuse code
abstract method
設計模式 - 策略模式
一般的 OOP 繼承
![](https://www.jyt0532.com/public/strategy2.png)
reuse code
abstract method
fly()
pulic fly(){
pass
}
設計模式 - 策略模式
![](https://www.jyt0532.com/public/strategy2.png)
abstract method
fly()
pulic fly(){
pass
}
設計模式 - 策略模式
aka encapsulate code that changes a lot. This basic O-O principle you may not know as well, here is a brief overview.
- One way that ugly code arises is new code has to be patched in as new features are added
- If you push code deeper into classes and behind encapsulation boundaries the change is isolated, code is more maintainable.
- We will cover the JavaScript library checkout example in this blog post.
設計模式 - 策略模式
![](https://www.jyt0532.com/public/strategy2.png)
abstract method
fly()
pulic fly(){
pass
}
設計模式 - 策略模式
![](https://www.jyt0532.com/public/strategy4.png)
![](https://www.jyt0532.com/public/strategy2.png)
設計模式 - 策略模式
![](https://www.jyt0532.com/public/strategy5.png)
public void performFly() {
flyBehavior.fly();
}
設計模式 - 策略模式
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck");
}
}
MallardDuck mallard = new MallardDuck();
model.performFly();//FlyWithWings的fly實作
model.setFlyBehavior(new FlyRocketPowered());
model.performFly();//FlyRocketPowered的fly實作
設計模式 - 策略模式
定義演算法家族 並把每個演算法封裝起來 演算法之間彼此可以互換
這個模式讓演算法的變動 不影響演算法的使用方式
把抽象的方法抽離在interface 把實作留給interface的subclass
設計模式 - 策略模式
![](https://www.jyt0532.com/public/strategy6.png)
設計模式 - 策略模式
![](https://www.jyt0532.com/public/strategy6.png)
// Context(Duck): 用ConcreteStrategy的物件 來設定自己的狀態
flyBehavior = new FlyWithWings();
// Strategy(FlyBehavior): 制定所有演算法的共同介面
// Context透過這個interface呼叫ConcreteStrategy實作的演算法
flyBehavior.fly();
優點
-
針對同一種行為有不同的實作
-
繼承的機制可以把共有的功能提出來
-
好維護、好測試、好擴展
缺點
-
必須熟悉實作方法
-
有可能部分策略用不到
設計模式 - 策略模式
![](https://i1.wp.com/sdsmith.net/wp-content/uploads/2019/09/the-end-is-near-e1567866567614.jpg?fit=2000%252C1730&ssl=1)
![](http://moneyaaa.com/file//n4753/t.jpg)
參考資料
這兩個必看
[軟體開發]概述
By Raiven Kao
[軟體開發]概述
- 449