15 tips để trở thành 1 dev Swift giỏi hơn (phần 2)

153

Tips dành cho các chuyên gia/ các dev Swift có kinh nghiệm
Xác thực Methods với Guard
guard hỗ code đẹp và an toàn hơn. Một guard statement kiểm tra 1 condition hoặc nhiều condition bất kì sẽ được gọi nếu không gặp 1 block else. Block else cần 1 statement return, break, continue, hoặc throw kết thúc quá trình thực thi của method hay có thể nói là kết thúc khối else ta phải thoát khối đang được thực thi.
Chúng ta sử dụng statements guard để giảm thiểu các code lộn xộn và tránh bị lồng ghép các statements if/else. Vì code trong block else của guardphải kết thúc khối else ta phải thoát khối đang được thực thi, nó đơn giản hơn việc chỉ sử dụng 1 statement if để gọi statementreturn nếu gặp 1 điều kiện là false. Có thể bắt gặp các bugs tiềm năng này trong lúc compile. Nếu các conditions của statements guard vượt qua, các giá trị tùy chọn được unwrappe sẵn.

 

Quản lý chương trình kiểm soát với Defer
Một statement defer sẽ chứa một khối các dòng lệnh mà sẽ được thực thi sau khi scope chứa nó đã hoàn tất. Đồng nghĩa với việc 1 cleanup logic (VD các câu lệnh đóng kết nối I/O) có thể được đặt trong 1 statement defer, đảm bảo rằng nó được gọi khi chức năng hiện tại rời scope. Điều này sẽ giảm thiểu các bước và quan trọng hơn là tăng tính an toàn.

 

Đơn giản hóa các Singletons
Sử dụng singletons trong bất kì ngôn ngữ nào luôn là chủ đề tranh luận nảy lửa nhưng nó vẫn là 1 pattern quen thuộc đối với hầu hết các dev. Thực hiện 1 singleton trong Objective-C gồm nhiều bước để đảm bảo đối tương singleton chỉ được khởi tạo 1 lần duy nhất. Swift đã đơn giản hóa việc này 1 cách tuyệt vời. Như chúng ta thấy bên dưới, thực hiện Objective-C tốn số dòng lệnh gấp 2 lần so với Swift.
Objective-C:

 

Swift:

 

Thay thế các Code Duplicate bằng Protocol Extensions
Chúng ta có thể mở rộng các types hiện tại với các thể loại trong Objective-C, nhưng thông thường không được đưa đến protocols. Swift cho phép chúng ta thêm các chức năng vào 1 protocol. Với Swift, chúng ta có thể mở rộng 1 protocol (thậm chí các protocols trong thư viện chuẩn!) và áp dụng nó vào class bất kì để thực hiện protocol. Thậm chí protocol extensions đã có đủ khả năng để thay đổi toàn bộ mô hình lập trình từ hướng-đối-tượng sang hướng-protocol. Lợi ích của concept này là thay cho classes, chúng ta mặc định thêm chức năng thông qua protocols để code sử dụng lại nhiều hơn. Để hiểu hơn về lập trình hướng protocol, bạn có thể xem qua videos của WWDC 2015
Tạo các chức năng Global Helper
Các variables và hàm global thường được xem là “điều không tốt”, nhưng sự thật là chúng có thể giúp chúng ta code sạch hơn. Nguyên nhân khiến chúng không tốt là vì global state, lúc này hàm global cần phải ở trạng thái global mới chạy được. Dưới đây là 1 số ví dụ về các hàm helper Grand Central Dispatch không chạy được ở trạng thái global. Đây là những gì chúng ta làm với hàm dispatch_after theo ngôn ngữ Swift.

 

Ví dụ về giao diện của hàm wrapper mới:

 

Ví dụ về giao diện của chức năng unwrapped:

 

Bọc các functions C với syntax Swift sẽ giúp code dễ hiểu hơn. Các maintainers tương lai sẽ rất biết ơn chúng ta miễn là chúng ta vẫn chịu trách nhiệm trong việc đặt tên các methods 1 cách chính xác. Nếu chúng ta thay đổi method trên thành delay(delay: Double, closure: ()->()), đó có thể là ví dụ về 1 tên method thiếu trách nhiệm vì dispatch_after yêu cầu queue GCD, và cái tên cũng không đưa ra bất kì chỉ dẫn nào về queue nào đang được sử dụng. Tuy nhiên, nếu codebase mà chúng ta đang làm việc đã hình thành quy ước là thực hiện tất cả các methods trong luồng chính nếu điều ngược lại không được chỉ dẫn trong tên hoặc comments, delay(delay: Double, closure: ()->()) sẽ là 1 tên method chính xác. Bất kể chúng ta đặt tên các chức năng helper là gì, mục đích là tiết kiệm thời gian bằng cách wrapping các code mẫu và giúp code dễ đọc hơn.
Mở rộng Collection Capabilities
Swift đã thêm 1 số methods, giúp chúng ta truy ấn và chỉnh sửa các collections 1 cách ngắn ngọn. Các collection methods này được lấy cảm hứngtừ các ngôn ngữ functional. Chúng ta sử dụng các collections để lưu nhiều giá trị thành 1 cấu trúc dữ liệu duy nhất và thường xuyên truy vấn chỉnh sửa các collections. Những hàm này được lập trình trong thư viện chuẩn của Swift và đơn giản hóa các nhiệm vụ thông dụng. Để giải thích các hàm bên dưới, chúng ta sẽ sử dụng ví dụ sau: let ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].

  • map đưa 1 closure vào mỗi giá trị trong collection, sau đó trả về dãy các type kết quả định vị với các giá trị đã được định vụ. Đây là cách chúng ta chuyển đổi array Int thành arrayString

  • filter đưa 1 function vào mỗi giá trị array của chúng ta và trả về 1 giá trị Bool. Mỗi giá trị trả về true sẽ được trả về trong array kết quả trong khi các giá trị trả về false thì không được trả về trong array kết quả. Chúng tôi đã lọc các số lẻ từ array ints:

 

  • reduce phức tạp hơn is map và filter, nhưng tính hữu dụng của reduce thay thế cho learning curve (tốc độ lĩnh hội). Những argument đầu tiên là giá trị được thay thế đầu tiên ( 0 trong trường hợp bên dưới). Argument thứ 2 là 1 hàm đã tiếp cận với các giá trị được thay thế trước đó và giá trị hiện tại của array. Trong ví dụ này, hàm của chúng ta là + , nó sẽ thêm các giá trị trước đó của hàm vào đối tượng hiện tại trong array.

 

Được trang bị bởi các mẹo về map, filter và reduce, chúng ta không cần nỗ lực để lọc và thục hiện các collections trong khi vẫn phát triển được khả năng đọc của các maintainers tương lai!
Lời kết
Chúng tôi đã tổng hợp danh sách này từ các tips thông dụng nhất và rất nhiều trong số chúng đã trở thành chuẩn mực trong codebases của chúng ta. Trong khi Swift đang phát triển như ngôn ngữ lâp trình thì danh sách các tips này cũng sẽ phát triển theo. Chúng tôi rất mong chờ những thay đổi của Swift trong năm tới và rất phấn khích sử dụng ngôn ngữ này nhiều hơn trong app của mình. Nếu bạn thú với các lời khuyên tương tự, các mẹo dành cho dev thì hãy xem qua bài post blog về Xcode tips,và theo dõi tài khoản @savvyapps trên Twitter.
====
Dịch bởi: IDE Academy
Nguồn: SavvyApps