Vereinfachungs-Muster
Übersicht über Vereinfachungstechniken
Die Vereinfachung komplexer bedingter Verzweigungen umfasst mehrere strategische Ansätze, die den Code lesbarer, wartbarer und effizienter machen.
1. Early-Return-Muster
Vor dem Refactoring
int processData(int type, int status) {
int result = 0;
if (type == 1) {
if (status == 0) {
result = calculateSpecialCase();
} else {
result = -1;
}
} else {
result = -1;
}
return result;
}
Nach dem Refactoring
int processData(int type, int status) {
if (type != 1) return -1;
if (status != 0) return -1;
return calculateSpecialCase();
}
2. Zustandsautomaten-Muster
stateDiagram-v2
[*] --> Idle
Idle --> Processing: Gültiger Input
Processing --> Complete: Erfolg
Processing --> Error: Fehler
Complete --> [*]
Error --> [*]
Implementierungsbeispiel
typedef enum {
STATE_IDLE,
STATE_PROCESSING,
STATE_COMPLETE,
STATE_ERROR
} ProcessState;
ProcessState handleState(ProcessState current, int event) {
switch(current) {
case STATE_IDLE:
return (event == VALID_INPUT) ? STATE_PROCESSING : STATE_IDLE;
case STATE_PROCESSING:
return (event == SUCCESS) ? STATE_COMPLETE :
(event == FAILURE) ? STATE_ERROR : STATE_PROCESSING;
default:
return current;
}
}
3. Lookup-Tabellen-Strategie
Vergleich der Komplexitätsreduzierung
Ansatz |
Lesbarkeit |
Performance |
Wartbarkeit |
Mehrere If-Else |
Gering |
Mittel |
Gering |
Switch-Anweisung |
Mittel |
Hoch |
Mittel |
Lookup-Tabelle |
Hoch |
Sehr Hoch |
Hoch |
Implementierung der Lookup-Tabelle
typedef struct {
int type;
int (*handler)(int);
} HandlerMapping;
int handleType1(int value) { /* Implementierung */ }
int handleType2(int value) { /* Implementierung */ }
int handleDefault(int value) { /* Implementierung */ }
HandlerMapping handlers[] = {
{1, handleType1},
{2, handleType2},
{-1, handleDefault}
};
int processValue(int type, int value) {
for (int i = 0; i < sizeof(handlers)/sizeof(HandlerMapping); i++) {
if (handlers[i].type == type) {
return handlers[i].handler(value);
}
}
return handleDefault(value);
}
4. Funktionale Zerlegung
Komplexe Bedingung
int complexFunction(int a, int b, int c) {
if (a > 0 && b < 10) {
if (c == 5) {
// Komplexe Logik
} else if (c > 5) {
// Komplexere Logik
}
}
// Weitere Bedingungen...
}
Refaktorierte Version
int validateInput(int a, int b) {
return (a > 0 && b < 10);
}
int handleSpecialCase(int c) {
return (c == 5) ? specialLogic() :
(c > 5) ? alternateLogic() : defaultLogic();
}
int simplifiedFunction(int a, int b, int c) {
return validateInput(a, b) ? handleSpecialCase(c) : -1;
}
LabEx Empfehlung
Bei LabEx ermutigen wir Entwickler, bedingte Logik kontinuierlich zu refaktorieren und zu vereinfachen. Diese Muster verbessern nicht nur die Codequalität, sondern steigern auch die allgemeine Wartbarkeit der Software.