Tôi có xu hướng không đồng ý với điều này pa ttern.
Trước hết, tôi cố gắng xử lý Dữ liệu cốt lõi dưới dạng chi tiết triển khai và như bất kỳ chi tiết triển khai nào cần được ẩn đằng sau mặt tiền tốt. Mặt tiền là các giao diện mà tôi trưng ra cho các đối tượng mô hình của mình. Ví dụ nếu tôi có hai đối tượng mô hình; Cource
và Student
, bất kỳ tòa án nào cũng có thể có một số học sinh. Tôi không muốn để cho bộ điều khiển thực hiện nhiệm vụ thiết lập các biến vị ngữ và các bộ mô tả sắp xếp, và nhảy qua tất cả các vòng dữ liệu cốt lõi chỉ để có được một danh sách các sinh viên cho một lớp cụ thể. Có một cách hoàn toàn hợp lệ để hiển thị điều này trong mô hình:
@interface Cource (StudentAccess)
-(NSArray*)studentsStortedByName;
@end
Sau đó, triển khai công cụ xấu xí một lần và cho tất cả trong lớp Mô hình. Ẩn tất cả các chi tiết phức tạp của Dữ liệu cốt lõi và không cần phải vượt qua các bối cảnh đối tượng được quản lý. Nhưng làm thế nào tôi có thể tìm thấy các nguồn, nó phải bắt đầu ở đâu đó đúng không? Có, nó không nhưng bạn không cần phải tiếp xúc với bộ điều khiển. Việc thêm các phương pháp như vậy cũng hoàn toàn hợp lý:
@interface Cource (CourceAccess)
+(Cource*)caurceByID:(NSString*)courceID;
+(NSArray*)allCources;
+(NSArray*)courcesHeldByTeacher:(Teacher*)teacher;
@end
Điều này cũng giúp giảm thiểu sự phụ thuộc giữa các bộ điều khiển. Và giảm bớt sự phụ thuộc giữa mô hình và bộ điều khiển. Giả sử tôi có một CourceViewController
và StudenViewController
là tôi không giấu nổi những chi tiết cốt lõi dữ liệu đằng sau một mặt tiền và muốn vượt qua xung quanh bối cảnh đối tượng quản lý là tốt, sau đó tôi sẽ kết thúc với một initializer định như thế này:
-(id)initWithManagedObjectContext:(NSManagedObjectContext*)moc
student:(Student*)student;
trong khi đó với tốt một mặt tiền tốt tôi kết thúc với điều này:
-(id)initWithStudent:(Student*)student;
Giảm thiểu sự phụ thuộc đằng sau mặt tiền, ủng hộ của dependency injection cũng làm cho nó dễ dàng hơn để thay đổi việc triển khai nội bộ. Việc truyền xung quanh bối cảnh đối tượng được quản lý sẽ khuyến khích mỗi bộ điều khiển thực hiện logic riêng của chúng cho các công cụ cơ bản. Lấy ví dụ studentsSortedByName
. Lúc đầu, nó có thể được sắp xếp theo họ/tên, nếu sau này thay đổi để sắp xếp tên/cuối cùng bạn sẽ phải đi đến mỗi và mọi bộ điều khiển đã sắp xếp sinh viên và thực hiện thay đổi.Trường hợp một phương pháp mặt tiền tốt yêu cầu bạn thay đổi trong một phương pháp, và tất cả các bộ điều khiển tự động nhận được bản cập nhật miễn phí.
Tôi không thấy bạn không đồng ý với Apple - bạn chỉ đang tiến thêm một bước nữa và ẩn ngữ cảnh. Bạn sẽ không biện hộ cho bộ điều khiển xem của bạn lấy danh sách sinh viên hoặc khóa học từ đại biểu ứng dụng hoặc một số singleton khác, phải không? – Caleb
@Caleb - Không phải từ đại biểu ứng dụng, nhưng tôi sẽ không xấu hổ khi kéo danh sách các khóa học từ một phương thức lớp của lớp 'Course'. Điều trị các lớp như một singleton của loại. – PeyloW
Tôi không đồng ý rằng các loại và vị từ thuộc về lớp mô hình. Các sắp xếp và các vị từ chỉ được yêu cầu bởi giao diện để chúng thuộc về bộ điều khiển. Đặt các loại và vị từ trong mô hình liên kết mô hình với một giao diện cụ thể và làm ô nhiễm tính toàn vẹn logic của mô phỏng mô hình của các đối tượng, sự kiện hoặc điều kiện thực tế mà ứng dụng xử lý. – TechZen