Análisis Detallado de Diferentes Arquitecturas Arquitectura VIP

Análisis detallado de diferentes arquitecturas.

Arquitectura MVC tradicional

**La arquitectura MVC tradicional divide el sistema en tres partes: modelo (Model), vista (View) y controlador (Controller). **El modelo representa datos y lógica de procesamiento de datos; la vista representa la interfaz de usuario; el controlador recibe información del usuario y maneja acciones reales. La ventaja de esta arquitectura es que es simple y fácil de entender, fácil de desarrollar y mantener; la desventaja es que cuando la escala de la aplicación se vuelve más grande, habrá problemas con controladores inflados y lógica empresarial mixta, lo que no es propicio para el código. reutilización y mantenimiento.

arquitectura MVVM

**La arquitectura MVVM divide el sistema en tres partes: vista (View), vista modelo (ViewModel) y modelo (Model). ** La vista es responsable de la representación y la entrada del usuario; el modelo de vista maneja la lógica y actualiza la vista; el modelo está relacionado con los datos. A través del mecanismo de vinculación de datos, el modelo de vista puede reflejar directamente los cambios en la vista, logrando así las características de bajo acoplamiento y alta reutilización. La desventaja es que la implementación es complicada, es necesario realizar un enlace de datos bidireccional y la cantidad de código es relativamente grande.

arquitectura víbora

** La arquitectura VIPER divide el sistema en cinco partes: Vista, Presentador, Interactor, Entidad y Enrutador. **El presentador es responsable de analizar la operación del usuario en una operación ejecutable del interactor; el interactor es responsable de ejecutar la lógica comercial específica y devolver el resultado al presentador; la entidad almacena la lógica comercial real y el enrutamiento es responsable de el enrutamiento y la navegación entre módulos. La arquitectura implementa el principio de responsabilidad única (SRP), tiene una alta reutilización de código y es fácil de mantener. La desventaja es que las capas son demasiado detalladas, la cantidad de código es un poco mayor y es difícil comenzar.

Arquitectura Clean Swift (también conocida como VIP)

** Clean Swift divide el sistema en seis partes: View Controller (ViewController), Presenter (Presenter), Business Logic Processor (Interactor), Entity (Entity), Request (Solicitud) y Response (Respuesta). **Clean Swift es, en principio, una variante de VIPER. La arquitectura aboga por el principio de responsabilidad única (SRP), logra el objetivo de la separación de funciones y garantiza la capacidad de prueba y mantenimiento del código. En Clean Swift, el controlador de vista solo es responsable de administrar el ciclo de vida de la interfaz y el procesamiento de los eventos de la interfaz de usuario, mientras que la lógica comercial real y el procesamiento de datos se ubican en componentes como presentadores, procesadores de lógica comercial y entidades. La ventaja de esta arquitectura es que las responsabilidades están claramente distribuidas en capas, el código es conciso y legible, y es fácil de leer y mantener; al mismo tiempo, proporciona una interfaz unificada de solicitud, respuesta y manejo de errores, lo que conduce a mejorar la reutilización y la capacidad de prueba del código. La desventaja es que debe seguir la especificación de programación convencional.

manifestación

La siguiente es una demostración de una aplicación de lista de tareas sencilla escrita con la arquitectura Clean Swift, que incluye funciones como agregar, ver, editar y eliminar elementos de tareas pendientes.

1. Crea un proyecto Xcode

  1. Abra Xcode.
  2. Cree un nuevo proyecto de aplicación para iOS y asígnele el nombre ToDoListDemo.
  3. SwiftSeleccione Idioma e interfaz de usuario en la configuración del proyecto Storyboard.

