6

Khi codebase của chúng ta chín muồi, tôi bắt đầu không thích mô hình chuyển các từ điển như là một cách để đóng gói thông tin để truyền thông điệp hoặc, tệ hơn, các đối số hàm. Nó đòi hỏi chức năng gửi và nhận cả hai đều có API không có giấy tờ của các chuỗi ký tự.Mô hình tốt hơn so với truyền NSDictionaries làm tham số?

..in some function.. 
NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys: 
         thisObject, @"thisKey", 
         thatObject, @"thatKey", 
         nil]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"MY_NOTIFICATION" object:nil userInfo:info]; 
.... 

và sau đó trong người nghe someClass 's

- (void)someClassListener:(NSNotification *)notification { 
    NSDictionary *info = [notification userInfo]; 

    ThisObject *ob1 = [info objectForKey:@"thisKey"]; 
    ThatObject *ob2 = [info objectForKey:@"thatKey"]; 
} 

Bạn phải nhớ rằng thisKeythatKey là chìa khóa của loại ThisObjectThatObject để thông báo rằng, chắc chắn bạn có thể tạo ra một số hằng ở đâu đó cho những người nhưng điều đó không thực sự giải quyết được vấn đề.

Và giả sử bạn có hàm cần 15 đối số, bạn sẽ không tạo hàm với 15 tham số, sẽ dễ dàng hơn nhiều (mặc dù ít có thể đọc hơn) để chuyển một từ điển nhưng bây giờ bạn có cùng một vấn đề như trên.

Tôi đã chơi với việc tạo ra các lớp thông báo trong các lớp tiêu đề của lớp đó (tức là hai giao diện trong một tiêu đề) và Lớp Thư chỉ là danh sách các đối tượng mà bạn xác định và gửi đến phương pháp tạo ra hợp đồng nhưng điều này cảm thấy sai.

Nó sẽ thật tuyệt nếu tôi có thể làm một cái gì đó giống như typeDef một đối tượng tham số trong tiêu đề nhưng điều đó không hỗ trợ NSObject 's chỉ những thứ như int hay float, vv

Về cơ bản tôi đang cố gắng để tạo một hợp đồng mạnh hơn giữa người gửi tin nhắn và người nhận tin nhắn, là các chức năng hoặc thông báo đó.

Trả lời

4

Bạn có thể xác định hằng số cho các phím. Ví dụ: xem tài liệu cho UIKeyboardDidShowNotification để biết ví dụ. Có một liên kết đến tất cả các phím có thể được sử dụng để nhận thông tin về thông báo.

Cách tiếp cận tốt hơn là gói gọn dữ liệu của bạn vào một lớp thay vì từ điển. Tạo một lớp đơn giản với các thuộc tính. Điều này sẽ tự tài liệu nhiều hơn một từ điển. Bạn có thể thấy tên thuộc tính và loại thuộc tính trong tệp .h.

Nếu bạn thấy bạn có các phương thức cần 15 đối số, bạn cần phải quay lại và đóng gói các đối số đó vào một lớp thích hợp. Có lẽ phương pháp này đúng cách giảm xuống một vài đối số và một lớp hoặc một cái gì đó tương tự.

+0

Tôi đề cập đến hằng số cho khóa không phải là giải pháp tốt vì bạn vẫn phải tra cứu khóa là gì và không tạo ra một hợp đồng mạnh cho giá trị (đối tượng), giống như gợi ý. Việc đóng gói dữ liệu vào một lớp là hướng tôi đang điều tra nhưng có vẻ cồng kềnh khi tạo một lớp cho mỗi thư tôi muốn truyền, có thể là 2 đối số là 10, bạn có đồng ý không? – Shizam

+0

@Shizam, Nếu những thông điệp đó sẽ được đưa vào các từ điển khác nhau, thì có thể bạn sẽ cần nhiều hơn một lớp. Tuy nhiên, nếu bạn đang nói về các thông điệp mà đôi khi vượt qua hai khóa từ một từ điển, và đôi khi 10, thì đó sẽ vẫn chỉ là một đối tượng lớp. – rdelmar

