Clean Swift Class

extension is your friend
ရေးသားသူ : saturngod

ဒီဆောင်းပါး ကို ရေးတဲ့ မူရင်း စာရေးဆရာ ဟာ Robert C. Martins (Uncle Bob) book Clean Code ရဲ့ ပရိတ်သတ်ပါ။ Programming language အသစ်တစ်ခုကို လေ့လာတဲ့ အခါမှာ လေ့လာခဲ့ဖူးတဲ့ နည်းလမ်းတွေနဲ့ ပြန်လည်ပေါင်းစပ်ရပါတယ်။ ဒီ ဆောင်းပါးမှာ Swift class ကို extension ကို အသုံးပြုပြီး class တစ်ခုကို ရိုးရှင်းအောင်တည်ဆောင် ပုံကို ဖော်ပြထားပါတယ်။

Version 1.0

class Person {
  var firstname: String
  var lastname: String

  init(firstname: String, lastname: String) {
    self.firstname = firstname
    self.lastname = lastname
  }
}

ပုံမှန် Model တစ်ခုပါပဲ။ Person ပါတယ်။ နောက်ပြီးတော့ init method ပါတယ်။

Version 2.0

class Person {
  var firstname: String
  var lastname: String

  func fullname() -> String {
    return firstname + " " + lastname
  }

  init(firstname: String, lastname: String) {
    self.firstname = firstname
    self.lastname = lastname
  }
}

အခုမှတော့ နည်းနည်းလေး ရှုပ်သွားပါပြီ။ fullname ဆိုတဲ့ function ကို ထပ်ဖြည့်လိုက်ပါတယ်။ code ကတော့ clean မဟုတ်တော့ပါဘူး။ ဒါပေမယ့် ဖတ်ရင်တော့ နားလည်ပါသေးတယ်။ logic တွေကို မူရင်း class မှာဖြစ်ဖြစ် controller မှာ ဖြစ်ဖြစ် ထည့်သွင်းရင် ပို အဆင်ပြေပါတယ်။ ဒါကြောင့် ကျွန်တော်တို့ extension မှာ logic ကို ထပ်ဖြည့်တာ ပို ပြီး သင့်လျော်ပါတယ်။

Version 3.0

class Person {
  var firstname: String
  var lastname: String

  init(firstname: String, lastname: String) {
    self.firstname = firstname
    self.lastname = lastname
  }
}

extension Person {
  func fullname() -> String {
    return firstname + " " + lastname
  }
}

အခု extension မှာ function ကို ရွှေ့လိုက်ပါပြီ။

Version 4.0

Swift မှာ protocol ကို extension မှာ အသုံးပြုလို့ရပါတယ်။ ဒါကြောင့် extension ကို protocol နဲ့ တွဲသုံးဖို့ AgeClasificationProtocol ထပ်ဖြည့်ကြည့်ပါမယ်။ age နဲ့ agetype ကို return ပြန်ပေးပါမယ်။

protocol AgeClasificationProtocol {
  var age: Int { get }
  func agetype() -> String
}

class Person {
  let firstname: String
  let lastname: String
  var age: Int

  init(firstname: String, lastname: String) {
    self.firstname = firstname
    self.lastname = lastname
    self.age = 10
  }
}

extension Person : AgeClasificationProtocol {

  func fullname() -> String {
    return firstname + " " + lastname
  }

  func agetype() -> String {
    switch age {
      case 0...2:
      return "Baby"
      case 2...12:
      return "Child"
      case 13...19:
      return "Teenager"
      case let x where x > 65:
      return "Elderly"
      default:
      return "Normal"
    }
  }
}

အခု ဆိုရင် model က အတော်လေးကို ရှင်းလင်းတာကို တွေ့နိုင်ပါတယ်။ မူရင်း Person class မှာ လိုအပ်တဲ့ function နဲ့ protperty တွေကိုပဲ ထည့်သွင်းထားပြီး ထပ်ဖြည့်ချင်တာတွေကို extension နဲ့ protocol တွဲသုံးထားပါတယ်။ ရိုးရှင်းပြီးတော့ code ကို ပြန်ဖတ်ရတဲ့ အခါမှာလည်း များကြီး လွယ်ကူသွားပါတယ်။

ref: How to keep your Swift models and classes clean