軟體開發
他的英文是 Software Develope
目錄
- 工作流
- 軟體開發
- 從觀點來解釋架構
- 設計模式
工作流
寄生有寄生上流,工作也有工作上流
工作流 Workflow
用個最簡單的方式表達工作流
流程圖
工作流程 (非程式觀念)
由多個部門、多個崗位、經多個環節協調及順序工作共同完成的完整過程。
簡單地講,工作流程就是一組輸入轉化為輸出的過程。
包含元素、過程、表示
元素(表)
過程
工作流程的重要性
一方面規定了員工的工作內容;另一方面規定了員工怎樣去實現工作內容的工作流程。制度對員工在什麼崗位上要做什麼事情都規定得很好。
工作流 Workflow
工作流是一種工作流程的電腦(?)模型
屬於電腦支持的協同工作(Computer Supported Cooperative Work,CSCW)的一部分
屬於企業工程的一部分
有專屬的工作流引擎
或稱作工作流管理系統(不同於ERP)
工作流 Workflow
為了更好地實現某些業務工作目標,可以利用電腦在很多個參與人之間按某種既定原則自動傳遞文檔、資訊內容或者任務
1.流程工作流(Process Workflow)
2.專案工作流(Project Workflow)
3.案例工作流(Case Workflow)
Mantis 可歸類在案例工作流
軟體開發
大部分時間都在聊天(?)
軟體開發 - 開發流程
軟體開發 - 需求分析
軟體開發 - 需求分析
確認需求後,針對每個需求 ( 使用案例 ) 進行分析
每個使用案例對應一張穩健分析圖(robustness diagram)
軟體開發 - 需求分析
軟體開發 - 需求分析
確認(物件節點)流向後
每個穩健分析對應一張循序圖(sequence diagram)
軟體開發 - 系統分析
物件
生命線
控制焦點
消息
軟體開發 - 系統分析
軟體開發 - 系統分析
軟體開發 - 系統分析
軟體開發 - 系統分析
軟體開發 - 與工作流的關係
軟體開發 - 開發流程
軟體開發 - 自動化測試 (automation )
軟體開發 - 自動化測試 (automation )
軟體開發 - 自動化測試 (automation )
軟體開發 - 章節小結
從觀點解釋架構
是一種整體觀
架構 Architecture
若真要一言以蔽之
”架構” 是一種整體觀
需要保持從各角度看待架構時
仍有一致性與調和的觀點
架構 Architecture
一即是全,全即是一
觀點即是整體的部分
整體的部分即是觀點
金剛經有云:「凡所有相,皆屬虛妄,見諸相非相,即見如來」。
架構 Architecture
架構 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 - 需求面的觀點
主要產出:使用案例圖
觀點 Viewpoint - 結構面的觀點
系統的結構設計
可以說才是決定系統的彈性、延展、效能、穩定等主要成敗因素。
觀點 Viewpoint - 結構面的觀點
觀點 Viewpoint - 結構面的觀點
主要產出:循序圖、設計類別圖
觀點 Viewpoint - 結構面的觀點
觀點 Viewpoint - 結構面的觀點
觀點 Viewpoint - 結構面的觀點
結構的設計,若以層次(Layer)之分,又分為高階抽象的領域模型,與細部、平台面相依的軟體規格模型。
觀點 Viewpoint - 實作面的觀點
主要產出:程式碼 Source Code
觀點 Viewpoint - 實作面的觀點
CI/CD
觀點 Viewpoint - 章節小結
觀點 Viewpoint - 章節小結
觀點 Viewpoint - 章節小結
設計模式
本次簡報重點終於來了
設計模式 design Pattern
什麼是設計模式
設計模式 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;
}
}
設計模式 - 簡單工廠模式
設計模式 - 簡單工廠模式
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;
}
}
設計模式 - 簡單工廠模式
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");
設計模式 - 工廠方法模式
設計模式 - 工廠方法模式
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");
設計模式 - 工廠方法模式
-
Product(Pizza): 定義factoryMethod(createPizza)所造物件的介面
-
ConcreteProduct(NYStyleCheesePizza): 實作Product
-
Creator(PizzaStore): 宣告factoryMethod(必須傳回Product) 和其他client可以call的API
-
ConcreteCreator(NYPizzaStore): 實作factoryMethod 回傳ConcreteProduct的instance
設計模式 - 抽象工廠模式
設計模式 - 單例模式
我將於茫茫人海中訪我唯一靈魂之伴侶,得之,我幸;不得,我命,如此而已。或得則吾生,不或則吾滅。
徐志摩 《致梁啟超》
設計模式 - 單例模式
設計模式 - 單例模式
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;
}
}
設計模式 - 單例模式
保證一個class只會有最多一個instance 同時提供一個存取方法
設計模式 - 策略模式
一般的 OOP 繼承
reuse code
abstract method
設計模式 - 策略模式
一般的 OOP 繼承
reuse code
abstract method
fly()
pulic fly(){
pass
}
設計模式 - 策略模式
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.
設計模式 - 策略模式
abstract method
fly()
pulic fly(){
pass
}
設計模式 - 策略模式
設計模式 - 策略模式
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
設計模式 - 策略模式
設計模式 - 策略模式
// Context(Duck): 用ConcreteStrategy的物件 來設定自己的狀態
flyBehavior = new FlyWithWings();
// Strategy(FlyBehavior): 制定所有演算法的共同介面
// Context透過這個interface呼叫ConcreteStrategy實作的演算法
flyBehavior.fly();
優點
-
針對同一種行為有不同的實作
-
繼承的機制可以把共有的功能提出來
-
好維護、好測試、好擴展
缺點
-
必須熟悉實作方法
-
有可能部分策略用不到
設計模式 - 策略模式
參考資料
這兩個必看
[軟體開發]概述
By Raiven Kao
[軟體開發]概述
- 479