Swift编程:模块化更好

通过模块化代码库满足单一责任原则。

我们通常会在很短的时间内开发一个应用程序,但是非常复杂。 为了达到交付目标,最好使用一些pod依赖项。 SJProgressHUD曾经是模块化的依赖项,用于显示Cocoapods上可用的弹出窗口或加载过程。 替代者是SVProgressHUD,MBProgressHUD,JQProgressHUD。

例如,让我们选择SJProgressHUD。 我们可以在每个地方附加SJProgressHUD.show() ,例如UIViewController类,AppDelegate类,Presenter或Controller(如果使用的是MVP / MVC),也可以附加在Model类中。 一切正常,但我们违反了软件开发原则:请勿重复。 如果我们将其放在模型上,则另一个问题是违反单一责任。 该模型不负责显示进度视图。 如果我们未能在模型类和视图类之间定义边界,那么由于零件之间的紧密耦合,下一个问题将会严重。

您的意大利面条代码必须重构。

有许多解决方案可以对其进行重构。 首先,我们从UIViewController创建一个扩展类。 在扩展文件中,添加一些将用于处理加载视图的函数,例如showLoading()showError()showSuccess()

 导入SJProgressHUD 
 类UIViewControllerExtension { 

扩展UIViewController {
func showWaiting(消息:字符串){
SJProgressHUD.showWaiting(消息)
}
func showError(消息:字符串){
SJProgressHUD.showError(消息)
}
}
}

创建扩展后,只要在UIViewController上,我们都可以从任何地方调用showWating(“getting doctors, please wait...”) 。 让我们看一下问题,实际上并不是UIViewController的所有派生类都需要知道这一点。 例如,我们的AboutVC仅显示应用程序版本。

  //无需导入SJProgressHUD 
类AboutVC:UIViewController {
func viewDidLoad(){
  } 
func viewWillAppear(){
//这里很神奇... wa可以在每个UIViewController的任何位置调用它。
//但是幸运的是AboutVC不需要了解它。
showWaiting(“请稍候...”)
}
}

模块化代码库。

第二种解决方案是制作一个负责控制SJProgressViewHUD的新组件,比如说UILoadingView。 从UIViewController插入和删除应该很容易。 保持其符合单一职责原则,因此,如果我们需要以某种方式将SJProgressViewHUD替换为SVProgressViewHUD,只需在UILoadingView部分进行更改。

 协议UILoadingView { 
func showLoading()
func showLoadingWithLabel(title:String ?, subtitle:String)
func showErrorWithLabel(消息:字符串)
func showSuccessWithLabel(message:String)
func hideLoading()
}

通过使用where Self: UIViewController使UILoadingView仅可附加到where Self: UIViewController 。 在这一部分中,我们还将进行默认实现。 下次我们仅在需要使用SJProgressViewHUD进行更改时才重构它。

 导入SJProgressViewHUD 
扩展UILoadingView,其中Self:UIViewController {

func hideLoading(){
HUD.hide()
}
func showLoading(){
HUD.show(.progress)
}
func showLoadingWithLabel(title:String?=“正在等待”,字幕:String){
HUD.show(.labeledProgress(title:标题,subtitle:字幕))
}
func showErrorWithLabel(消息:字符串){
HUD.flash(.labeledError(title:“ Failure”,subtitle:message),延迟:1.5)
}
func showSuccessWithLabel(message:String){
HUD.flash(.labeledError(标题:“成功”,字幕:消息),延迟:1.5)
}
}

通过将UILoadingView附加到UIViewController中,现在我们可以从此类调用showLoading(“ please wait…”)。 否则,如果UIViewController不需要显示进度视图,则无需附加UILoadingView。

 类LoginVC:UIViewController,UILoadingView { 

func anyProcessNeedToShowLoadingView(){
showLoadingWithLabel(字幕:“请稍候...”)
}
}

而已。 最后但并非最不重要的一点是,在您的代码真正复杂之前,最好考虑一下模块化代码库。

感谢您阅读🙂