第8回:关于计算机模拟状态机在工程实践编程中的实际应用(3)

作者认为:计算机的所有计算和模拟行为均可以总结成四个字,操作变量,因此,通用的变量抽象极为重要,由于计算机对变量的所有操作均需要经过人工审核(编译),因此,一方面,变量是面向计算机的,需要通过ID(内存地址)用于计算机区分识别,另一方面,变量是面向软件工程师的,作者使用字符串变量为通用变量类保存变量的名称,便于工程师在计算机运行时进行追踪,也方便用户修改XML配置文件中的变量值和变量属性。

作者所有软件工程的基础,通用变量类抽象如下:

class Variant : public State
{
public:
    enum
    {
      TONONE=0,
      TOXML=1,
      TOFILE=2,
      TOBOTH= TOXML|TOFILE,
    };
    Variant();
    Variant(int iID);
    Variant(int iID,const QString& sName);
    Variant(int iID,const QString& sName, const QVariant& vVar,int iSerialStyle);
    bool isVariantValid();
    int m_iSerialStyle;
    int m_iID;
    QString m_sName;
    QVariant m_vVar;
    bool WriteConfig(QDomDocument &doc, QDomElement &root);
    bool ReadConfig(QDomElement &root);
    QDomElement AppandRootDom(QDomDocument &doc, QString& name, QDomElement &root);
    QDomElement AppandValueDom(QDomDocument &doc, QString &name, QString &value, QDomElement &root);
};

QDataStream &operator<<(QDataStream &out,const Variant& var);
QDataStream &operator>>(QDataStream &in, Variant& var);

作者使用QVariant储存变量值,使用QString变量类型储存变量名称,并额外定义了变量的读写类型以及读写函数,以确定变量是保存在XML配置文件还是参数文件,作者还为变量类提供了ID变量,便于程序索引使用。

类似于数据库的关联表,作者使用变量ID作为外键建立一个变量描述类,用于存储变量元信息,其定义如下:

class VarDesc : public Object
{
public:
    VarDesc();
    VarDesc(int iID);
    VarDesc(int iID,const QStringList& slRange,
            const QString &sUnit,double dRate,int iPrecise);
    int m_iID;
    QStringList m_slRange;
    QString m_sUnit;
    double m_dRate;
    int m_iPrecise;
    void WriteConfig(QDomDocument &doc, QDomElement &root);
    void ReadConfig(QDomElement &root, int iStartNode);
};

其中:

  • m_slRange:使用字符串链表保存变量可能的取值,或者对于数值类型的变量来说,可以用于保存数值的取值范围,第一个数据表示最小值,第二个数据表示最大值。
  • m_sUnit:用于保存变量单位。
  • m_dRate:用于保存变量缩放比例(这个做备用,一般不在工程中使用)。
  • m_iPrecise:变量小数点位数。

类似于数据库中的数据表,作者又使用QMap泛型类建立了一个变量描述表类型(使用变量ID作为Key值),并抽象建立变量描述表类,用于存储项目中所有的变量描述值,并定义为全局变量由整个项目引用。其定义如下:

typedef QMap<int,VarDesc> MVARDESC;
class VarDescTable : public Thing
{
public:
    VarDescTable();
    MVARDESC m_mVarDesc;
    VarDesc* get_VarDesc(int iID);
    void add_VarDesc(int iID,const QStringList& slRange=QStringList(),
                            const QString &sUnit=QString(),double dRate=1,int iPrecise=3);
};
extern VarDescTable m_gVarDescMap;

作者在变量描述表类中额外定义了一些辅助函数,用于快速添加和索引变量描述类。

利用QVariant、QT泛型类提供的拷贝构造函数,以及C++类使用的默认拷贝构造函数,作者在类中和表中均可以直接使用变量类型定义变量,而不用使用变量类型指针定义变量(需要自己管理变量赋值以及变量内存拷贝操作)。

下一篇将介绍项目使用的状态机的计算机模拟定义。


         不喜欢 0

D7FECB19D148C1AD1D829F1CD0E23DB0

发表回复

站内搜索

最新评论

归档日历

2024 年 9 月
 1
2345678
9101112131415
16171819202122
23242526272829
30  

标签云