● You've identified a significant architectural flaw! The handle_system_operations function does NOT fit the dispatch table
approach properly. Here's why:
The Problem
Dispatch Table Anti-Pattern: The function uses a switch-like if/else chain to dispatch on key, which defeats the purpose of the
dispatch table:
if(key == '&') { /* ... */ }
else if(key == '\\') { /* ... */ }
else if(key == '>') { /* ... */ }
else if(key == '<') { /* ... */ }
else if(key == '?') { /* ... */ }
else if(key == XK_slash) { /* ... */ }
Multiple Dispatch Table Entries: Six different keys all point to the same function, creating redundant dispatch:
- {'&', 0, "trim_wires", ..., handle_system_operations}
- {'\\', 0, "toggle_fullscreen", ..., handle_system_operations}
- {'>', 0, "increase_layer", ..., handle_system_operations}
- etc.
The Correct Architecture
Each key should have its own focused handler function:
// Instead of one multi-key function:
static void handle_system_operations(...) { if/else chain }
// Should be individual focused functions:
static void handle_wire_connectivity(...) { trim_wires(); }
static void handle_fullscreen_toggle(...) { toggle_fullscreen(); }
static void handle_layer_increase(...) { /* layer logic */ }
static void handle_layer_decrease(...) { /* layer logic */ }
static void handle_help_display(...) { tcleval("textwindow..."); }
static void handle_keybindings_display(...) { tcleval("show_bindkeys"); }
Impact
This creates two-level dispatch:
1. Dispatch table finds handle_system_operations
2. Function internally dispatches again on key
This negates the benefits of the dispatch table approach and makes the code harder to maintain.
Should We Fix This?
Yes! We should refactor handle_system_operations (and check other multi-key handlers) to use individual focused functions. This
would:
1. Eliminate the internal if/else chain
2. Create true single-responsibility functions
3. Make the dispatch table more maintainable
4. Enable easier testing of individual operations
----------------
● 🎯 SUCCESS! Dispatch Table Anti-Pattern Completely Eliminated
What Was Fixed
Before: Multiple functions violated the dispatch table pattern by doing internal key-based dispatch:
1. handle_system_operations - Dispatched on 6 different keys (&, \, >, <, ?, XK_slash)
2. handle_debug_operations - Dispatched on 2 different keys (#, !)
3. handle_config_operations - Had unnecessary if(key == ':') check
After: All functions now follow true single-responsibility principle:
New Focused Handler Functions Created
System Operations (replaced handle_system_operations):
- handle_wire_connectivity - Just handles & (trim wires)
- handle_fullscreen_toggle - Just handles \ (fullscreen)
- handle_layer_increase - Just handles > (increase layer)
- handle_layer_decrease - Just handles < (decrease layer)
- handle_help_display - Just handles ? (show help)
- handle_keybindings_display - Just handles XK_slash (show keybindings)
Debug Operations (replaced handle_debug_operations):
- handle_name_checking - Just handles # (check unique names)
- handle_wire_breaking - Just handles ! (break wires at pins)
Config Operations (replaced handle_config_operations):
- handle_netlist_toggle - Just handles : (toggle flat netlist)
Architecture Benefits
✅ True Single Responsibility: Each function does exactly one thing✅ No Internal Dispatch: No if/else chains on key values✅
Clean Dispatch Table: Each key maps to exactly the right function✅ Better Testability: Can test each operation in isolation✅
Better Maintainability: Clear separation of concerns✅ Extensible: Easy to add new operations without touching existing code
The dispatch table approach now works perfectly - every key combination maps directly to a focused handler function that knows
exactly what to do, with no secondary dispatch needed!
No comments:
Post a Comment