Смешивание знаний при старте десктопного приложения


Исходный код

if ( g_nIdleState == 0 ) 
	{	<em>// Initialize the splash screen right away</em>if ( g_CurrentOptions.get_splash_screen() ) 
			fgSplashInit();
		g_nIdleState++;
    } 
	elseif ( g_nIdleState == 1 ) 
			g_nIdleState++;
		elseif ( g_nIdleState == 2 ) 
				g_nIdleState++;
			elseif ( g_nIdleState == 3 ) 
				{
					if( !fgInitSubsystems()) 
					{
						FG_LOG(__FILE__, __LINE__,  FG_DK_GENERAL, FG_FALSE,   "Subsystem initializations failed ..." );
						exit(-1);
					}
					g_nIdleState++;
				}
				elseif ( g_nIdleState == 4 ) 
					{
						fgInitVisuals();  <em>// setup OpenGL view parameters</em>
						g_nIdleState++;
					}
					elseif ( g_nIdleState == 5 ) 
							g_nIdleState++;
						elseif ( g_nIdleState == 6 ) 
							{
								mark_time( &g_tsFrame );
								mark_time(&g_tsTime);
								g_nIdleState = 1000;
							} 

    if ( g_nIdleState == 1000 ) 
		fgMainLoop();
	elseif ( g_CurrentOptions.get_splash_screen() == 1 ) 
			fgSplashUpdate(0.0);

Что не так в исходном коде

Сразу бросается в глаза адская лесенка из вложенных операторов if — else, которая в некий момент почему-то неожиданно прерывается.

Когда проходит шок от лесенки, можно рассмотреть в исходном коде смешивание знаний о том, что делать на каждом шаге процесса старта приложения, и как переходить от одного шага к другому.

Также стоит избавляться от магических литералов, заменяя их на константы или на худой конец, на макросы.

Вариант рефакторинга исходного кода

#define STEP_SPLASH_SCREEN 0
#define STEP_SOMETHING_1   1
#define STEP_SOMETHING_2   2
#define STEP_SUBSYSTEMS    3
#define STEP_VISUALS       4
#define STEP_SOMETHING_5   5
#define STEP_MARK_TIME     6
#define STEP_MAIN_LOOP  1000
#define STEP_FIRST_INIT    STEP_SPLASH_SCREEN
#define STEP_LAST_INIT     STEP_MARK_TIME
void DoBootstrapStep( int step ) {
	switch ( step ) {
		case STEP_SPLASH_SCREEN:
			if ( g_CurrentOptions.get_splash_screen() ) 
				fgSplashInit();
			break;
		case STEP_SOMETHING_1:
			break;
		case STEP_SOMETHING_2:
			break;
		case STEP_SUBSYSTEMS:
			if ( !fgInitSubsystems() ) {
				FG_LOG(__FILE__, __LINE__,  FG_DK_GENERAL, FG_FALSE,   "Subsystem initializations failed ..." );
				exit(-1);
			}
			break;
		case STEP_VISUALS:
			fgInitVisuals();  <em>// setup OpenGL view parameters</em>break;
		case STEP_SOMETHING_5:
			break;
		case STEP_MARK_TIME:
			mark_time( &g_tsFrame );
			mark_time( &g_tsTime );
			break;
		case STEP_MAIN_LOOP:
			fgMainLoop();
			break;
		default:
			if ( g_CurrentOptions.get_splash_screen() == 1 ) 
				fgSplashUpdate(0.0);
	}
}

int GetNextStep( int step ) {
	if ( step == STEP_LAST_INIT ) 
		return STEP_MAIN_LOOP;
	if ( step < STEP_LAST_INIT ) 
		return step + 1;
	}
	return step;
}

int main() {
	int g_CurrentOptions = STEP_FIRST_INIT;
	while ( true ) {
		DoBootstrapStep( step );
		step = GetNextStep( step );
	}
}