2010-04-26 26 views
5

Tôi nên đặt các phương thức tiện ích vào mục tiêu-c ở đâu?Phương pháp tiện ích trong mục tiêu-c

Ví dụ: các phương thức tiện ích xử lý đường dẫn bổ sung được gọi bởi nhiều lớp.

Tôi đã xem các ví dụ nơi chúng được đặt trong tệp appdelegate chính và do đó có sẵn cho tất cả. Điều này có vẻ hơi lạ với tôi mặc dù ...

Trả lời

1

Vâng, đó là khá lạ (và thực hành không tốt).

Có lẽ thành ngữ phổ biến nhất là sử dụng các danh mục để mở rộng các lớp hệ thống hiện có. Trong một vài trường hợp, trong đó không có lớp hệ thống nào là thích hợp, một số có thể tạo ra một lớp tiện ích bao gồm chủ yếu các phương thức lớp hoặc một lớp đơn với các phương thức ví dụ.

Nó phụ thuộc vào các phương pháp và vị trí phù hợp với cấu trúc ứng dụng tổng thể (và luôn là MVC phía sau mọi thứ).

+0

Singletons Tôi nghĩ rằng cũng quá mức cần thiết. Tôi đang tìm kiếm tương đương với các lớp tiện ích C++ với các phương thức tĩnh hoặc các không gian tên – Charlie

+1

Một cách tiếp cận tốt trong một ngôn ngữ không nhất thiết phải là cách tiếp cận tốt nhất trong một ngôn ngữ khác. –

+0

Tương đương với các phương thức tĩnh C++ là một phương thức lớp (các phương thức bắt đầu bằng '+' thay vì '-'). Tuy nhiên tôi có thể chỉ dính vào các chức năng thông thường hoặc có thể là các loại. –

6

Bạn có một vài lựa chọn:

  • Phương pháp đơn giản nhất là phải có một tập hợp các chức năng C cho tác vụ thông thường (nếu bạn sử dụng một phần mở rộng .m, bạn có thể sử dụng đối tượng-C Mục tiêu trong phạm vi chức năng C). Từ mã của bạn, ví dụ, bạn sẽ gọi ví dụ showAlertDialog().
  • Bạn có thể có một "lớp tiện ích" với một loạt các phương thức lớp mà bạn nhập vào mọi tệp. Ví dụ: bạn có thể gọi +[MyUtilities showAlertDialog]. Đây là sự tương đương trực tiếp nhất với các lớp tiện ích tĩnh trong Java, nhưng nó hơi khó tính trong Objective-C.
  • Tùy chọn khác, như Paul Lynch cho biết, là sử dụng các danh mục để mở rộng các lớp phổ biến. Vấn đề duy nhất với điều này là nó có thể dẫn đến các vấn đề bảo trì. Nó cũng chỉ hoạt động để mở rộng các lớp đã tồn tại, và chỉ khi bạn không cần truy cập vào các ivars. Bạn có thể có một loại cho NSObject mà sẽ làm cho các phương pháp có thể truy cập từ tất cả các đối tượng của bạn, nhưng tôi rất khuyên bạn nên chống lại điều đó (nó có thể dẫn đến nhức đầu bảo trì nghiêm trọng).

Cá nhân, tôi sử dụng kết hợp tùy chọn 1 và 3. Khi tôi có chức năng gắn liền với một lớp hiện có cụ thể, tôi sử dụng các danh mục. Nếu không, tôi sử dụng các hàm C.

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