[Swift] Hiểu về Struct và Class trong Swift qua Hoán Dụ Xây Nhà

Swift 28 Th07 2024

Bạn đã bao giờ thắc mắc về sự khác biệt giữa Struct và Class trong Swift và cả ở những ngôn ngữ lập trình khác? Hãy cùng khám phá qua một hoán dụ thú vị về xây nhà nhé!

Tưởng tượng bạn đang xây dựng một khu phố mới. Con đường chính trong khu phố này chính là bộ nhớ của máy tính. Trên con đường này, chúng ta sẽ xây các căn nhà, mỗi căn đại diện cho một thực thể (instance) trong lập trình.

code-neighborhood
Code Neighborhood

Các thuật ngữ cơ bản về Struct và Class

1. Kiểu dữ liệu:

  • Struct: Bản vẽ chi tiết cho nhà phố đơn giản. Dễ sao chép, xây dựng nhanh và có thể xây dựng nhiều căn giống nhau.
  • Class: Bản thiết kế kiến trúc cho biệt thự. Phức tạp hơn, cần kiến trúc sư (lập trình viên) thiết kế chi tiết và có thể tùy chỉnh cho mỗi căn.

2. Đối tượng / Thực thể:

Instance: Căn nhà được xây dựng dựa trên bản vẽ (struct) hoặc bản thiết kế (class). Mỗi căn nhà là một phiên bản thực tế.

3. Khởi tạo & Hủy:

  • Initializer (Thợ xây): Đội thợ nhận bản vẽ/thiết kế và tiến hành xây dựng căn nhà.
  • Deinitializer (Đội tháo dỡ): Đội ngũ có nhiệm vụ phá dỡ căn nhà một cách an toàn và có kế hoạch khi không còn sử dụng. Chỉ biệt thự mới cần đội tháo dỡ chuyên dụng.

4. Thuộc tính & Phương thức:

  • Property (Phòng ốc & Nội thất): Đặc điểm của căn nhà như số phòng ngủ, màu sơn, vật liệu,...
  • Method (Chức năng của căn nhà): Những hoạt động có thể thực hiện trong căn nhà như nấu ăn (phương thức nấu ăn), mở cửa (phương thức mở cửa),...

5. Tính chất khác:

  • Inheritance (Kế thừa - Mẫu nhà): Xây dựng biệt thự dựa trên mẫu thiết kế có sẵn của biệt thự khác, có thể thêm bớt một số chi tiết.
  • Protocol (Tiêu chuẩn xây dựng): Bộ quy tắc chung cho việc xây dựng nhà như tiêu chuẩn phòng cháy chữa cháy, tiêu chuẩn điện nước,...
  • Extension (Cải tạo nhà): Nâng cấp, sửa chữa hoặc thêm phòng ốc cho căn nhà sau khi đã xây dựng xong.
  • Mutating (Sửa chữa nhà): Cho phép thay đổi kết cấu, màu sơn,... của căn nhà sau khi đã hoàn thiện.
  • Reference Type (Sở hữu biệt thự): Sở hữu chìa khóa biệt thự, có thể chia sẻ chìa khóa cho người khác và cùng nhau sử dụng.
  • Value Type (Sở hữu bản sao nhà phố): Nhận được một bản sao chép đầy đủ của bản vẽ nhà phố, có thể tự do xây dựng căn nhà của riêng mình.
    Ví dụ:
    • Struct: Muốn xây dựng nhiều quán cafe giống nhau, bạn chỉ cần một bản vẽ "Struct - Quán cafe" chi tiết. Mỗi quán cafe được xây lên là một "Instance".
    • Class: Muốn xây dựng một chuỗi khách sạn, bạn cần bản thiết kế "Class - Khách sạn" và có thể tùy chỉnh kiến trúc, số lượng phòng cho mỗi khách sạn (Instance).

Struct vs Class In Code neighborhood

Sự khác biệt giữa Struct và Class

1. Vị trí xây dựng (Cách lưu trữ trong bộ nhớ)

  • Nhà Struct: Xây trực tiếp trên mảnh đất sát đường lớn (stack memory). Dễ tiếp cận và quản lý.
  • Nhà Class: Xây trong khu đất ở hẻm nhỏ (heap memory). Trên đường lớn chỉ có biển chỉ đường đến căn nhà trong hẻm.

2. Quy trình xây dựng (Khởi tạo)

  • Nhà Struct: Có sẵn bản vẽ cơ bản (memberwise initializer).
  • Nhà Class: Cần bản thiết kế chi tiết do kiến trúc sư tạo ra (phải định nghĩa initializer).

3. Kế thừa

  • Nhà Struct: Không thể xây nhà dựa trên thiết kế của nhà khác.
  • Nhà Class: Có thể xây nhà mới dựa trên thiết kế của nhà cũ, với một số cải tiến.

