2015-08-07 18 views
10

Tôi có một lớp với các phương thức tĩnh: lớp này kết thúc cuộc gọi đến Twitter APIHai lớp, gọi lại và thử nghiệm đơn vị

Trong lớp thứ hai, tôi có một số logic nghiệp vụ.

Do hành vi không đồng bộ của một số phương pháp trong lớp trình bao bọc, tôi gặp khó khăn trong việc thiết kế giao tiếp. Đây là những gì tôi đã thực hiện:

APIManager.swift

public class APIManager { 
    class func getPermission(callback :() -> Void) { 

     let accountStore = ACAccountStore() 
     let accountType = 
     ACAccountStore().accountTypeWithAccountTypeIdentifier(ACAccountTypeIdentifierTwitter) 

     let callbackRequestAccess = { (granted: Bool, error: NSError!) -> Void in 
      ... 
      if(granted) { 
       callback() 
      } 

     } 

     accountStore.requestAccessToAccountsWithType(setAccountType, 
        options: nil, completion: callbackRequestAccess) 

    } 
} 

Welcome.swift

public class Welcome { 

    public func checkPermission() { 
     APIManager.getPermission(getTweet) 
    } 
    public func getTweet() { 
     ... 
    }   
} 

Tôi không chắc chắn rằng thiết kế này theo đúng nghĩa hay không. Tôi không muốn có một liên kết mạnh mẽ giữa các lớp học, đó là lý do tại sao tôi đang sử dụng một cuộc gọi lại.

Đây có phải là thiết kế cổ điển không? Hơn nữa, tôi không cảm thấy hành vi này sẽ dễ dàng kiểm tra?

Trả lời

7

Bạn sẽ cải thiện đáng kể khả năng thử nghiệm bằng cách không sử dụng các phương pháp lớp ở đây. Tạo giao thức TwitterConnection. Tạo một SystemTwitterConnection phù hợp với nó và quản lý mọi thứ thông qua ACAccountStore. Tạo một TestTwitterConnection trả về các câu trả lời được đặt trước mà bạn có thể định cấu hình để thử nghiệm. Bạn thậm chí có thể tạo một KeychainTwitterConnection để quản lý đăng nhập Twitter bằng tay mà không cần sử dụng ACAccountStore hoặc một số triển khai khác nếu Apple phát hành thêm một cách khác để lưu trữ các tài khoản này.

Chuyển kết nối thích hợp tới Welcome khi được tạo.

Nếu giao thức TwitterConnection lớn, bạn nên cân nhắc tách giao thức thành các giao thức nhỏ hơn, chẳng hạn như TwitterAuthenticatorTweetFetcher xử lý ít thứ hơn (ngay cả khi một loại thực sự thực hiện tất cả các giao thức đó). Điều này có thể làm cho thử nghiệm dễ dàng hơn nhiều bằng cách cho phép các loại thử nghiệm của bạn thực hiện chỉ một vài hàm thay vì hàng tá.

Việc sử dụng bao đóng có thể là tốt, nhưng bạn nên gắn bó chặt chẽ hơn với quy ước đặt tên Cocoa. Những gì bạn đang gọi là callback theo truyền thống được gọi là completion. Tôi cũng làm theo hướng dẫn của Cocoa về cách đặt tên cho các phương pháp. Thay vì getPermission(), nó sẽ là requestAccessWithCompletionHandler(). Điều này sẽ giúp người gọi hiểu rằng nó có hành vi rất giống với requestAccessToAccountsWithType(options:completion:). Không xây dựng vốn từ vựng mới cho người gọi.

1

https://en.wikipedia.org/wiki/Observer_pattern

Nó sẽ giúp bạn để tách sự kiện xuất bản (Quan sát) và người tiêu dùng (Observer).
Ngoài ra, bạn có thể có triển khai Quan sát đặc biệt
không kết nối với bất kỳ đâu nhưng thông báo cho người quan sát biết về nội dung tĩnh.
Vì vậy, bạn gọi trực tiếp phương thức notifyObservers để kiểm tra hành vi của Người quan sát.

Các vấn đề liên quan