State Machine - Мемлекеттер үшін таңдаулы ма?

Мен штаттар ретінде статикалық айнымалы мәндерді алғым келеді, бірақ Objective C оны рұқсат етпеді

Мен мемлекеттік сыныбы үшін + (int) LOOPING_STATE тырыстық, бірақ ол сәтсіз болады

switch (myCurrentState) {
case [STATE_CLASS LOOPING_STATE]:   <== received an error of "expression can't be put here"
return;
}

Әдетте мемлекеттік кодтарды жазу үшін таңдау керек пе?

Басқа нұсқалар бар ма, және қандай жағдайда бұл опцияларды қолдануға болады?

Алдын-ала рақмет.

2

2 жауаптар

Бұл Objective-C-імен көп емес, бірақ Objective-C-де көп. Жалпы айтқанда, сіздің мемлекеттік аппаратыңыздың жай-күйін көрсету үшін enum пайдалану қарапайым бүтін сандардан артық болуы керек.

Коммутатордағы сабақтарды пайдалана алмаудың себебі - коммутатордың сөйлеміндегі этикеткаларда пайдаланылатын өрнектердің мәні компиляция уақытында белгілі болуы қажет. [STATE_CLASS LOOPING_STATE] деп сыныпты әдіс шақыру деп есептесе, компилятор компиляция уақытында бұл өрнектің нәтижесін қауіпсіз біле алмайды және осылайша коммутаторды жасаудан бас тартады.

Неге компилятор компиляция уақытында этикеткалар үшін пайдаланылатын өрнектердің нәтижесін білуді талап етеді? Коммутатордың тұжырымдамасының идеясы, егер/else блоктары болса, семантикалық баламалар сериясынан тиімдірек болуы керек. Бұл коммутаторды диспетчерлік кестеге шартсыз секіру арқылы аудару арқылы қол жеткізіледі, ал егер шешім болса, онда шартты секірулер көп талап етіледі. Қалай оңай болжауға болады, шартты секірулер негізінен қазіргі заманғы құбырлы процессорлар конструкцияларына қайшы келеді, себебі олар бүкіл құбырды тазартуға әкелуі мүмкін. (Қазіргі заманғы процессорлар күрделі салаларды болжаумен өтелуге тырысады, бірақ мәселені толықтай аластауға болады ма?)

Бірақ содан кейін, оны дұрыс алу, алдымен екінші секундына жетеді.

4
қосылды
Статемачиніздің тақырыбындағы енін жариялау жақсы болуы керек, себебі барлық штаттардың бәрі де ақырғы болуы керек. Мен бүкіл әлемде осы тұрақты мәндерді анықтайтын мәселені көрмеймін (өйткені, мән-мағына емес, символдарға ғана сенің мүддеңіз).
қосылды автор Johannes Rudolph, көзі
Түсіндіру үшін көптеген thx. Мен ғаламдық тұрақтыды жек көретіндіктен, жекеменшік классты сынға алудың тәсілі бар ма? Немесе қалағанымды істеу үшін басқа нұсқалар бар ма? Рахмет!
қосылды автор Unreality, көзі

Егер бұл жай машина тез болуы керек болса, әңгімелер - бұл тәсіл. Дегенмен, егер сіз объектіге бағдарланған тәсілді орындауды қаласаңыз, әр мемлекеттің функционалдылығы мемлекеттік нысанның өзі болып табылады. Осылайша сіз коммутатордың/егер сөзін мүлдем жойсаңыз еді. Сіздің мемлекеттік аппаратыңыздың циклі келесідей көрінеді:

-(void) run
{
    State* currentState;

    currentState = [self startState];
    while (currentState != [self stopState])
    {
        currentState = [currentState transitionWitInput: inputs 
                                                actions: actions];
    }
}

inputs is the input data for the state transition, actions is a block or a selector or an NSInvocation or something that tells the state what to do during the transition.

3
қосылды