HomeOur Team
Imperative và Declarative trong Swift
Articles
Imperative và Declarative trong Swift
huy.nguyen
huy.nguyen
September 28, 2020
2 min

Khái niệm

  • Imperative programming : Nói một cách dễ hiểu nó thể hiện cách bạn đạt được điều mình muốn (how to get what you want).
  • Declarative programming: Thể hiện cái bạn muốn (what you want)

Chắc chắn là vẫn rất khó hiểu với các bạn chưa trải nhiệm qua style Declarative. Sau đây mình xin lấy 1 ví dụ để bác bạn dễ hiểu hơn:

Hãy tưởng tượng bạn bạn và bồ của mình đi đến một nhà hàng (các bạn biết sao mình dùng từ tưởng tượng rồi đấy. Em xl a Hưng). Và đây là cách bạn lấy bàn với 2 style:

  • Imperative: Mình và bồ bước vào cửa (vẫn là tưởng tượng), Mình thấy bàn ở góc còn trống, mình và bồ rẽ phải, đi thẳng đến bàn và ngồi xuống
  • Declarative: “Cho Mình 1 bàn cho 2 người nhé”

Chắc đến đây các bạn cũng đã dễ hình dung hơn rồi. Nên mình sẽ đi tiếp vào phần ví dụ trực tiếp trên Swift (tại mình chỉ biết mỗi Swift)

Swift Example

Trong Swift các bạn có thể code cả 2 style ImperativeDeclarative, Mình chắc rằng kể cả các bạn không biết Declarative là gì thì cũng đang code theo kiểu đó rất nhiền lần.

Chắc không nói nhiều nữa, mình sẽ đi thẳng vào ví dụ. Bài toán đặt ra, cho 1 mảng Integers tìm cách để x2 các phần tử trong mảng.

Đầu vào

let integers = [1, 2, 3, 4]

Giải kiểu Imperative:

var output = [Int]()

for i in integers {
    output.appen(i*2)
}

Dùng vòng for để duyệt từng phần tử. x2 từng phần tử rồi add vào mảng output

Giải kiểu Declarative (Swift’s higher-order functions):

let output = integers.map{ $0 * 2 }

Đơn giản mà nói thì, map function tạo ra 1 mảng mới, các phần tử có giá trị bằng kết quả của closure ($0 * 2). Các bạn có thể thấy, chúng ta không cần quan tâm map function vận hành, duyệt mảng hay quản lý trạng thái như nào

SwiftUI vs UIKit Example

Sau đây sẽ là 1 ví dụ nữa, để mọi người có cái nhìn cụ thể hơn. Mình sẽ implement List(TableView) bằng SwiftUI(Declarative) và UIKit(Imperative).

SwiftUI

struct ContentView: View {
  var persons: [Person] = [
    Person(name: "abed"),
    Person(name: "you")
  ]
  var body: some View {
    List(persons) { person in
      Text(person.name)
      .font(.subheadline)
      .foregroundColor(.gray)
    }
  }
}

UIKit

class ContentViewController: UIViewController, UITableViewDataSource {
  private var tableView: UITableView!
  var persons: [Person] = [
    Person(name: "abed"),
    Person(name: "you")
  ]
  override func viewDidLoad() {
    super.viewDidLoad()
    setupTableView()
  }
  private func setupTableView() {
    tableView = UITableView()
    tableView.dataSource = self
    tableView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(tableView)
  
    let topAndBottomMargens = CGFloat(16)
    NSLayoutConstraint.activate([
      tableView.topAnchor.constraint(equalTo: view.bottomAnchor, constant: topAndBottomMargens),
      tableView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor)
    ])
  }
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return persons.count
  }
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let personCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PersonTableViewCell
    personCell.textLabel?.textColor = .gray
    personCell.textLabel?.text = persons[indexPath.row].name
    return personCell
  }
}

Trong ví dụ này, các bạn có thể thấy, phần code của UIKit dài hơn và chắc chắn mất nhiều thời gian để hiểu hơn phần code của SwiftUI. Sự ra đời của SwiftUI (1 framework tuyệt vời) cũng cho sự chuyển hướng của Apple về phía Declarative. Các bạn cũng có thể tự đánh giá bằng các ví dụ mình đưa.

Note: Sorry nếu trình độ dịch thuật của mình quá tệ. Phần lớn tài liệu mình đọc đều từ tiếng anh. Khả năng diễn đạt của mình cũng khá tệ.


Tags

#imperative#declarative#swift#092020
huy.nguyen

huy.nguyen

Senior iOS Developer

Expertise

ios

Related Posts

Bảo mật ứng dụng di động?
Bảo mật ứng dụng di động?
September 22, 2020
7 min
© 2021, All Rights Reserved.

Quick Links

HomeOur Team

Social Media