3 lỗi nghiêm trọng của lập trình viên iOS
Bài đăng này đã không được cập nhật trong 6 năm
Viết một ứng dụng iOS là công việc khó khăn, vì vậy nó có nghĩa rằng các lập trình viên luôn muốn tìm cách để viết có thể viết ứng dụng càng nhanh càng tốt. Tuy nhiên, một ứng dụng thành công cần được tồn tại lâu dài và có lượng người dùng trên App Store - điều này có nghĩa là phải sửa lỗi và cập nhật các tính năng mới cho ứng dụng của bạn.
Trong bài này, tôi sẽ chia sẻ ba điều để tránh xa trong quá trình phát triển iOS sẽ làm cho ứng dụng của chúng ta dễ dàng hơn để xây dựng và dễ dàng hơn để duy trì.
1. Đừng sợ những hằng số
Mặc dù có vẻ như biến có sự linh hoạt hơn hằng số, nhưng vẫn không phải là một ý tưởng hay để mặc định các biến khi chúng ta có thể sử dụng hằng số thay thế. Vì vậy, dưới đây là 1 số điều tuyệt vời về hằng số
Readability
Một trong những điều tốt nhất về các hằng số là khả năng đọc ý nghĩa của chúng. Hãy xem ví dụ: Chúng ta đang viết một ứng dụng thương mại điện tử. Bạn có thể muốn thêm một mức thuế doanh thu địa phương là 8,75%, nhưng các nhà phát triển khác không biết số đó có ý nghĩa gì. Hãy xem xét một ví dụ:
Một lập trình viên có tên Steven gia nhập vào team của bạn, cậu ấy có thể là 1 senior về iOS, nhưng anh ta sống ở nước ngoài. Ở đất nước này, không có thuế bán hàng (Steven may mắn), và do đó, cậu ta không biết gì về nó.
Nếu bạn sử dụng một biến cho thuế suất doanh thu của mình, thì cậu ta có thể thay đổi nó chỉ trong một dòng mã và kết quả có thể gây hại nghiêm trọng cho ứng dụng của bạn. Chỉ cần thay đổi từ khóa let
thay cho từ khoá var
để cho phép trình biên dịch nói với cậu ta rằng giá trị không thể thay đổi, và anh ta sẽ nhận ra rằng bạn ko muốn thay đổi nó.
Value Reference
Một lợi khác của let
là tham chiếu giá trị trong code. Nếu bạn đang tạo một ứng dụng, bạn có thể muốn có một bảng màu nhất định. Thay vì sao chép các màu của bạn bất cứ nơi nào họ cần, bạn có thể sử dụng một hằng số để chỉ màu cụ thể đó.
Bằng cách này, nếu bạn thay đổi màu sắc, bạn chỉ cần thay đổi nó ở một nơi thay vì tìm tất cả các tham chiếu duy nhất để màu sắc và thay đổi nó nhiều lần.
Class or Struct Instantiation
Khi bạn tạo một singleton, bạn cũng cần phải tạo một đối tượng để chia sẻ trong lớp. Bạn thường sẽ làm điều này bằng cách khai báo một static let
bên trong của định nghĩa của lớp. Sau đó, bạn sẽ đặt tên cho hằng số và gán nó cho một thể hiện của lớp và sử dụng nó trong suốt ứng dụng của bạn.
Thêm vào đó, nếu bạn cần để nhanh chóng (tạo ra một thể hiện của) một lớp thường xuyên, có lẽ trong ViewController.swift, chúng ta sẽ tạo ra một hằng số và gán nó đối tượng của lớp cần sử dung,nó sẽ tạo 1 tham chiếu của nó và chúng ta có thể sử dụng nó trong toàn bộ file. Đây là một cách sử dụng tuyệt vời của hằng số.
Như bạn thấy, có nhiều lý do khiến các hằng số đó trở nên tuyệt vời. Nó tăng khả năng đọc mã, chúng rất hữu ích cho việc lưu trữ các giá trị bất biến, và rõ ràng, chúng không phải là vô dụng như bạn nghĩ. Làm cho code tối ưu bằng cách có thói quen sử dụng hằng số bất cứ khi nào có thể, và chỉ thay đổi chúng thành các biến nếu bạn hoàn toàn cần phải biến đổi giá trị của nó. Việc này sẽ giúp bạn lập trình 1 cách tốt hơn
2. Don't Force Unwrap Optionals
Optionals là một tính năng rất mạnh mẽ của Swift. Chúng giống như các kiểu như int và String, được đánh dấu bởi một dấu chấm hỏi sau khi khai báo kiểu. Nếu bạn muốn khai báo một biến như một chuỗi tùy chọn, bạn chỉ cần viết:
var someVariable: String?
Điều này giúp cho trình biên dịch biết rằng có hoặc có thể là một giá trị hoặc có thể không có giá trị nào cả. String? và String được coi là hai loại khác nhau.
Hãy suy nghĩ về optionals như một hộp quà. Như tôi đã đề cập, hộp quà tặng này có thể có hoặc không có giá trị, và nếu bạn muốn tìm ra, bạn phải mở gói quà ra. Có nhiều cách để làm việc này:
The Wrong Way
Forced Unwrapping
Toán tử này (thực hiện bằng cách sử dụng một dấu chấm than) được gọi là Bang Operator
. Không nên sử dụng ! để gỡ bỏ Optional. Nếu giá trị của tùy chọn bạn đang cố gắng gỡ bỏ là nil (không có gì), ứng dụng của bạn sẽ crash, và cũng chẳng ai muốn điều đó? Dù sao, chúng ta hãy nhìn vào khối mã sau đây:
var someVariable: String?
var somethingElse: String = "hello"
func setupApp() {
self.somethingElse = self.someVariable!
}
Trong ví dụ này, ứng dụng sẽ bị lỗi vì chúng tôi không bao giờ xác định giá trị cho một số biến và chúng tôi đang cố gắng gán nó cho một biến kiểu String. Điều này đánh bại toàn bộ mục đích của các tùy chọn, có sẵn để giúp bảo vệ chúng ta khỏi những lỗi như thế này!
Hãy nhìn vào một số cách chính xác để xử lý tình huống này.
The Right Way
Optional Binding
Đây là một trong những phương pháp phổ biến nhất để xử lý các tùy chọn. Trong phương pháp này, bạn chỉ cần chỉ định một giá trị tùy chọn cho một hằng sử dụng một câu lệnh if. Nếu tùy chọn có thể được unwrapped, trình biên dịch vào closure, và bạn có thể sử dụng các hằng đã được tạo ra. Nếu không, bạn rơi vào một tuyên bố khác và giả vờ rằng không có gì xảy ra. Hãy xem xét một ví dụ về điều này:
var someVariable: String?
var somethingElse: String = "hello"
func setupApp() {
if let theThing = someVariable {
self.somethingElse = self.someVariable!
} else {
print("error")
}
}
Sử dụng cùng một ví dụ như lần trước, nhưng với câu lệnh if
được thêm vào thì nếu đối tượng có tồn tại giá trị thì sẽ thưc hiện lệnh bên trong dấu ngoặc còn ngược lại thì sẽ in ra báo lỗi.
Optional Chaining
Một cách phổ biến khác để mở an toàn optionals là sử dụng Optional Chaining. Đây là một cách tuyệt vời để tránh các giá trị null một cách an toàn trong 1 dòng code. Khi bạn sử dụng phương pháp này và khi gặp 1 giá trị nil, thì đoạn code sẽ dừng việc thực thi nó. Dưới đây là một ví dụ về điều này:
var someClass: SomeClass? = SomeClass()
var somethingElse: String?
func setupApp() {
self.somethingElse = someClass?.createString()
}
Về cơ bản, nếu someClass
là nil, toàn bộ dòng sẽ không thực thi, và giá trị của somethingElse
sẽ trở thành không. Nếu có một giá trị, như ví dụ ở trên, nó sẽ được gán cho biến somethingElse
. Trong cả hai trường hợp, ứng dụng sẽ không crash.
Nil Coalescing
Phương pháp này cũng xử lý trên 1 dòng nhưng tất nhiên sẽ ko giống như Optional Chaining , bạn cần phải cung cấp trường hợp mặc định hoặc "else" (trường hợp tùy chọn không có hiệu lực). Hãy xem xét một ví dụ:
var someVariable: String?
var somethingElse: String = "hello"
func setupApp() {
self.somethingElse = someVariable ?? "error"
}
Nhìn có vẻ khó hiểu 1 chút nhưng câu lệnh này có nghĩa là nếu someVariable
không có giá trì thì sẽ tự động gán error
cho biến somethingElse
.
3. Don't Ignore Architecture
Một sai lầm phổ biến khác là không xây dựng được cấu trúc mã của bạn sao cho nó bền vững, duy trì và hiệu quả. Nhiều người nhét tất cả các mã của họ vào các lớp ViewController của họ, và điều này có thể làm cho mã của bạn khó thay đổi và gỡ lỗi.
Hãy xem việc xây dựng ứng dụng của bạn giống như xây 1 ngôi nhà. Ngôi nhà này cao 5 tầng, vì vậy nếu bạn không xây dựng nền móng vững chắc và theo các bản thiết kế, có lẽ nó sẽ lật đổ.
Nền tảng của ứng dụng iOS là mẫu thiết kế mà bạn chọn. Hãy nhìn vào hai trong số các mẫu phổ biến nhất được sử dụng.
MVC (Model-View-Controller)
Mô hình thiết kế Model-View-Controller hoặc MVC tách từng phần của mã của bạn thành ba phần: Model, View, Controller
Model: Mô hình chủ yếu là dữ liệu của ứng dụng. Việc này xử lý những thứ như cấu trúc có thể tái sử dụng và các lớp học chỉ xử lý với dữ liệu của ứng dụng. Mô hình không xử lý bất cứ điều gì liên quan đến chế độ xem hoặc cách thông tin sẽ được hiển thị cho người dùng.
View: Chế độ xem chỉ chịu trách nhiệm về việc trình bày trực quan dữ liệu và nó cũng xử lý tương tác người dùng. Nó không xử lý bất cứ điều gì liên quan đến dữ liệu, cũng không phải nó đối phó với quan điểm cụ thể. Nó chỉ đơn giản là một lớp có thể tái sử dụng mà có thể được sử dụng nhiều lần mà không cần lặp lại mã.
Controller: Bộ điều khiển là ông chủ. Nó mang lại dữ liệu từ mô hình, và sau đó gửi nó đến xem để cuối cùng hiển thị nó cho người dùng. Điều này thường là trong ViewController.swift, và nó lắng nghe để nhập vào và thay đổi mô hình khi cần thiết.
Singletons
Singleton là một thể hiện duy nhất của một lớp có mặt ở mọi thời điểm trong bộ nhớ. Vậy tại sao chúng ta quan tâm đến điều này? Vâng, giả sử bạn đang xây dựng ứng dụng kết nối với cơ sở dữ liệu. Bạn cần một nơi để đặt tất cả các kết nối dịch vụ dữ liệu của bạn. Đây sẽ là một nơi hoàn hảo để sử dụng singlelet. Xem mã dưới đây; nó sẽ cho bạn thấy làm thế nào để xây dựng một singleton:
// Declaration
class DataService {
static var shared = DataService()
func createUser() {
}
}
// Call-site
DataService.shared.createUser()
Nếu bạn làm theo các mẹo đơn giản này, ứng dụng của bạn sẽ dễ dàng hơn để duy trì, và lỗi sẽ rõ ràng hơn để tìm thấy trước khi khách hàng của bạn làm.
All rights reserved