如何设计Manager/Container类以管控层级化硬件系统?
Hey there! Let's work through a clean, maintainable class structure that fits your hardware architecture perfectly. Based on the hierarchy you outlined (System → 2x Device → 2x SubDevice → 4x Configurable Entities), here's a practical, scalable approach:
1. Start with the Lowest-Level Component: Configurable Entity
Even though these 4 entities are controlled via the same hardware command, wrapping them in a lightweight class will make configuration management cleaner. We don't need a separate manager for them—their parent SubDevice will handle group control.
# Example in Python (easily adaptable to other OOP languages) class ConfigurableEntity: def __init__(self, entity_id: int): self.entity_id = entity_id self.config_params = {} # Store entity-specific configs def update_config(self, params: dict): self.config_params.update(params)
2. SubDevice Container/Manager
Each SubDevice owns 4 ConfigurableEntities and implements sub-device level functionality. It also handles the unified hardware command to configure all its entities.
class SubDevice: def __init__(self, sub_device_id: int): self.sub_device_id = sub_device_id self.entities = [ConfigurableEntity(i) for i in range(4)] # 4 entities per sub-device self.sub_device_state = "idle" # Track sub-device level state # Sub-device specific functionality def run_sub_device_task(self): self.sub_device_state = "running" # Add logic for sub-device level operations here # Unified command to configure all 4 entities def configure_all_entities(self, global_params: dict): # Apply global params to all entities (or mix with entity-specific if needed) for entity in self.entities: entity.update_config(global_params) # Send the single hardware command here to apply the configs def get_entity_config(self, entity_id: int) -> dict: if 0 <= entity_id < 4: return self.entities[entity_id].config_params raise ValueError("Invalid entity ID")
3. Device Container/Manager
Each Device contains 2 SubDevices, handles device-level coordination, and exposes interfaces to manage its sub-devices.
class Device: def __init__(self, device_id: int): self.device_id = device_id self.sub_devices = [SubDevice(i) for i in range(2)] # 2 sub-devices per device self.device_state = "ready" # Device-specific functionality def sync_sub_devices(self): # Logic to sync operations between the two sub-devices self.device_state = "syncing" for sub_device in self.sub_devices: sub_device.run_sub_device_task() self.device_state = "synced" # Delegate config to all sub-devices under this device def configure_all_sub_devices(self, entity_params: dict): for sub_device in self.sub_devices: sub_device.configure_all_entities(entity_params) def get_sub_device_status(self, sub_device_id: int) -> str: if 0 <= sub_device_id < 2: return self.sub_devices[sub_device_id].sub_device_state raise ValueError("Invalid sub-device ID")
4. System Container/Manager
The top-level System class owns 2 Devices, implements system-level features, and acts as the single entry point for most external interactions.
class SystemManager: def __init__(self): self.devices = [Device(i) for i in range(2)] # 2 devices in the system self.system_state = "online" # System-level functionality def perform_system_wide_check(self): self.system_state = "checking" for device in self.devices: for sub_device in device.sub_devices: # Run health checks on each sub-device pass self.system_state = "healthy" # Global config: apply to all entities across the system def global_config_update(self, params: dict): for device in self.devices: device.configure_all_sub_devices(params) # Granular access: get config for a specific entity anywhere in the system def get_entity_config(self, device_id: int, sub_device_id: int, entity_id: int) -> dict: if 0 <= device_id < 2: device = self.devices[device_id] if 0 <= sub_device_id < 2: return device.sub_devices[sub_device_id].get_entity_config(entity_id) raise ValueError("Invalid sub-device ID") raise ValueError("Invalid device ID")
Key Design Principles Followed
- Single Responsibility: Each class handles only its own level of functionality (System manages devices, Device manages sub-devices, etc.).
- Encapsulation: Low-level details (like the unified hardware command for entities) are hidden within the SubDevice class—external code doesn't need to know how entities are controlled.
- Scalability: If you later need to add more devices/sub-devices, you can adjust the initialization counts without rewriting core logic.
- Clear Hierarchy: The structure mirrors your hardware architecture, making it easy to map software operations to physical components.
Optional Enhancements
- Add state validation (e.g., prevent configuring a running sub-device).
- Implement event callbacks (e.g., notify when a device completes a sync).
- Add error handling for hardware communication failures (wrap command calls in try/except blocks).
内容的提问来源于stack exchange,提问作者Rohi

