Lập trình ra một iOS app vốn là điều không hề dễ dàng, vì thế cũng dễ hiểu các developer luôn muốn rút gọn các bước để có thể hoàn thành chúng một cách nhanh chóng. Nhưng một app thành công thì sẽ tồn tại một thời gian dài – nói cách khác, các developer vẫn phải fix bug, cải thiện tính năng và code nhiều nữa.
Trong bài viết này, tôi sẽ nói về 3 điều mà các iOS developer nên biết để giúp cho quá trình được gọn gàng và nhanh chóng hơn.
Đừng xem thường Constants (Hằng số)
Khá nhiều người tin rằng variables luôn tốt hơn constants bởi sự linh hoạt của nó, thế nhưng nếu có cơ hội thì bạn hãy ưu tiên sử dụng constants trước. Tại sao lại thế? Đó là bởi một số lợi ích của nó:
Dễ đọc
Một trong những điều tuyệt với nhất của constants là chúng rất dễ đọc. Hãy thử với một ví dụ sau: bạn cần phải viết một app về kinh doanh. Bạn cần phải thêm tỉ lệ mức thuế ở 8.75%, nhưng khi các developer vào xem thì họ sẽ không hiểu con số trên là gì.
Giả sử có một Developer tên là Trung, Trung tham gia vào team của bạn và đọc code của app. Do ở nước của Trung không hề có khái niệm gì về thuế nên Trung chả hiểu còn số 8.75% có vai trò như thế nào.
Do đó nếu bạn để giá trị của thuế là một variable thì rất có thể Trung do vô tình không biết và tự ý sửa thì nó có khả năng gây ra hậu quả nghiêm trọng. Chỉ cần thay đổi keyword từ var
thành let
thì compiler sẽ thông báo cho Trung biết rằng giá trị 8.75% là không thay đổi được và anh sẽ hiểu rằng đó là chủ ý của bạn khi không muốn nó bị đụng vào.
Giá trị tham khảo
let
khá tiện lợi khi cho phép bạn ám chỉ một giá trị nhất định. Thí dụ như bạn muốn sơn một màu bất kì. Thay vì cứ phải Copy-paste lại từng cái thì với constant, bạn chỉ việc đơn giản là nói ra màu mình muốn sơn là gì.
Nhờ đó mà khi bạn muốn thay màu sơn, thì chỉ cần thay đổi giá trị của constant và chúng sẽ tự động cập nhật.
Class hay Struct Instantiation
Khi bạn tạo ra một singleton, thì ta cũng phải đụng tới class. Thông thường, bạn sẽ phải khai báo static let
trong class declaration. Sau đó bạn phải đặt tên cho constant và chỉ định nó tới một class và dùng xuyên suốt app.
Mặt khác, nếu bạn muốn tạo ra một class nhanh chóng, với ViewController.swift, bạn sẽ tạo ra constant và chỉ định nó tới class bạn muốn, với một giá trị tham khảo, quá trình trên sẽ diễn ra nhanh chóng.
Có thể thấy, sử dụng constant cho ta rất nhiều lợi ích. Chúng giúp code dễ đọc hơn, để lưu trữ các giá trị bất biến, và không hề vô dụng như bạn đã nghỉ.
Đừng mở Optionals sai cách
Optionals là những tính năng rất mạnh mẽ của Swift. Chúng đều là những types như int
và String
, được chú thích bởi dấu chấm hỏi sau type declaration. Nếu bạn muốn khai báo một variable là optional string, bạn sẽ viết như sau:
var someVariable: String?
Compiler lúc này sẽ tự hiểu rằng hoặc nó có giá trị hoặc là không. String?
và String
là hoàn toàn khác nhau.
Optionals cũng như những hộp quà vậy, chúng có thể chứa những món quà giá trị hoặc không có gì cả. Để biết được chúng có gì ta sẽ phải mở những hộp quà đó ra.
Cách sai
“Cố xé” nó ra
Hành động đó còn được gọi là Bang Operator. Đừng có xài nó! Việc cố mở một variables chẳng bao là ý tưởng tốt cả. Nếu giá trị của một value bạn đang cố mở là nil (không có giá trị), thì ngay lập tức app sẽ crash. Hãy thử nhìn vào dòng code sau đây:
var someVariable: String? var somethingElse: String = "hello" func setupApp() { self.somethingElse = self.someVariable! }
Trong trường hợp trên, app sẽ crash bởi ta chưa hề defined được một giá trị cho someVariable
, và ta cũng đang muốn chỉ định nó đến một variable của một loại String
. Như vậy nó khiến cho optionals bị mất đi ý nghĩa bởi nó vốn là để giúp chúng ta không bị những trường hợp này.
Vậy chúng ta hãy nhìn vào cách làm đúng trong tình huống trên:
Cách đúng
Optional Binding
Đây là một trong những cách thức phổ biến nhất dành cho optionals. Với cách này, bạn chỉ cần chỉ định một giá trị optional đến constant bằng `if`. Nếu optional có thể mở thì compiler se được đóng, và lúc đó bạn có thể dùng constant đã được tạo ra. Còn nếu không thì tức là bạn đã ở trong trường hợp `else` và sẽ chả có gì xảy ra.
var someVariable: String? var somethingElse: String = "hello" func setupApp() { if let theThing = someVariable { self.somethingElse = self.someVariable! } else { print("error") } }
Dựa theo ví dụ lúc nãy, nhưng với optional binding. Thay vì bị crash thì compiler chỉ thông báo là “error” hay lỗi.
Optional Chaining
Một cách thông dụng khác là Optional Chaining. Đây là một phương pháp khá hay để tránh việc optional không có giá trị mà lại khá ngắn với chỉ một dòng code. Bởi khi đó nó sẽ ngay lập tức ngừng execute.
var someClass: SomeClass? = SomeClass() var somethingElse: String? func setupApp() { self.somethingElse = someClass?.createString() }
Hiểu một cách đơn giản thì nếu someClass
có giá trị là nil thì cả dòng code đó sẽ bị bỏ qua và giá trị của somethingElse
sẽ là nil. Còn nếu có giá trị thật thì nó như bên optional binding, sẽ được chỉ đạo đến variable somethingElse
và tất nhiên là app không bị crash.
Nil Coalescing
Tương tự như Optional Chaining bởi nó khá ngắn gọn nhưng bạn phải cung cấp default hoặc cách xử lí cho tình huống “else”:
var someVariable: String? var somethingElse: String = "hello" func setupApp() { self.somethingElse = someVariable ?? "error" }
Nhìn thì có vẻ khá thần bí nhưng nó chỉ đơn giản là nếu statement ở bên trái có một giá trị, thì sẽ được dùng. Còn nếu là nil thì default statement sẽ được dùng. Cần lưu ý là statement bên phải không được là nil hay optional.
Đừng bỏ qua cấu trúc của code
Một lỗi thường gặp của các developer là không quan tâm bảo đảm sao cho cấu trúc code được bền vững, gọn gàng và dễ bảo trì. Có rất nhiều cứ cố nhồi nhét code vào ViewController
classes, Khiến cho việc thay đổi cũng như debug trở nên khó khăn hơn.
Vì thế mà bạn cần phải có cách thiết kế cấu trúc code thật tốt và luôn theo kĩ từng bước.
Chúng ta có 2 model thường được các iOS developer dùng, đó là:
MVC (Model-View-Controller)
MVC sẽ chia code của bạn thành 3 phần: model, view, controller
- Model: chính là data của app. Nó bao gồm các reusable structures và class chỉ dành cho data của app. nó không hề có ảnh hưởng hay liên quan tới view hay cách hiển thị thông tin tới người dùng.
- View: chịu trách nhiệm cho việc hiển thị data cho user và cả user interaction. Không hề liên quan tới việc xử lí data hoặc một số view đặc biệt, nó chỉ là reusable class có thể được dùng nhiều lần mà không cần phải lặp đi lặp lại code.
- Controller: là sếp sòng. Nó vận chuyển data tới model, rùi gửi tới view để hiển thị lên cho người dùng. ViewController.swift chính là một controller, nó tiếp nhận input và sửa model tùy theo yêu cầu.
Có khá nhiều phiên bản khác nhau như MVVM và MVP. Tuy nhiên cách thức hoạt động thì vẫn tương tự nhau.
Hãy thử tìm hểu một phương pháp cấu trúc khác cũng thông dụng không kém, nó là:
Singletons
Singleton là một instance đơn của một class luôn hiện diện mọi lúc trong bộ nhớ. Vậy khi bạn lập trình ra một app có kết nối với một database. Bạn cần có một nơi để lưu trữ toàn bộ data service connections. Đây chính là lúc singletons tỏa sáng, đoạn code dưới đây sẽ cho bạn cách viết ra một singleton:
// Declaration class DataService { static var shared = DataService() func createUser() { } } // Call-site DataService.shared.createUser()
Nếu bạn theo đúng những bước trên, app của bạn sẽ dễ bảo trì cũng như viết debug cũng trở nên dễ thở hơn rất nhiều.
Lời kết
Qua bài viết này, chúng ta đã thấy rõ 3 sai lầm các iOS app developer thường mắc phải. Chúng trông có vẻ là cách thức tốt nhưng thực chất chỉ làm mọi thứ rối rắm hơn.
Hãy luôn nhớ rằng, lập trình một app chỉ là một phần của project. Bạn còn phải fix bug, thêm tính năng và chia sẻ code với các developer khác. Hãy luôn dùng constants, đừng áp dụng optional sai và có một model cấu trúc rõ ràng, lập trình app và bảo trì nó sẽ trở nên dễ dàng hơn rất nhiều.
Nguồn: Topdev via Tutsplus
Xem thêm các vị trí tuyển nhân viên it tại đây