[Legacy] Bằng cách nào để viết các hàm Test Util trong Swift

Posted on April 10th, 2019

Khi một project trở nên đủ lớn để cần đến những hàm tiện ích Utilities thì việc phân bổ nó như thế nào cũng rất nên được xem xét. Trong Swift, có vài cách để viết các hàm Utils mà chúng ta sẽ xem xét trong bài này.

Static function

Static function trong lập trình hướng đối tượng nói chung, là những hàm mà có thể được gọi từ tên của class thay vì phải tạo instance, như sau:

class Utils {
    static func doSomething(){
        print("Doing something...")
    }
}
//var util = Utils()
//util.doSomething()
Utils.doSomething()

Tuy nhiên cần chú ý là Static function không thể được override ở subclass

Class function

Class function trong Swift là những hàm được khai báo với keyword class phía trước, mang tính chất tương tự như Static function, tức là có thể được gọi thông qua tên class. Nhưng khác ở chỗ là nó có thể được override ở subclass, còn static function thì không.

static func = final class func

Cannot override a static function

Global function

Global funtion là những hàm đứng riêng lẻ không thuộc vào một class cụ thể nào và có thể được gọi ở bất cứ đâu trong project. Những global function cũng có thể được viết riêng trong một file sau đó import vào project để sử dụng.

func anotherUtil(){
    print("Another Utility Function")
}

Trong trường hợp global function bị trùng tên với một function nào đó trong class, thì nó có thể được gọi thông qua tên của project, ví dụ như MyProject.anotherUtil()

Khi sử dụng một static function thì cả class chứa function đó được load vào trong bộ nhớ. Trong trường hợp dùng global function thì chỉ function nào được gọi mới được load vào bộ nhớ.

Kết luận

Với những cách xử lý các hàm Utils như trên, có thể thấy rằng static function có lợi về mặt namespace, dạng classA.doSomething()classB.doSomething(). Trong khi đó thì global function có thể được gọi rất thoải mái trong toàn bộ project, và có thể được viết vào file riêng để import vào project khác. Lựa chọn là tùy thuộc vào các tình huống rất cụ thể.