寫給C++程式設計師的UML實務手冊//讀書心得


此篇文章是我讀《UML for C++ programmer》的讀書心得,透過書裡的範例,重新整理而成的一篇文章。


本文目錄

  • 類別圖
    系統內部的靜態結構
  • 循序圖
    實作,物件外部的互動行為
  • 案例圖
    系統的外部行為
  • 狀態圖
    物件內部變化





類別圖

結合關係

只要在類別內宣告,不管是直接宣告或指標(java骨子裡都是指標,沒有直接宣告這回事,所以在C++當作是同一回事。)

一對一結合關係

class Bid
 {
     Fund *fundObj; 
};
將Fund類別的物件,當作是Bid類別的Member Variable使用。
類別圖
物件圖

一對多結合關係

class Account
 {
     vector<Bid*> bidObj;
};
將Bid類別的物件,當作是Account類別的Member Variable使用。
陣列也一樣
類別圖

物件圖

多對一結合關係

class Account
 {
    vector <Bid*> bidObj;
};
將Bid類別的物件,當作是Account類別的Member Variable使用。 陣列也一樣
class Bid 
{
     Fund *fundObj; 
};
將Bid類別的物件,當作是Account類別的Member Variable使用。
類別圖

物件圖


組合關係

其實,還有一個聚合關係,不管是組合關係還是聚合關係,差別在於這兩個類別之間,有著「整體-部份」的關係
(在Design Pattern裡,就是組件的那個Pattern?)
聚合關係 - 不會create「部份」類別
組合關係 - 會create「部份」類別
class RegularBid 
{
 public: 
    void createBidItem( float, Fund* ); 
private:
     vector<biditem> itemObj;
 };
void RegularBid::createBitItem(float theUnit, Fund* theFund)
 {
     BidItem *myItem = new BidItem(theUnit);
 }
BidItem和RegularBid之間有著整體 – 部份的關係
將BidItem類別的物件,當作是RegularBid類別的Member Variable使用。
利用Member Function來掌握其生命週期。
類別圖

物件圖


依賴關係

此類別內不宣告該物件,而該物件為參數。
class Bid
 {
     int calcAsset(Fund*);
 };
將Fund類別的物件,當作Bid類別中Member Funcion的Parameter使用
類別圖

物件圖


一般化關係

這就是繼承,其中還有protceted的權限和虛擬函數。
class SingleBid : puclic Bid
 {
 };
SingleBid繼承Bid。
類別圖

物件圖

protected權限的一般化關係

class Bid
 {
 protected:
     Fund *fundObj;
     int amount;
  };
Bid裡的funObj和amount設定成protected的權限,提供繼承類別(SingleBid)的存取權限,並且不屬於公開。。
class SingleBid : puclic Bid 
{
 };
SingleBid繼承了Bid。
類別圖

物件圖

有虛擬函數的一般化關係

class Bid
 {
 public:
     virtual int calcAsset() = 0;
     virtual float getUnit() = 0; 
};
Bid裡的calcAsset()和getUnit()設定為(純)虛擬,提供繼承類別(SingleBid)重新定義該Member function的實作。
class SingleBid : puclic Bid
 {
 public:
     int calcAsset();
     float getUnit();
 };
SingleBid繼承了Bid,重新定義caclAsset()和getUnit()兩個Member function,因為虛擬所以可以透過Bid呼叫SingleBid的Memberfunction實作內容。
類別圖

物件圖



循序圖

循序圖與類別圖的耦合

結合關係

class Bid 
{
     Fund *fundObj; 
};
float Bid::calcUnit()
 {
     thePrice = funObj->getPirce();
 }

float Bid::calcFee()
 {
     theFundFee = fundObj->getFee();
 }


結合關係

class Account 
{
     vector<Bid*> bidObj; 
};
int Account::calcAmount()
 {
     for( int i = 0; i < size; i++)
         theAmount += bidObj[i]->getAmount(); 
}

結合關係

class Account 
{
     vector<Bid*> bidObj; 
};
int Account::calcAsset()
 {
     for( int i = 0; i < size; i++) 
        theAsset += bidObj[i]->getAsset(); 
}

class Bid
 {
     Fund *fundObj; 
};
int Bid::calcAsset()
 {
     return unit * funObj->getPrice(); 
}

組合關係

class RegularBid
 {
 public:
     void createBidItem( float, Fund* ); 
private:
     vector itemObj;
 };
void RegularBid::createBitItem(float theUnit, Fund* theFund)
 {
    BidItem *myItem = new BidItem(theUnit);
     myItem->setFund(theFund);
     itemObj.push_back(myItem);
 }

依賴關係

class Bid
 {
     int calcAsset(Fund*);
};
int Bid::calcAsset(Fund* theFund)
 {
    return unit * theFund->getPrice(); 
}

一般化關係

class SingleBid : puclic Bid 
{
 };

循序圖和.cpp的實作

private操作

class RegularBid 
{
 public:
     int calcAsset(Fund*);
 private: 
    float getUnit(); 
};
int Bid::calcAsset(Fund* theFund) 
{
    return getUnit() * theFund->getPrice(); 
}

protected操作

class Bid 
{
 public: 
    virtual int calcAsset(Fund*) = 0;
 private:
     float getUnit(); 
};
class RegularBid : public Bid
 {
     int calcAsset(Fund*);
 };
int RegularBid::calcAsset(Fund* theFund) 
{
    return getUnit() * theFund->getPrice(); 
}

new操作

class Account 
{
 public:
      Account(); 
};
int main()
 {
    Account* myAccount  = new Account(); 
}

delete操作

class Account 
{ 
public: 
    ~Account(); 
};
int main() 
{
    delete myAccount; 
}

通訊圖

可透過轉檔的方式,從循序圖轉成通訊圖
通訊圖 = 序號 + 循序圖


案例圖

參考《架站前一定要上的10堂課》裡的sitepath diagram

狀態圖

參考電機電子的FSM

沒有留言:

張貼留言

(什麼是留言欄訊息?)