【问题标题】:Refactor a switch statement with cyclomatic complexity upper than 10重构圈复杂度大于 10 的 switch 语句
【发布时间】:2016-09-07 21:33:49
【问题描述】:

我有这个代码:

for notif in EnvironmentManager.notif {
    if let type = notif.type {
            switch type {
            case .SitterAvailable:
                self.manageNotif(notif, title: "Une sitter disponible", storyboardName: "searchGuard", vcName: "searchGuardNCSID")
            case .OccasionalAdjustmentReminder:
                self.manageNotif(notif, title: "Rappel", storyboardName: "searchGuard", vcName: "searchGuardNCSID")
            case .GuardRequest:
                self.manageNotif(notif, title: "Nouvelle garde urgente", storyboardName: "EmergencyGuardSitter", vcName: "EmergencyGuardSitterNavigationControllerSID")
            case .NewReservationRequest:
                self.manageNotif(notif, title: "Nouvelle garde", storyboardName: "GuardWebSitter", vcName: "WebGuardSitterNavigationControllerSID")
            case .NewMessage:
                self.manageNotif(notif, title: "Nouveau message", storyboardName: "MessageListSitter", vcName: "messageSitterViewNavigationControllerSID")
            case .SoonReservationStartReminder:
                self.manageNotif(notif, title: "Rappel", storyboardName: "GuardListSitter", vcName: "guardListSitterNavigationControllerSID")
            case .ReservationAccepted:
                self.manageNotif(notif, title: "Garde acceptée", storyboardName: "GuardListSitter", vcName: "guardListSitterNavigationControllerSID")
            case .ReservationRefused:
                self.manageNotif(notif, title: "Garde refusée", storyboardName: "GuardListSitter", vcName: "guardListSitterNavigationControllerSID")
            case .NewMessageParent:
                self.manageNotif(notif, title: "Nouveau Message", storyboardName: "MessageParent", vcName: "messageParentViewNavigationControllerSID")
            }
        }
    }

我想知道如何针对反圈复杂度进行优化, 所以没有字符串数组或类似的东西,

当前复杂度等于 11

感谢帮助

【问题讨论】:

  • SOLID 和设计模式将成为您的朋友。

标签: ios swift cycle cyclomatic-complexity


【解决方案1】:

包含 title、storyboardName 和 vcName 的简单结构数组可以很好地解决这个问题。

如果类型是从 0..10 开始排序的,那么您可以只使用数组中的索引。如果 type 不是从 0..10 开始,您可以将其包含在结构中,并首先找到您需要的索引。

这样定义你的结构

struct NotificationTypeData
{
    var notificationType    : Int    = 0
    var title               : String = ""
    var storyboardName      : String = ""
    var vcName              : String = ""
}

然后设置一个变量来保存它

var notificationTypeData : [NotificationTypeData]?

您将需要填充它 - 从文件或硬编码。这是前几个...

notificationTypeData!.append(NotificationTypeData(notificationType: 0, title: "Une sitter disponible", storyboardName: "searchGuard", vcName: "searchGuardNCSID"))
notificationTypeData!.append(NotificationTypeData(notificationType: 1, title: "Rappel", storyboardName: "EmergencyGuardSitter", vcName: "EmergencyGuardSitterNavigationControllerSID"))
notificationTypeData!.append(NotificationTypeData(notificationType: 2, title: "Nouvelle garde urgente", storyboardName: "GuardWebSitter", vcName: "WebGuardSitterNavigationControllerSID"))
notificationTypeData!.append(NotificationTypeData(notificationType: 3, title: "Nouvelle garde", storyboardName: "MessageListSitter", vcName: "messageSitterViewNavigationControllerSID"))
notificationTypeData!.append(NotificationTypeData(notificationType: 4, title: "Nouveau message", storyboardName: "GuardListSitter", vcName: "guardListSitterNavigationControllerSID"))

然后简化你已有的开关代码

for notif in EnvironmentManager.notif
{
    if let type = notif.type
    {
         switch type
         {
             let data = notificationTypeData!.filter{ $0.notificationType == type }.first
             if data != nil
             {
                 self.manageNotif(notif, title: data?.title, storyboardName: data?.storyboardName, vcName: data?.storyboardName
             }
         }
     }

【讨论】:

  • 是的,我想这个,但它没有优化,不是吗?
  • 酷,我没有像你那样实现,但感谢过去的时间^^
  • 总会有选择的 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多