zoukankan      html  css  js  c++  java
  • UML类图

    之前自己常用如下方法建立类图 

    这是之前的方法,其实不应该这样,应该建立一个empty的project

    选择model --> profile

    选择C++ Profile和UML Standard Profile

    把项目的名字改一下

    右键点击,选择Add --> Model

    改个名字

    再改个名字,就默认出来了类的那些选项卡了

    下面开始画了,我们先来看一个最最简单的类吧,如下:

    Fund.h

    1 class Fund
    2 { 
    3 public:
    4     Fund(float);
    5     float getPrice();
    6 private:
    7     float price;
    8 };

    Fund.cpp

    1 Fund::Fund(float thePrice)
    2 {
    3     price=thePrice;
    4 }
    5 
    6 float Fund::getPrice()
    7 {
    8     return price;
    9 }

    单击出现的price

    这就算自动更新完毕了

    我们的一个函数也就如此完成了

    这种我们就直接输入getPrice(): float,免得一堆麻烦事情!

    然后我们再来看一个类,如下:

    Bid.h

    1 class Bid 
    2 {
    3 public:
    4     void setFund(Fund*);
    5     virtual int calcAsset()=0; 
    6     virtual float getUnit()=0;
    7 protected:
    8     Fund *fundObj; 
    9 };

    Bid.cpp

    1 void Bid::setFund(Fund *theFund)
    2 {
    3      fundObj=theFund;
    4 }

    对于抽象类,我们选中右边的IsAbstract

    type只能手动填写了

    指定某个函数是抽象操作

    相同的东西我们不再赘述了,直接搞就得了

    下面我们来建立类Bid和类Fund的关系吧

    下面再搞其他的类,定义如下:

    RegularBid.h

     1 class RegularBid : public Bid
     2 {
     3 public:
     4     RegularBid();  
     5     int calcAsset();
     6     float getUnit();   
     7     
     8 private:
     9     vector<BidItem*> itemObj;
    10 };

    再来看类BidItem:

    BidItem.h

    1 class BidItem 
    2 {
    3 public:
    4     BidItem(float); 
    5     float getUnit();
    6 private:
    7     float unit;
    8 };

    BidItem.cpp

    1 BidItem::BidItem(float theUnit)
    2 { 
    3      unit=theUnit;
    4 }
    5 
    6 float BidItem::getUnit()
    7 {
    8     return unit;
    9 }

    取消导航性,即不支持反向链接

    然后再完成其他的类图

    SingleBid.h

    1 class SingleBid : public Bid
    2 {
    3 public:
    4     SingleBid(float);    
    5     int calcAsset();
    6     float getUnit(); 
    7 private: 
    8     float unit;
    9 }; 

    SingleBid.cpp

     1 SingleBid::SingleBid(float theUnit)
     2 {
     3     unit=theUnit; 
     4 } 
     5 
     6 int SingleBid::calcAsset()
     7 {
     8     return unit*fundObj->getPrice();
     9 }
    10 
    11 float SingleBid::getUnit()
    12 {
    13     return unit;
    14 } 

     Account.h

    1 class Account 
    2 {
    3 public:
    4     void setBid(Bid*); 
    5     int calcAsset(); 
    6 private:
    7     vector<Bid*> bidObj;
    8 };

    Account.cpp

     1 void Account::setBid(Bid *theBid)
     2 { 
     3      bidObj.push_back(theBid);
     4 }
     5 
     6 int Account::calcAsset()
     7 {
     8      int size,theAsset=0;
     9      size=bidObj.size();
    10      for(int i=0;i<size;i++)
    11          theAsset=theAsset+bidObj[i]->calcAsset();
    12      return theAsset; 
    13 } 

    图都画完了,然后可以导出C++文件,我们来看一下导出的文件和我们期望的文件的不同:

    (1)Account.h

    UML图中的表现形式和我们实际希望的代码还是有出入的……

    (update 2017-10-29)该问题已解决,具体可以参见UML类图详解_关联关系_一对多,里面对未达到预期的原因做了详细解释以及规避方法

    (2)Bid.h

    达到预期

    (3)BidItem.h

    达到预期

    (4)Fund.h

    达到预期

    (5)RegularBid.h

    UML图中的表现形式和我们实际希望的代码还是有出入的…… 

    (update 2017-10-29)该问题已解决,具体可以参见UML类图详解_组合关系,里面对未达到预期的原因做了详细解释以及规避方法

    (6)SingleBid.h

    达到预期

    (update 2017-10-29)总结两点:

    1、一旦类图里面包含了一次成员那么在XX端点再声明一次的话就会重复,另外如果不在类图里面包含一次成员而在XX端点处声明一次的话生成的代码比较傻,很多情况下无法满足我们的要求。所以我们就是把成员都在类图里面包含进去,XX端点处就是声明一下多重性,而不要再声明成员就可以了。这就可以解决上面两处生成的代码没有满足我们需求的问题。

    2、本篇博客是刚接触UML时所写,图画得还是有些问题的,后来又重新研究了一下,重新汇总了一下,具体见UML类图详解_泛化关系。 

  • 相关阅读:
    java过滤器 Fliter
    input标签name、value与id属性
    python 简单的数据库操作之转账
    正则表达式基本语法
    适合新手的Python爬虫小程序
    如何使用EditPlus将json格式字符串默认为UTF-8格式
    codeforces 527C:STL set
    codeforces 527B:瞎搞
    HDU 3397 线段树
    HDU 3436:splay tree
  • 原文地址:https://www.cnblogs.com/abc-begin/p/7746466.html
Copyright © 2011-2022 走看看