2. Crear archivos de esquema y clases

  1. En Xcode, cree varios grupos para almacenar varias partes de la arquitectura Clean Swift, como: Models, Networking, Sceneetc.

  2. En Sceneel Grupo, cree un nuevo archivo Swift llamado ToDoListModels.swift. En este archivo, defina todos los tipos, estructuras y modelos necesarios utilizados en la aplicación.

    // 创建 TodoItem 结构体
    struct TodoItem {
          
          
        var id: Int
        var title: String
        var description: String?
        var isCompleted: Bool
        var date: Date?
    }
    
    // 创建 TodoListViewModel 结构体
    struct TodoListViewModel {
          
          
        var items: [TodoItem]
    }
    
  3. En Sceneel Grupo, cree un nuevo archivo Swift llamado ToDoListWorker.swift. Este archivo contendrá código que realiza solicitudes de red y persistencia de datos.

    protocol TodoListWorkerProtocol {
          
          
        func fetchItems(completion: ([TodoItem]) -> Void)
        func saveItem(_ item: TodoItem, completion: @escaping (Bool) -> Void)
        func deleteItem(_ item: TodoItem, completion: @escaping (Bool) -> Void)
    }
    
    class TodoListWorker: TodoListWorkerProtocol {
          
          
    
        func fetchItems(completion: ([TodoItem]) -> Void) {
          
          
            // 在此处执行网络请求或者数据持久化操作
            // 返回获取到的 TodoItem 数据
        }
    
        func saveItem(_ item: TodoItem, completion: @escaping (Bool) -> Void) {
          
          
            // 在此处执行网络请求或者数据持久化操作
            completion(true)
        }
    
        func deleteItem(_ item: TodoItem, completion: @escaping (Bool) -> Void) {
          
          
            // 在此处执行网络请求或者数据持久化操作
            completion(true)
        }
    }
    
  4. En Sceneel Grupo, cree un nuevo archivo Swift llamado ToDoListInteractor.swift. En este archivo, cree la interfaz TodoItempara la operación TodoListInteractory proporcione TodoListInteractoruna implementación predeterminada para .

    protocol TodoListInteractorProtocol {
          
          
        func fetchTodoList()
        func addTodoItem(item: TodoItem)
        // 添加更新和删除操作方法
    }
    
    class TodoListInteractor: TodoListInteractorProtocol {
          
          
        
        var presenter: TodoListPresenterProtocol?
        var worker: TodoListWorkerProtocol?
        
        func fetchTodoList() {
          
          
            worker?.fetchItems(completion: {
          
           [weak self] items in
                self?.presenter?.presentFetchedTodoList(response: items)
            })
        }
    
        func addTodoItem(item: TodoItem) {
          
          
            worker?.saveItem(item, completion: {
          
           [weak self] success in
                if success {
          
          
                    self?.fetchTodoList()
                }
            })
        }
        
        // 添加更新和删除操作方法的默认实现
    }
    
  5. En Sceneel Grupo, cree un nuevo archivo Swift llamado ToDoListPresenter.swift. En este archivo, cree una interfaz que represente lo obtenido y lo TodoItemmanipulado , y proporcione una implementación predeterminada de .TodoListViewModelTodoListPresenterTodoListPresenter

    protocol TodoListPresenterProtocol {
          
          
        func presentFetchedTodoList(response: [TodoItem])
        // 添加更新和删除操作方法
    }
    
    class TodoListPresenter: TodoListPresenterProtocol {
          
          
        
        weak var viewController: TodoListViewControllerProtocol?
    
        func presentFetchedTodoList(response: [TodoItem]) {
          
          
            let viewModel = TodoListViewModel(items: response)
            viewController?.displayFetchedTodoList(viewModel: viewModel)
        }
    
        // 添加更新和删除操作方法的默认实现
    }
    
  6. En Sceneel Grupo, cree un nuevo archivo Swift llamado ToDoListViewController.swift. En este archivo, cree las interfaces que representan la interfaz de usuario TodoListViewControllery la entrada del usuario TodoListViewControllerInput, y proporcione TodoListViewControllerimplementaciones predeterminadas para .

    protocol TodoListViewControllerProtocol: AnyObject {
          
          
        func displayFetchedTodoList(viewModel: TodoListViewModel)
    }
    
    protocol TodoListViewControllerInput {
          
          
        func displayAddTodoItemSuccess()
        // 添加更新和删除操作方法
    }
    
    class TodoListViewController: UIViewController, TodoListViewControllerProtocol {
          
          
        
        var interactor: TodoListInteractorProtocol?
        var router: TodoListRouterProtocol?
    
        // 实现 viewDidLoad() 和其他方法
    
        func displayFetchedTodoList(viewModel: TodoListViewModel) {
          
          
            // 更新用户界面以显示获取到的数据
        }
        
        // 添加更新和删除操作的默认实现
    }
    
  7. En Sceneel Grupo, cree un nuevo archivo Swift llamado ToDoListRouter.swift. En este archivo, cree TodoListRouterla interfaz que representa la lógica de navegación y proporcione TodoListRouteruna implementación predeterminada de .

    protocol TodoListRouterProtocol {
          
          
        func navigateToAddTodoItem()
        // 添加其他导航方法
    }
    
    class TodoListRouter: TodoListRouterProtocol {
          
          
        
        weak var viewController: UIViewController?
        
        // 实现 TodoListRouterProtocol 中的方法
        // 可以使用 NavigationController 或 Modal 方式实现不同的导航
    }
    

