Lập trình hướng đối tượng trong Swift (Phần 1)

13 tháng 09, 2017 - 4905 lượt xem

Lập trình hướng đối tượng(Object-Oriented Programing - OOP)  là một mô hình lập trình căn bản mà bất kỳ lập trình viên nào cũng cần phải thành thạo nếu như họ muốn nghiên cứu Swift một cách nghiêm túc, đó là vì OOP là cốt lõi của hầu hết các framework mà bạn sẽ làm việc cùng khi lập trình Swift.  Việc mô hình hóa các vấn đề thành các "objects - đối tượng" và gửi các messages tới các object khác là một phương pháp đã được chứng minh từ những năm 1950 cho việc đơn giản hóa các hệ thống phức tạp.

Các đối tượng được sửu dụng để mô hình hóa - model mọi thứ từ tọa độ trên bản đồ, những cú chạm trên màn hình hay thậm chí là sự dao động của lãi suát ngân hàng. Chúng ta mô hình hóa mọi thứ trong cuộc sống của chúng ta thành những object trong OOP. Đó chính là điều cốt lõi đầu tiên của OOP. Và đó cũng là một trong những câu hỏi tuyển dụng căn bản nhất, nếu bạn không trả lời được câu hỏi này, thì điều đó tương đương với việc bạn có 90% khả năng bị fail trong buổi phỏng vấn đó.

Trong bài viết này, chúng ta sẽ cùng dùng OOP để tạo ra các nhạc cụ. Đồng thời bạn cũng sẽ tìm hiểu về 7 tính chất cốt lõi của OOP, vâng, và đây cũng là một trong những câu hỏi phỏng vấn kinh điển, bao gồm:

  • Tính đóng gói - Encapsulation
  • Tính kế thừa - Inheritance
  • Ghi đè và Nạp chồng - Overriding vs Overloading
  • Kiểu và Thể hiện - Types và Instances
  • Mối quan hệ phụ thuộc giữa 2 đối tượng - Composition
  • Tính đa hình - Polymorphism
  • Quyền truy vấn - Access Control

Đầu tiên hãy mở Xcode lên và tạo một file Playground mới lấy tên là Instrument.

Việc thiết kế thường bắt đàu với một concept chung và rồi từ đó chúng ta tư duy rẽ nhánh ra các tính năng khác đặc thù hơn. Ở đay chúng ta muốn tạo ra các nhạc cụ, vì vậy hãy bắt đầu danh sách các "kiểu" nhạc cụ, ví dụ như chúng ta có piano và guitar, sau đó guitar lại có các kiểu guitar khác như guitar điện tử, guitar acoutics, vân vân.. tôi khuyên các bạn hãy kiếm một tờ giấy nháp và phác thảo sơ đồ dạng Family Tree như ở hình dưới đây.

Object Oriented Programming Relationship Diagram

Mỗi quan hệ giữa các lớp con và lớp cha ở trên chúng là kiểu quan hệ "is - a relationship". Ví dụ như "Guitar is- a Instrument" hay "Guitar một loại nhạc cụ". Như vậy là bạn đã có một cái nhìn trực quan hơn về các đối tượng mà mình sẽ làm việc sắp tới.

Bản chất của một sự vật trong cuộc sống thì luôn có thuộc tính và hành vi. Ví dụ chó thì có thuộc tính là bốn chân và có hành vi là sủa, hay xe hơi thì có thuộc tính là mui trần hay mui đóng, hành vi là tiến hoặc lùi..vân vân

Thuộc tính - Properties

Chúng ta thêm đoạn code dưới đây vào phía trên cùng của playground: 

