Declarative app development – SwiftUI Notes #7
SwiftUI . TutorialsContents
Chào bạn đến với Fx Studio. Bài viết này vẫn là hành trình tìm hiểu thế giới SwiftUI. Tuy nhiên, bài viết này sẽ mang tính chất thuần lý thuyết. Và trình bày một khái niệm khá mới trong thế giới lập trình. Đó là Declarative App.
Trước khi vào bài, bạn có thể đọc qua các bài về cơ bản về SwiftUI và SwiftUI App ở các link sau:
Nếu mọi thứ ổn rồi, thì …
Bắt đầu thôi!
1. Sự trỗi dậy của Declarative Programming
Mình là một dev iOS từ thời khi iOS 3.0 với ngôn ngữ Objective-C. Lúc đó, hướng đối tượng (Object-Oriented Programming) là cả một tượng đài. Mọi thứ, mọi ứng dụng đều sử dụng nó để làm tôn chỉ và định hướng cho sự phát triển ứng dụng hay hệ thống.
Nhưng … sự tiến hoá vẫn đang diễn ra và lập trình cũng không nằm ngoài quy luật đó. Sau khi Apple ra mắt Swift, mình đã bắt đầu dần dần tìm hiểu nhiều hơn về mô hình lập trình nâng cao. Các khái niệm mới dần được hiện ra, trong đó có Functional Programming. Tiếp tục với nó thì mình lại khám phá ra Declarative Programming. Với Declarative Programming, đó là tương lai. Nhưng …
Cuộc đời không đơn giản như vậy!
Đi kèm với Declarative Programming là một thế lực đối nghịch. Đó là Imperative Programming. Điều bất ngờ nữa, Imperative Programming chính là thứ mà mình và phần còn lại của thế giới lập trình viên từ 50 năm trước đã sử dụng.
1.1. Định nghĩa
Hai mô hình trên vốn khá rộng, thậm chí khá là mơ hồ nhưng để định nghĩa thì có thể gói gọn 1 cách tương phản rõ ràng như sau:
- Imperative Programming: nói với “machine” làm thế nào để giải quyết nó và kết quả bạn muốn là gì.
- Declarative Programming: nói với “machine” bạn muốn gì xảy ra và máy tính tính toán làm thế nào để làm ra nó.
Ta sẽ làm một ví dụ đơn giản để có thể hiểu nó một cách đơn giản. Bài toán của chúng ta là nhân đôi các phần tử có trong mảng cho sẵn.
Imperative: Cách thức giải quyết bài toán:
- Khai báo 1 mảng doubled mới để lưu dữ liệu
- Duyệt qua các phần tử của mảng.
- Thực hiện phép nhân đôi các phần tử trong mảng
- Lần lượt lưu kết quả vào mảng doubled
var numbers: [Int] = [1, 2, 3, 4, 5] var doubled: [Int] = [] for num in numbers { let new = num * 2 doubled.append(new) } print(doubled)
Declarative: Cách giải quyết sẽ khác một chút
- Chúng ta không thấy việc duyệt mảng mà chỉ thấy câu lệnh map cùng phép tính nhân với 2
- Lệnh map ở đây thực hiện việc tạo 1 mảng doubled mới từ mảng đã cho với các phần tử đã được nhân với 2
var numbers: [Int] = [1, 2, 3, 4, 5] var doubled = numbers.map { $0 * 2 } print(doubled)
Qua trên, Imperative sẽ cần chúng ta chỉ ra các bước tuần tự cần thực hiện. Trong khi Declarative sẽ cho ta thấy ngay cái ta cần xảy ra mà không bận tậm phải duyệt mảng.
1.2. Lợi ích của Declarative Programming
- Hạn chế sự thay đổi
Các đối tượng, dữ liệu trong chương trình sẽ rất ít khi bị thay đổi, xuyên suốt trong quá trình thực hiện. Bạn sẽ ít phải bận tâm hơn khi dữ liệu có bị thay đổi ở những hàm nào, luồng (thread) nào tác động đến nó…? Làm việc với các giá trị bất biến (constant) sẽ dễ dàng, ít lỗi hơn rất nhiều. Đó là lý do tại sao Apple khuyến khích dùng “let” trong Swift.
- Giảm thiểu state side-effects
-
- Side Effect là những thay đổi phía bên ngoài của một scope (khối lệnh).
- Bạn nên biết rằng, khi bạn tác động làm thay đổi trạng thái của 1 thành phần thì không chỉ thành phần đó sẽ thay đổi. Mà có thể nó sẽ ảnh hưởng tới các thành phần khác.
- Quan trong ở đây là bạn phải kiểm soát chúng nó. Để giảm đi hoặc không cho phép các hiệu ứng khác xảy ra khi trạng thái của một thành phần nào đó thay đổi.
- Code ngắn hơn, dễ hiểu hơn
Khi sử dụng Declarative, code của bạn sẽ ngắn hơn và dễ đọc hơn rất nhiều. Nó tập trung vào input, bạn muốn làm gì với input để tạo ra output. Hãy hình dung bạn phải đọc hàng loạt các vòng lặp lồng nhau rồi vắt óc xâu chuỗi để biết người tiền nhiệm muốn gì khi viết code này.
- Dễ dàng mở rộng
Declarative Programming dễ đọc hơn, đơn giản và an toàn hơn nên nó sẽ dễ dàng để mở rộng, thực hiện việc maintain hơn.
2. Declarative App development với SwiftUI
2.1. Khái niệm
Qua trên, ta mới được biết về khái niệm ban đầu. Nhưng cái ta quan tâm là phát triển một ứng dụng Declarative với SwiftUI. Ta có một số điểm cần chú ý như sau.
Thứ nhất, SwiftUI cho phép bạn phát triển ứng dụng khai báo (declarative app). Nó đem lại một trải nghiệm nhanh hơn nhiều so với cách lập trình hay phát triển app truyền thống trước đây (imperative app).
Thứ hai, Declarative app development có nghĩa là bạn phải khai báo cả hai việc một lúc:
- Giao diện của bạn sẽ trông như thế nào.
- Dữ liệu mà giao diện của bạn phụ thuộc vào.
Thứ ba, nhiệm vụ của SwiftUI chính là tạo các view khi chúng xuất hiện. Và cập nhật lại chúng khi có sự thay đổi từ phái dữ liệu mà chúng phụ thuộc vào.
2.2. Nhiệm vụ
Ngoài việc thiết kế bố cục các View, nhiệm vụ chính của bạn bạn còn phải khai báo thêm các trạng thái của các view khi xuất hiện. Và cách để SwiftUI phản ứng lại với sự thay đổi trạng thái dữ liệu mà các view phụ thuộc vào.
Và khi đã nhắc tới phản ứng, việc kết hợp giữa SwiftUI với Reactive Programming Framework là điều không thể thiếu. Với Reactive Programming thì ta có 2 đại diện như sau:
-
- Combine (hàng chính chủ Apple)
- RxSwift (thế lực mạnh nhất hiện tại)
Bạn có thể tham khảo thêm các bài viết trên Fx Studio liên quan tới 2 thư viện huyền thoại này:
3. Thành phần đặc trưng
Ta có một số thành phần đặc trưng của SwiftUI với Declarative App như sau:
- Views:
- Với các Declarative UI thì sẽ đồng bộ với code của bạn.
- Không cần phải định danh các UI Control khi sử dụng.
- Bố cục UI kết hợp với dữ liệu nhanh chóng.
- Phù hợp với nhiều nền tảng khác nhau trong cùng một hệ sinh thái.
- Data:
- Dữ liệu khai báo phụ thuộc sẽ cập nhật view khi dữ liệu thay đổi.
- SwiftUI sẽ tính toán lại và render lại từng phần mà liên kết với dữ liệu khai báo.
- Trạng thái của view cũng bị ảnh hưởng với chúng.
- Bạn phải khai báo cách view hiển thị với từng trạng thái dữ liệu và các phản ứng lại với sự thay đổi của dữ liệu.
- Navigation:
- Điều hướng các view tới các view khác hoặc các màn hình phụ
- Integration:
- Tích hợp UIKit vào SwiftUI.
- Nhằm tận dụng lại kho tàng mà UIKIt đang có.
4. SwiftUI vs. UIKit
Phần này sẽ nói sự khác nhau cơ bản giữa SwiftUI và UIKit.
Với UIKit, bạn cài đặt và tạo giao diện với các UI Control cơ bản. Bạn xác định các IBOutlet
& IBAction
. Khi người dùng có tương tác và có sự thay đổi về mặt dữ liệu, thì bạn phải tự cập nhật là giao diện của ứng dụng.
Bên cạnh đó, nếu như bạn thay đổi tên của các Outlet & Action thì ứng dụng dễ bị crash. Bạn phải tiến hành kết nối lại giữa code và giao diện (từ file *.xib).
Đây là nỗi ám ảnh của biết bao thế hệ dev iOS.
Với SwiftUI, trước tiên bạn cảm nhận được việc tạo giao diện bố cục một cách nhanh chóng. Không quá phức tạp như AutoLayout hay phải tính toán chi tiết như set frame
. Mọi thứ bắt đầu tự việc khai báo các view và các dữ liệu ràng buộc chúng. Và khi bạn đã sắp xếp ổn về UI & Data, khi có sự thay đổi dữ liệu phụ thuộc …
Giao diện tự động cập nhật theo.
Quan trong, bạn có thể thấy tại Canvas mọi thứ dường như là real-time
. Những gì bạn code sẽ auto cập nhật sang View. SwiftUI hỗ trợ nhiều trình hiển thị trong cùng file, giúp bạn tiết kiệm thời gian thiết kế giao diện …
Các bài viết sau sẽ giúp bạn thấy được sự khác nhau cụ thể như thế nào giữa SwiftUI và UIKit.
Tạm kết
Với sự ra mắt của SwiftUI từ Apple, thì Apple cũng đã khẳng định tương lai của lập trình chính là Declarative Programming. Hoặc ít nhất là tương của hệ sinh thái Apple. Và việc phát triển một ưng dụng Declarative, bạn cần phải kết hợp nhiều kĩ năng hơn nữa, như Reactive Programming.
Cuối cùng, tương lai vẫn chưa biết được. Nhưng hạnh phúc là con đường chứ không phải là đích đến. Bạn hãy tiếp tục học hỏi và tìm hiểu thêm về SwiftUI.
Okay! Tới đây, mình xin kết thúc bài viết này. Và nếu có gì thắc mắc hay góp ý cho mình thì bạn có thể để lại bình luận hoặc gởi email theo trang Contact.
- Bài viết tiếp theo tại đây.
- Tham khảo: Thời trang lập trình – Sự trỗi dậy của Declarative Programming!
Cảm ơn bạn đã đọc bài viết này!
Related Posts:
Written by chuotfx
Hãy ngồi xuống, uống miếng bánh và ăn miếng trà. Chúng ta cùng nhau đàm đạo về đời, về code nhóe!
Leave a Reply Cancel reply
Fan page
Tags
Recent Posts
- Complete Concurrency với Swift 6
- 300 Bài code thiếu nhi bằng Python – Ebook
- Builder Pattern trong 10 phút
- Observer Pattern trong 10 phút
- Memento Pattern trong 10 phút
- Strategy Pattern trong 10 phút
- Automatic Reference Counting (ARC) trong 10 phút
- Autoresizing Masks trong 10 phút
- Regular Expression (Regex) trong Swift
- Lập trình hướng giao thức (POP) với Swift
You may also like:
Archives
- July 2024 (1)
- June 2024 (1)
- May 2024 (4)
- April 2024 (2)
- March 2024 (5)
- January 2024 (4)
- February 2023 (1)
- January 2023 (2)
- November 2022 (2)
- October 2022 (1)
- September 2022 (5)
- August 2022 (6)
- July 2022 (7)
- June 2022 (8)
- May 2022 (5)
- April 2022 (1)
- March 2022 (3)
- February 2022 (5)
- January 2022 (4)
- December 2021 (6)
- November 2021 (8)
- October 2021 (8)
- September 2021 (8)
- August 2021 (8)
- July 2021 (9)
- June 2021 (8)
- May 2021 (7)
- April 2021 (11)
- March 2021 (12)
- February 2021 (3)
- January 2021 (3)
- December 2020 (3)
- November 2020 (9)
- October 2020 (7)
- September 2020 (17)
- August 2020 (1)
- July 2020 (3)
- June 2020 (1)
- May 2020 (2)
- April 2020 (3)
- March 2020 (20)
- February 2020 (5)
- January 2020 (2)
- December 2019 (12)
- November 2019 (12)
- October 2019 (19)
- September 2019 (17)
- August 2019 (10)