4. Quản lý tài nguyên (Deinit)

  • Nhà Struct: Tự động phá dỡ khi không còn sử dụng.
  • Nhà Class: Cần kế hoạch phá dỡ cụ thể (sử dụng deinit).

5. Chia sẻ và thay đổi (Tham trị vs Tham chiếu)

  • Nhà Struct: Khi chia sẻ, người khác nhận bản sao chìa khóa và bản vẽ để xây nhà giống hệt.
  • Nhà Class: Khi chia sẻ, người khác nhận chìa khóa thật. Nhiều người có thể cùng vào nhà và thay đổi.

6. Khả năng thay đổi (Mutability)

  • Nhà Struct: Mặc định là "nhà đóng cửa" (immutable). Cần khai báo rõ nếu muốn sửa chữa.
  • Nhà Class: Luôn có thể sửa chữa, trừ khi đăng ký là "nhà di sản" không được thay đổi.

7. Hiệu suất

  • Nhà Struct: Xây dựng và phá dỡ nhanh, phù hợp cho nhiều căn nhà nhỏ, đơn giản.
  • Nhà Class: Xây dựng và phá dỡ phức tạp hơn, phù hợp cho các biệt thự lớn.

8. Định danh (Identity)

  • Nhà Struct: Xác định bởi đặc điểm (địa chỉ, số phòng, màu sắc).
  • Nhà Class: Có số đăng ký duy nhất, dù mọi thứ bên trong giống hệt nhau.

9. Sử dụng trong Protocol

  • Nhà Struct: Áp dụng nhiều tiêu chuẩn xây dựng khác nhau.
  • Nhà Class: Áp dụng nhiều tiêu chuẩn, nhưng chỉ kế thừa từ một mẫu nhà cha.

10. Khả năng mở rộng (Extension)

  • Cả hai đều có thể cải tạo thêm tính năng sau khi xây xong (thêm gara, xây thêm tầng).

Qua ẩn dụ này, bạn có thể thấy Struct giống như những căn nhà đơn giản, độc lập trên đường lớn, trong khi Class giống như những biệt thự phức tạp hơn nằm trong hẻm, có khả năng kế thừa và chia sẻ.

Hy vọng bài viết này giúp bạn hiểu rõ hơn về sự khác biệt giữa Struct và Class trong Swift. Hãy chọn "loại nhà" phù hợp cho "khu phố code" của bạn nhé!

P/s: Bảng thuật ngữ

Phần nội dung trên của bài viết giúp cung cấp một góc nhìn trực quan và tổng quát về Struct và Class trong lập trình Swift. Tuy vậy, bạn cần biết chính xác các thuật ngữ liên quan để tìm hiểu sâu hơn về hai khái niệm này. Dưới đây là bảng thuật ngữ và giải thích ngắn gọn về các thuật ngữ liên quan đến struct và class trong Swift:

Thuật ngữGiải thích
StructKiểu dữ liệu giá trị, được lưu trữ trong stack memory
ClassKiểu dữ liệu tham chiếu, được lưu trữ trong heap memory
InstanceMột đối tượng cụ thể được tạo ra từ struct hoặc class
InitializerPhương thức khởi tạo để tạo ra instance mới
DeinitializerPhương thức được gọi khi một instance của class bị hủy
InheritanceKhả năng một class kế thừa thuộc tính và phương thức từ class khác
Memberwise InitializerInitializer mặc định cho struct, tự động tạo ra bởi Swift
MutatingTừ khóa cho phép thay đổi thuộc tính của struct trong một phương thức
Reference TypeKiểu dữ liệu được truyền bằng tham chiếu (class)
Value TypeKiểu dữ liệu được truyền bằng giá trị (struct, enum)
ProtocolĐịnh nghĩa một bộ phương thức, thuộc tính mà class hoặc struct có thể tuân thủ
ExtensionCơ chế để thêm chức năng mới cho struct, class, hoặc protocol đã tồn tại
OverrideGhi đè phương thức của class cha trong class con
FinalTừ khóa ngăn chặn việc kế thừa hoặc ghi đè
Computed PropertyThuộc tính được tính toán dựa trên các giá trị khác
Stored PropertyThuộc tính lưu trữ giá trị trực tiếp
Lazy PropertyThuộc tính chỉ được khởi tạo khi được truy cập lần đầu
Static Property/MethodThuộc tính/phương thức thuộc về type, không phải instance
Type CastingKiểm tra hoặc chuyển đổi kiểu của một instance
ARC (Automatic Reference Counting)Cơ chế quản lý bộ nhớ tự động trong Swift

Tags

Tony Phạm

Là một người thích vọc vạch và tò mò với tất cả các lĩnh vực từ khoa học tự nhiên, lập trình, thiết kế đến ... triết học. Luôn mong muốn chia sẻ những điều thú vị mà bản thân khám phá được.