// 1
class Instrument {
  // 2
  let brand: String
  // 3
  init(brand: String) {
    //4 
    self.brand = brand
  }
}

 Hãy cùng nhau phân tích từng dòng code một nhé:

  1. Đầu tiên chúng ta tạo một Instrument base class với từ khóa class. Đây là lớp class gốc của sơ đồ nhạc cụ chúng ta vừa mới phác họa ở trên. Nó định nghĩa một khái niệm chuẩn cho bất kỳ loại nhạc cụ nào. Hay nói một cách đơn giản, class này mô phỏng lại khái niệm Nhạc cụ ở bên ngoài cuộc sống thật của chúng ta.
  2. Sau đó chúng ta khởi tạo các stored properties - thuộc tính mà tất cả các nhạc cụ cần phải có, ví dụ như của hãng nào chẳng hạn. Và chúng ta khởi tạo thuộc tính brand với kiểu String.
  3. Để đi tới bước tiếp theo là tạo một nhạc cụ cụ thể, chúng ta cần phải viết một hàm khởi tạo initializer cho class này với từ khóa init .
  4. Cuối cùng là chúng ta set các tham số cho thuộc tính brand trong hàm khởi tạo, dùng từ khóa self để phân biệt tham số và thuộc tính.

Đến đây thì chúng ta đã thiết lập được một class nhạc cụ với thuộc tính là brand, tuy nhiên class này chưa có một hành vi nào cả, vì vậy chúng ta cần phải thêm một vài hành vi cho nó dưới dạng các method.

Hành vi - Methods

Bạn có thể điểu chỉnh và chơi nhạc cụ bất kể nó là loại nào. Do vậy đây sẽ là hành vi đầu tiên chúng ta cần thêm vào trong Instrument class ngay sau hàm khởi tạo:

​func tune() -> String { fatalError("Implement this method for \(brand)") }

Method tune() là một method ví dụ, nó sẽ crashes mỗi khi bạn gọi tới nó. Những class mà có kiểu method như thế này thì được gọi là abstract class hay lớp trừu tượng, bởi vì chúng sinh ra không phải để sử dụng trực tiếp mà thay vào đó chúng ta phải tạo ra các lớp con hay subclass và ghi đè - overrides . Chúng ta sẽ nói về hai khái niệm này ở phần tiếp theo.

Các functions được định nghĩa ở trong class được gọi là method, bởi vì chúng truy cập tới các thuộc tính, ví dụ như brand trong ví dụ của chúng ta. Hành vi sử dụng các thuộc tính có sẵn, giống như việc máy tính sử dụng "thuộc tính" CPU để thực hiện "hành vi" tính toán. Việc tổ chức các property cho phù hợp với các method của class được gọi là: encapsulation - tính đóng gói

class Music {
  let notes: [String]

  init(notes: [String]) {
    self.notes = notes
  }

  func prepared() -> String {
    return notes.joined(separator: " ")
  }
}

Class Music ở đây đóng gói mảng chứa các nốt nhạc và cho phép bạn ghép chúng vào thành một chuỗi với method  prepared(). Sau đó chúng ta thêm vào trong class Instrument method như sau:

​func play(_ music: Music) -> String { return music.prepared() }

Method play(_:) trả về một chuỗi String các nốt nhạc đã được chơi, ở đây chắc bạn đang phân vân không hiểu tại sao lại phải tạo ra một kiểu Music riêng biệt như ở trên, thay vì chỉ cần truyền một chuỗi các nốt nhạc là xong, câu trả lời là phương pháp này tạo ra rất nhiều sự thuận tiện sau này như kiểm tra cấu trúc dữ liệu, đồng thời dễ dàng hơn cho việc mở rộng và maintain.

Tiếp, chúng ta thêm các method sau vào trong class Instrument:


func perform(_ music: Music) {
  print(tune())
  print(play(music))
}

Method perform(_:) đầu tiên sẽ chỉnh nhạc cụ và chạy đoạn nhạc theo loại music mà chúng ta muốn truyền vào. Đến đây thì việc khởi tạo các thuộc tính và hành vi của class Instrument đã hoàn tất, ở phần tiếp theo, chúng ta sẽ tìm hiểu về Tính kế thừa - Inheritance.

Hết phần 1.

Nguồn bài viết: https://www.raywenderlich.com/160728/object-oriented-programming-swift

 

 

Bình luận

avatar
Tên 2021-05-11 04:28:44.285413 +0000 UTC
đề nghị bạn sửa "7 tính chất" thành "7 khái niệm. "7 định nghĩa" cho bạn mình đỡ nhầm.
Avatar
* Vui lòng trước khi bình luận.
Ảnh đại diện
  +1 Thích
+1