# InputComponentFactory 重构说明 ## 重构目标 减少 `InputComponentFactory` 的参数输入,提高代码的可维护性和可读性。根据二维码类型创建专门的输入配置结构体,而不是一次性传递所有不相关的参数。 ## 重构成果 ### 1. 创建专门的配置结构体 为每种输入组件类型创建了专门的配置结构体,只包含必要的参数: - `EmailInputConfig` - 邮件输入配置(5个参数) - `WiFiInputConfig` - WiFi输入配置(3个参数) - `ContactInputConfig` - 联系人输入配置(8个参数) - `LocationInputConfig` - 位置输入配置(3个参数) - `CalendarInputConfig` - 日历输入配置(5个参数) - `SocialInputConfig` - 社交输入配置(2个参数) - `PhoneInputConfig` - 电话输入配置(2个参数) - `URLInputConfig` - URL输入配置(1个参数) - `TextInputConfig` - 文本输入配置(1个参数) ### 2. 专门的工厂方法 每种配置都有对应的工厂方法,参数清晰明确: ```swift // 邮件输入组件 static func createEmailInput(with config: EmailInputConfig) -> AnyView // WiFi输入组件 static func createWiFiInput(with config: WiFiInputConfig) -> AnyView // 联系人输入组件 static func createContactInput(with config: ContactInputConfig) -> AnyView ``` ### 3. 简化的主工厂方法 主方法现在只需要基本的参数,内部根据类型创建相应的配置: ```swift // 重构前:需要传递所有参数 static func createInputComponent( for qrCodeType: QRCodeType, content: Binding, emailAddress: Binding, emailSubject: Binding, // ... 30+ 个参数 ) -> AnyView // 重构后:只需要基本参数 static func createInputComponent( for qrCodeType: QRCodeType, content: Binding, isContentFieldFocused: FocusState ) -> AnyView ``` ## 使用方法 ### 方法1:使用专门的工厂方法(推荐) ```swift // 创建邮件输入组件 let emailConfig = EmailInputConfig( emailAddress: $emailAddress, emailSubject: $emailSubject, emailBody: $emailBody, emailCc: $emailCc, emailBcc: $emailBcc ) let emailComponent = InputComponentFactory.createEmailInput(with: emailConfig) // 创建WiFi输入组件 let wifiConfig = WiFiInputConfig( ssid: $ssid, password: $password, encryptionType: $encryptionType ) let wifiComponent = InputComponentFactory.createWiFiInput(with: wifiConfig) ``` ### 方法2:使用主工厂方法(自动配置) ```swift // 自动创建邮件输入组件,使用默认配置 let component = InputComponentFactory.createInputComponent( for: .mail, content: $content, isContentFieldFocused: $isContentFieldFocused ) ``` ### 方法3:混合使用(灵活配置) ```swift // 先创建自定义配置 let customEmailConfig = EmailInputConfig( emailAddress: $customEmailAddress, emailSubject: $customEmailSubject, emailBody: $customEmailBody, emailCc: $customEmailCc, emailBcc: $customEmailBcc ) // 然后创建组件 let customEmailComponent = InputComponentFactory.createEmailInput(with: customEmailConfig) ``` ## 重构优势 1. **参数管理清晰**:每种类型只包含必要的参数,不会混淆 2. **类型安全**:配置结构体确保参数类型正确 3. **可维护性**:修改特定组件类型时,只需要修改对应的配置结构体 4. **可扩展性**:添加新的组件类型时,只需添加新的配置结构体 5. **代码复用**:配置结构体可以在其他地方复用 6. **默认值支持**:主工厂方法提供合理的默认配置 ## 配置结构体设计原则 ### 1. 单一职责 每个配置结构体只负责一种输入类型的参数管理 ### 2. 必要参数 只包含该输入类型真正需要的参数,避免冗余 ### 3. 类型一致 所有参数都使用 `Binding` 类型,保持一致性 ### 4. 可扩展性 结构体设计支持未来添加新的参数 ## 实际应用场景 ### 场景1:创建邮件二维码 ```swift @State private var emailAddress = "" @State private var emailSubject = "" @State private var emailBody = "" let emailConfig = EmailInputConfig( emailAddress: $emailAddress, emailSubject: $emailSubject, emailBody: $emailBody, emailCc: .constant(""), emailBcc: .constant("") ) let emailComponent = InputComponentFactory.createEmailInput(with: emailConfig) ``` ### 场景2:创建WiFi二维码 ```swift @State private var ssid = "" @State private var password = "" @State private var encryptionType = WiFiInputView.WiFiEncryptionType.wpa let wifiConfig = WiFiInputConfig( ssid: $ssid, password: $password, encryptionType: $encryptionType ) let wifiComponent = InputComponentFactory.createWiFiInput(with: wifiConfig) ``` ### 场景3:动态创建组件 ```swift @State private var selectedQRType: QRCodeType = .text @State private var content = "" var body: some View { InputComponentFactory.createInputComponent( for: selectedQRType, content: $content, isContentFieldFocused: $isContentFieldFocused ) } ``` ## 注意事项 - 所有 `FocusState` 参数在工厂方法中使用默认值 - 如果需要自定义 `FocusState`,建议直接创建对应的视图组件 - 配置结构体使用 `let` 声明,确保不可变性 - 工厂方法返回 `AnyView` 类型,确保类型擦除 ## 未来改进方向 1. **泛型支持**:考虑使用泛型来进一步减少代码重复 2. **配置验证**:添加配置参数的验证逻辑 3. **样式定制**:支持自定义样式和主题配置 4. **国际化**:配置结构体支持多语言参数 5. **持久化**:支持配置的保存和恢复 ## 总结 通过这次重构,我们成功地将一个参数复杂的工厂方法转换为多个职责清晰、参数明确的配置结构体。新的设计具有以下优势: 1. **参数清晰**:每种类型只包含必要的参数 2. **类型安全**:配置结构体确保参数类型正确 3. **易于使用**:调用者只需要关注相关的参数 4. **易于维护**:修改特定类型时影响范围有限 5. **易于扩展**:添加新类型变得简单 这种设计模式为项目的长期维护和功能扩展奠定了坚实的基础。