viele if-Abfragen



  • Hallo 🙂
    Ich habe ein Programm geschrieben (mit Qt als GUI) und habe in einer Funktion relativ viele if-Abfragen:

    static bool start = false;
    
    	if(start == true)//wenn auf den start Button geklickt wurde
    	{	
    		...
    
    			if(ui.change->isChecked())
    			{
    				if(v[wert].getAntwort() == getText())
    					{
    						...
    					}
    			}
    
    				else
    				{
    					if(v[wert].getLösung() == getText())
    					{
    					 ...
    					}
    				}
    
    					if(ui.checkBox->isChecked())
    					{
    						v.erase(v.begin()+wert); 
    					}
    
                                        ...
    
    					if(ui.checkBox->isChecked())
    					{
    						if(v.size() <= 0) 
    							{
    						            results();
    						 	}		
    					}
    
    					if(!ui.checkBox->isChecked())
    					{
    						if(anzahl >= 10)
    						{
    							                      results(anzahl,richtig,start);
    						}
    					}
    
    							if(start == true)
    							{
    
    								if(ui.change->isChecked())
    								{
    									setchange();
    								}
    
    								else
    								{
    								setv();
    								}
    
    							}
    
    		}
    
    	else // wenn der Button das erste mal geklick wird
    	{
    		if(read_file())
    		{
    				start = true;
    				ui.checkButton->setText("Check");
    				ui.checkBox->setEnabled(false);
    				ui.Edit->setEnabled(false);
    
    				if(ui.change->isChecked())
    				{
    					setchange();
    				}
    
    				else
    				{
    					setv();
    				}
    
    				ui.change->setEnabled(false);
    		}
    
    	}
    

    Gibt es vlt eine alternative dafür? (Das Programm prüft halt immer ob eine Option eingestellt wurde (if(ui.change->isChecked()))
    Danke 🙂



  • Du könntest das ganze etwas stauchen:

    static bool start = false; 
    
    	if(start)//wenn auf den start Button geklickt wurde 
    	{   
    		//... 
    
    		if(ui.change->isChecked()) 
    		{ 
    			if(v[wert].getAntwort() == getText()) 
    			{ 
    				//... 
    			} 
    		}
    		else 
    		{ 
    			if(v[wert].getLösung() == getText()) 
    			{ 
    				//... 
    			} 
    		} 
    
    		if(ui.checkBox->isChecked()) 
    			v.erase(v.begin()+wert); 
    
    		//... 
    
    		if(ui.checkBox->isChecked()) 
    		{ 
    			if(v.size() <= 0) 
    				results();      
    		}
    		else
    		{ 
    			if(anzahl >= 10) 
    				results(anzahl,richtig,start); 
    		} 
    
    		if(ui.change->isChecked()) 
    			setchange(); 
    		else 
    			setv(); 
    	} 
    	else // wenn der Button das erste mal geklick wird 
    	{ 
    		if(read_file()) 
    		{ 
    			start = true; 
    			ui.checkButton->setText("Check"); 
    			ui.checkBox->setEnabled(false); 
    			ui.Edit->setEnabled(false); 
    
    			if(ui.change->isChecked()) 
    				setchange(); 
    			else 
    				setv(); 
    
    			ui.change->setEnabled(false); 
    		} 
    	}
    

    Alternativen gibt es wohl keine, außer du schaffst es die Bedingungen umzustrukturieren.



  • ok vielen Dank 🙂
    Aber ist das wenn man so viele if-Abfragen hat nicht schlechter style?



  • Das ist doch noch nicht viele. 🤡

    Aber es geht ja schlecht mit weniger Abfragen oder ?
    Insofern passt das schon.



  • Wenn es mehr werden sollte, würde ich mal State Charts in den Raum werfen:

    z. B. aus boost:

    http://www.boost.org/doc/libs/1_55_0/libs/statechart/doc/index.html

    und

    http://www.boost.org/doc/libs/1_55_0/libs/msm/doc/HTML/index.html

    VG

    Pellaeon



  • asdfasdfasdf schrieb:

    Aber ist das wenn man so viele if-Abfragen hat nicht schlechter style?

    Grundsätzlich kommt es darauf an ob es eine Alternative gibt.

    Allgemein spricht wenig gegen viele if, wenn sie notwendig sind. Falls die Verschachtelungen zu tief werden sollte man nur überlegen ob eine Negation die Abfragetiefe vielleicht ändern kann, oder ob man Codeteile in Funktionen auslagert.

    Bei längeren Code mit vielen if neige ich dazu, die Logik in kleinere Funktionen zu splitten.


Anmelden zum Antworten