3. Genere el controlador de vista y complete la lógica básica

  1. Cree una nueva UIViewControllerclase en Xcode, asígnele un nombre ToDoListTableViewControllery configúrela como la pantalla de inicio en el guión gráfico.

  2. Utilice Interface Builder para crear la TodoItemlista que se muestra y distribuirla y diseñarla en consecuencia.

    NOTA: En esta sección solo se incluye una parte del código. El código completo se puede encontrar en mi repositorio de GitHub: https://github.com/techsleep/clean-swift-todo-app-demo.

  3. En ToDoListTableViewController.swiftel archivo, declare e interactorinicialice presentery router.

    class ToDoListTableViewController: UITableViewController {
          
          
        
        var interactor: TodoListInteractorProtocol?
        var presenter: TodoListPresenterProtocol?
        var router: TodoListRouterProtocol?
        
        override func viewDidLoad() {
          
          
            super.viewDidLoad()
            interactor = TodoListInteractor()
            interactor?.presenter = presenter
            presenter = TodoListPresenter()
            presenter?.viewController = self
            router = TodoListRouter()
            router?.viewController = self
            interactor?.fetchTodoList()
            // 设置 NavigationController 样式和导航按钮等
        }
    }
    
  4. En ToDoListTableViewController.swiftel archivo, siga TodoListViewControllerInputel protocolo y agregue los métodos de acción necesarios para implementarlo.

    extension ToDoListTableViewController: TodoListViewControllerInput {
          
          
    
        func displayAddTodoItemSuccess() {
          
          
            // 在该回调中处理添加待办事项成功后的操作
        }
    
        // 添加更新和删除待办事项操作方法
    }
    
  5. En ToDoListTableViewController.swiftel archivo, implemente métodos que se llaman cuando el usuario ingresa una acción, como agregar una tarea pendiente o navegar a la página de agregar, etc.

    class ToDoListTableViewController: UITableViewController {
          
          
    
        @IBAction func addButtonClicked(_ sender: Any) {
          
          
            router?.navigateToAddTodoItem()
        }
        
        // 添加其他用户输入操作方法
    }
    
  6. En TodoListRouter.swiftel archivo, implemente la lógica específica de la página de navegación.

    class TodoListRouter: TodoListRouterProtocol {
          
          
        
        weak var viewController: UIViewController?
        
        func navigateToAddTodoItem() {
          
          
            let addTodoItemVC = storyboard.instantiateViewController(withIdentifier: "AddTodoItemViewControllerID") as! AddTodoItemViewController
            addTodoItemVC.delegate = viewController as? AddTodoItemViewControllerDelegate
            viewController?.navigationController?.pushViewController(addTodoItemVC, animated: true)
        }
        
        // 添加其他导航
    }
    

4. Completa el resto de la lógica

  1. En AddTodoItemViewController, defina AddTodoItemViewControllerDelegatey TodoItemobjetos, y notifique a través del protocolo que TodoListViewControllerse ha agregado una nueva tarea pendiente.

  2. En AddTodoItemViewController, use TodoListWorkerel objeto para almacenar nuevos elementos pendientes y luego notifique a través del protocolo que TodoListInteractorlos datos se han actualizado.

  3. En TodoListInteractor, use TodoListPresenterel objeto para actualizar la interfaz de usuario para mostrar la nueva tarea pendiente.

¡Después de completar las operaciones anteriores, puede usar la demostración de la aplicación Lista de tareas escrita en el marco Clean Swift para ejecutarse normalmente!

Supongo que te gusta

Origin blog.csdn.net/Ambrosedream/article/details/130904616
Recomendado
Clasificación