Как исправить глубокое вложенное if-else - PullRequest
0 голосов
/ 06 сентября 2018

Мне трудно придумать, как уменьшить мое if else вложение. Это выглядит очень неправильно для меня, и должен быть лучший способ сделать это. Пожалуйста, покажите мне, как.

if pigTypeTextField.text == PIG_TYPES_ENUM.gilt.rawValue ||
    pigTypeTextField.text == PIG_TYPES_ENUM.offDutySow.rawValue ||
    pigTypeTextField.text == PIG_TYPES_ENUM.matingSow.rawValue ||
    pigTypeTextField.text == PIG_TYPES_ENUM.drySow.rawValue ||
    pigTypeTextField.text == PIG_TYPES_ENUM.farrow.rawValue {
    if parityTextField.text != "" {
        pigData["parity"] = parityTextField.text!
    } else if pigTypeTextField.text == PIG_TYPES_ENUM.gilt.rawValue {
        if arrivalDateTextField.text != "" {
            pigData["arrivalDate"] = Helper.stringDateToTimestamp(date: arrivalDateTextField.text!)
            pigData["herdEntryDate"] = (herdEntryDateTextField.text != "") ? Helper.stringDateToTimestamp(date: herdEntryDateTextField.text!) : ""
        }
    } else if pigTypeTextField.text == PIG_TYPES_ENUM.offDutySow.rawValue {
        if arrivalDateTextField.text != "" &&
            herdEntryDateTextField.text != "" &&
            startOffDutySowDateTextField.text != "" {
            pigData["arrivalDate"] = Helper.stringDateToTimestamp(date: arrivalDateTextField.text!)
            pigData["herdEntryDate"] = Helper.stringDateToTimestamp(date: herdEntryDateTextField.text!)
            pigData["startOffDutySowDate"] = Helper.stringDateToTimestamp(date: startOffDutySowDateTextField.text!)
        }
    } else if pigTypeTextField.text == PIG_TYPES_ENUM.matingSow.rawValue {
        if arrivalDateTextField.text != "" &&
            herdEntryDateTextField.text != "" &&
            startOffDutySowDateTextField.text != "" &&
            semenFromBoarIDTextField.text != "" &&
            technicianNameTextField.text != "" &&
            matingDateTextField.text != "" {
            pigData["arrivalDate"] = Helper.stringDateToTimestamp(date: arrivalDateTextField.text!)
            pigData["herdEntryDate"] = Helper.stringDateToTimestamp(date: herdEntryDateTextField.text!)
            pigData["startOffDutySowDate"] = Helper.stringDateToTimestamp(date: startOffDutySowDateTextField.text!)
            pigData["semenFromBoarID"] = semenFromBoarIDTextField.text!
            pigData["technicianName"] = technicianNameTextField.text!
            pigData["matingDate"] = matingDateTextField.text!
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Передайте файл pigTypeTextField.text в параметр типа

Swift4:

func processPigType(type: String) {
  guard type == PIG_TYPES_ENUM.gilt.rawValue ||
     type == PIG_TYPES_ENUM.offDutySow.rawValue ||
     type == PIG_TYPES_ENUM.matingSow.rawValue ||
     type == PIG_TYPES_ENUM.drySow.rawValue ||
     type == PIG_TYPES_ENUM.farrow.rawValue
  else {return}

  if parityTextField.text != "" {
      pigData["parity"] = parityTextField.text!
     }

  switch type {
      case PIG_TYPES_ENUM.gilt.rawValue:
       if arrivalDateTextField.text != "" {
           self.configurePigData(pigType: .gilt)
        }

      case PIG_TYPES_ENUM.offDutySow.rawValue:
       if arrivalDateTextField.text != "" &&
         herdEntryDateTextField.text != "" &&
         startOffDutySowDateTextField.text != "" {
            self.configurePigData(pigType: .offDutySow)
        }
      case PIG_TYPES_ENUM.matingSow.rawValue:
       if arrivalDateTextField.text != "" &&
          herdEntryDateTextField.text != "" &&
          startOffDutySowDateTextField.text != "" &&
          semenFromBoarIDTextField.text != "" &&
          technicianNameTextField.text != "" &&
          matingDateTextField.text != "" {
            self.configurePigData(pigType: .matingSow)
        }

     default:
        break
    }
}

func configurePigData(pigType: PigType) {
  switch pigType {
   case .gilt:
      pigData["arrivalDate"] = Helper.stringDateToTimestamp(date: arrivalDateTextField.text!)
      pigData["herdEntryDate"] = (herdEntryDateTextField.text != "") ? Helper.stringDateToTimestamp(date: herdEntryDateTextField.text!) : ""

   case .offDutySow:
      pigData["arrivalDate"] = Helper.stringDateToTimestamp(date: arrivalDateTextField.text!)
      pigData["herdEntryDate"] = Helper.stringDateToTimestamp(date: herdEntryDateTextField.text!)
      pigData["startOffDutySowDate"] = Helper.stringDateToTimestamp(date: startOffDutySowDateTextField.text!)

   case .matingSow:
      pigData["arrivalDate"] = Helper.stringDateToTimestamp(date: arrivalDateTextField.text!)
      pigData["herdEntryDate"] = Helper.stringDateToTimestamp(date: herdEntryDateTextField.text!)
      pigData["startOffDutySowDate"] = Helper.stringDateToTimestamp(date: startOffDutySowDateTextField.text!)
      pigData["semenFromBoarID"] = semenFromBoarIDTextField.text!
      pigData["technicianName"] = technicianNameTextField.text!
      pigData["matingDate"] = matingDateTextField.text!

   default:
       break
   }
}
0 голосов
/ 06 сентября 2018

Вот чем я закончил. Предполагается, что Helper.stringDateToTimestamp(date:) вернет пустую строку, если в нее будет передана пустая строка. Я написал расширение Array, чтобы помочь очистить операторы if.

Я сделал вывод кода центрированным. Под этим я подразумеваю, что я просматривал каждый вывод по очереди и выяснял все условия, из-за которых он был записан. Это уменьшает повторяющиеся проблемы со словарем, которые у вас возникли с кодом.

Наконец, в нескольких местах я просто вставляю пустую строку, если данных нет, а затем очищаю ее в конце цикла.

Моя логика может быть не совсем правильной, но идея просто анализировать каждый выход отдельно, а не все входы, часто делает код более очевидным.

extension Array where Element == PIG_TYPES_ENUM {
    func contains(pigText: String?) -> Bool {
        guard let text = pigText else { return false }
        return self.map { $0.rawValue }.contains(text)
    }
}

func example() {
    let allPigs: [PIG_TYPES_ENUM] = [.gilt, .offDutySow, .matingSow, .drySow, .farrow]

    guard allPigs.contains(pigText: pigTypeTextField.text) else { return }
    guard (parityTextField.text ?? "") == "" else {
        pigData["parity"] = parityTextField.text!
        return
    }

    if [.gilt, .offDutySow, .matingSow].contains(pigText: pigTypeTextField.text) {
        pigData["arrivalDate"] = Helper.stringDateToTimestamp(date: arrivalDateTextField.text ?? "")
        pigData["herdEntryDate"] = Helper.stringDateToTimestamp(date: herdEntryDateTextField.text ?? "")
    }

    if [.offDutySow, .matingSow].contains(pigText: pigTypeTextField.text) {
        pigData["startOffDutySowDate"] = Helper.stringDateToTimestamp(date: startOffDutySowDateTextField.text ?? "")
    }

    if [.matingSow].contains(pigText: pigTypeTextField.text) {
        pigData["semenFromBoarID"] = semenFromBoarIDTextField.text ?? ""
        pigData["technicianName"] = technicianNameTextField.text ?? ""
        pigData["matingDate"] = matingDateTextField.text ?? ""
    }

    for (key, value) in pigData {
        if value == "" {
            pigData.removeValue(forKey: key)
        }
    }
}

Я написал обновленный Помощник для работы с вышеупомянутым:

class Helper {
    private static let formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "dd/MM/yyyy"
        return formatter
    }()

    static func stringDateToTimestamp(date: String) -> String {
        guard date.isEmpty == false else { return "" }
        let date = formatter.date(from: date)
        let dateStamp: TimeInterval = date!.timeIntervalSince1970
        let timestamp: String = String(dateStamp)
        return timestamp
    }
}
0 голосов
/ 06 сентября 2018

1) зачем проверять, пусто ли оно после проверки, имеет ли оно одно из этих значений?

if parityTextField.text != "" {

2) Вам даже не нужно проверять, является ли он одним из них, а затем проверять, какой из них ... включить parityTextField.text

case ""
case PIG_TYPES_ENUM.matingSow.rawValue
case PIG_TYPES_ENUM.offDutySow.rawValue
case PIG_TYPES_ENUM.gilt.rawValue

это все дела, о которых вы заботитесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...