列入狀態圖程式碼

關於這項作業

以下列狀態圖為例:

狀態圖

當您使用非階層式綱目實作此狀態圖時,您預期將下列方法新增至類別,並透過來自 rootState_dispatchEvent() 的一系列新函數呼叫來呼叫這些方法:

int MyClass::s2TakeNull() {
    int res = eventNotConsumed;
    s2_exit();
    //#[ transition 2
    f2();
    f2();
    //#]
    s3_entDef();
    res = eventConsumed;
    return res;
};
int MyClass::s1TakeNull() {
    int res = eventNotConsumed;
    s1_exit();
    //#[ transition 1
    f1();
    f1();
    //#]
    s2_entDef();
    res = eventConsumed;
    return res;
};

實際上,所發生的事情是轉移程式碼(//#[//#] 方括弧之間)會立即列入(內嵌)rootState_dispatchEvent() 的內部,如下所示:

int MyClass::rootState_dispatchEvent(short id) {
    int res = eventNotConsumed;
    switch(rootState_active) {
        case s1:
        {
            if(id == Null_id)
                {
                    popNullConfig();
                    //#[ transition 1
                    f1();
                    f1();
                    //#]
                    pushNullConfig();
                    rootState_subState = s2;
                    rootState_active = s2;
                    res = eventConsumed;
                }
            break;
        };
        case s2:
        {
            if(id == Null_id)
                {
                    popNullConfig();
                    //#[ transition 2
                    f2();
                    f2();
                    //#]
                    rootState_subState = s3;
                    rootState_active = s3;
                    res = eventConsumed;
                }
            break;
        };
    };
    return res;
}; 

此程式碼更有效率,這是因為它會使用列入的程式碼來節省一部分函數呼叫。 使用類別的 CG::Class::ComplexityForInlining 內容可以實現列入,依預設,該內容會設為 3。這表示如果使用者程式碼(轉移的動作部分)少於三行,則會在使用函數呼叫的地方列入程式碼,以取代該函數呼叫。 若要取得「預期」結果(不列入),請將此內容設為 0


回饋