+0

@rdelmar Những gì tôi quan tâm là trong suốt chương trình của chúng tôi, chúng tôi có thể có 10-15 thông báo duy nhất, mỗi thông báo đó sẽ cần lớp riêng của mình để xác định thuộc tính của nó cho tin nhắn, v.v. – Shizam

2

Điều bạn muốn là đối tượng thông số , một đối tượng nhỏ đóng gói một loạt các trường để giao tiếp thuận tiện với một số lớp khác. Bên trong, đối tượng tham số có thể chứa một từ điển, hoặc đơn giản là một tập hợp các trường được chỉ định.

Cung cấp cho đối tượng tham số một API đơn giản cho phép cả hai lớp được đặt và nhận các trường cụ thể mà bạn sử dụng - setThisKey: và getThisKey. Điều đó, về bản chất, ghi lại các API giữa các phương thức và các lớp.

Tiếp theo, tìm kiếm cơ hội để di chuyển chức năng vào đối tượng tham số.Ví dụ, nếu bạn có một cái gì đó như thế này:

param.fieldSize=[self.data size]; 
param.fieldColor=[self.data color]; 
param.flavor=[self.data lookUpTheRecipe] 

Bạn có thể gói gọn tất cả điều này với

[param withField: self.data]; 

Với công việc, bạn thường có thể làm cho các đối tượng tham số làm rất nhiều công việc hữu ích; điều này có thể phá vỡ các phương pháp lâu dài và giúp các lớp học lớn đổ trách nhiệm vượt quá.

+0

Tôi đề cập đến điều này như là một giải pháp tôi đã xem xét, vấn đề tôi thấy là phải tạo ra một đối tượng tham số cho mỗi thông điệp, có vẻ cồng kềnh. Ngoài ra nó có vẻ giống như vị trí để đưa đối tượng đó vào trong tiêu đề của lớp mà 'sở hữu' thông điệp như vậy mà bạn có hai giao diện trong một tiêu đề mà dường như được cau mày. – Shizam

+0

Bạn thường có thể chia sẻ một đối tượng tham số giữa một số phương pháp liên quan. –

+1

Tôi thấy không phản đối việc thêm giao diện để trợ giúp các đối tượng vào tiêu đề của lớp. Nhưng mục tiêu của bạn với một đối tượng tham số là thêm rất nhiều hành vi hữu ích cho đối tượng đó, không chỉ đơn thuần là để bọc một số dữ liệu. Vì vậy, cuối cùng, đối tượng tham số có thể xứng đáng với vị trí của nó trên thế giới. Các lớp như NSURL bắt đầu theo cách này. –

0

Lúc đầu, có 15 đối số không tốt và trong trường hợp này, bạn nên nghĩ đến việc không thực hiện các cuộc gọi lại đó hoặc cố gắng giảm số.


Còn việc sử dụng người gửi thông báo thì sao? Ví dụ: đối tượng của bạn Task đã hoàn tất và gửi thông báo. Người nhận sử dụng người gửi để truy cập sender.result, sender.error, sender.anything.


Nếu bạn muốn liên lạc mạnh hơn giữa các đối tượng này (người gửi/người nhận) có thể bạn nên sử dụng một cách giao tiếp khác thay vì NSNotifications.

Một số lựa chọn thay thế:

  • đại biểu (hoặc một số loại khác của cuộc gọi phương pháp trực tiếp)
  • khối
  • mục tiêu + hành động

Tất cả đều có thể được sử dụng như to-many gọi lại bằng cách lưu trữ chúng trong một mảng và chúng không sử dụng NSDictionaries để chuyển giá trị.

+0

Chúng tôi cũng sử dụng các đại biểu và khối, tôi chỉ sử dụng NSNotifications làm ví dụ dễ thấy vấn đề này. Tôi vẫn còn có vấn đề này với các khối vv nhưng tôi bắt đầu nghĩ rằng việc tạo ra các đối tượng tham số để chứa các tham số là khá nhiều cách duy nhất để làm điều đó. – Shizam

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