Bộ điều khiển xem khổng lồ - IOS - Giải pháp


16

Tôi chắc chắn rằng mọi nhà phát triển iOS mới đều gặp phải vấn đề sau: Bộ điều khiển Chế độ xem rất đông mã với các mục đích khác nhau, dễ dàng nhận được hơn 500 dòng mã.

Đây là giao diện của hai màn hình cơ bản và phổ biến:

1) Màn hình biểu mẫu: nhập mô tả hình ảnh ở đây

2) Màn hình điều khiển xem bảng nhập mô tả hình ảnh ở đây

Cho đến nay tôi đã đọc về hai giải pháp khác nhau:

  1. Giải pháp đầu tiên: https://bendyworks.com/single-responsibility-principl-ios/ . Điều này dựa trên Thông báo, nó tách hoàn toàn Bộ điều khiển Chế độ xem khỏi Mô hình Chế độ xem (Ý định) và do đó làm giảm mã trong Trình điều khiển Chế độ xem. Tôi nghĩ rằng nó có nhược điểm của việc phá mã, tương tự như cấu trúc Go-To. Nó trông như thế này: nhập mô tả hình ảnh ở đây

  2. Giải pháp thứ hai giữ cho Bộ điều khiển View đông đúc tương tự (các hành động nút được thực thi bên trong VC, v.v.). nhưng sử dụng các thư viện như TPPalAvoiding , BlocksKit hoặc các giải pháp khác hầu hết dựa trên các danh mục. Với giải pháp thứ hai này, mã được giảm mạnh nhưng bộ điều khiển xem vẫn có nhiều trách nhiệm.

Bạn nghĩ gì về những giải pháp này? Cái nào tốt hơn? Có một cái tốt hơn?


5
Tôi không thể đưa ra một câu trả lời tốt vì thời gian, nhưng điều này sẽ chỉ cho bạn đi đúng hướng.
Mike D

Ý định của tôi là thu thập càng nhiều câu trả lời tốt nhất có thể để cuối cùng khắc phục vấn đề này mà rất nhiều nhà phát triển mới có. Cảm ơn các liên kết, nếu tôi tìm thấy một cái gì đó mới, tôi chắc chắn sẽ đăng nó ở đây.
Ravul

Đây là một cuộc nói chuyện tuyệt vời về việc chiến đấu với các bộ điều khiển chế độ xem béo của Andy Matuschak https://realm.io/news/andy-matuschak-refactor-mega-contoder/
Tomasz Bąk

Câu trả lời:


6

Chúng tôi có thể sử dụng MVVM để giải quyết vấn đề này.

Mẫu Model-View-ViewModel hoặc MVVM như thường được biết đến là mẫu thiết kế UI. VM lấy tất cả logic về việc chuẩn bị dữ liệu mô hình cho UI từ VC.

Ví dụ:
Bạn đã có đối tượng mô hình với một số trường, bạn muốn định dạng một số trong số chúng, thực hiện tính toán và kết hợp chúng.

Trong trường hợp MVC tất cả logic đó nằm trong ViewControll.
Trong MVVM, bạn chuyển tất cả từ VC sang VM.

VM sẽ chuẩn bị tất cả dữ liệu cho UI và VC chỉ cần đặt nó như thế này.

(trong lớp VC)

self.descriptionLabel = self.viewModel.textForDescriptionLabel;

Hướng dẫn và chủ đề:


3
Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Bart van Ingen Schenau

Tôi đồng ý với Bart. Nếu không ai khác sẽ đăng một bản tóm tắt của tất cả các phương pháp này, tôi sẽ thực hiện ngay khi tôi hiểu và kiểm tra tất cả.
Ravul

2
@Ravul cập nhật câu trả lời
kaspartus

Tôi đã bình chọn lên câu trả lời của bạn và cảm ơn bạn vì ý tưởng này. Tôi chỉ đọc về Lập trình phản ứng chức năng và có vẻ là một ý tưởng tốt. Tôi nghĩ rằng câu trả lời cho câu hỏi này là một bảng liệt kê, với một vài ưu điểm, nhược điểm và ít nhất một sơ đồ khái niệm cho 4 cách sau để tiếp cận vấn đề: 1) Ca cao phản ứng 2) KVO 3) Phương pháp đại biểu và 4) Cách cổ điển viết một Trình điều khiển xem. Tôi sẽ viết nó ngay khi tôi kiểm tra tất cả các phương pháp này nếu không có ai làm như vậy trước tôi. Nếu trong lúc đó tôi tìm ra những cách mới, điều đó còn tốt hơn nữa.
Ravul

3

Trước đây tôi đã phải gỡ rối mã trong Bộ điều khiển View có kích thước lớn và điều đó thực sự cản trở khả năng điều hướng nội dung của tôi lúc đầu. Một điều quan trọng tôi nhận ra là kích thước của Bộ điều khiển Chế độ xem không đủ lý do để phá vỡ mọi thứ. Có sự phức tạp khi có 1 tệp lớn và cũng phức tạp trong việc có một loạt các tệp nhỏ. Dưới đây là một số lý do hợp lệ để cấu trúc lại để chia Bộ điều khiển xem thành các phần nhỏ hơn:

MVC

Bộ điều khiển Chế độ xem không nên làm nhiều hơn là keo kết nối giữa Chế độ xem và Mẫu. Nếu bạn có nhiều mã kết nối mạng, mã thao tác hình ảnh, v.v., thì hãy xem xét việc chia chúng ra thành các lớp trợ giúp.

Nhiều điều khiển với Bộ điều khiển xem dưới dạng nguồn dữ liệu

Nếu bạn có một loạt các điều khiển trên màn hình có Bộ điều khiển Chế độ xem làm nguồn dữ liệu, hãy xem xét việc chia chúng thành các đối tượng nguồn dữ liệu riêng biệt và để chúng là nguồn dữ liệu. Hoặc bạn cũng có thể chia chúng thành các Bộ điều khiển xem riêng biệt (như nếu bạn Xem Trình điều khiển có chế độ xem bảng ngoài các bộ điều khiển khác, bạn có thể chia nó thành lớp Trình điều khiển xem bảng riêng của nó).

Mã trùng lặp

Nếu bạn có cùng mã chính xác trong các Bộ điều khiển Chế độ xem khác nhau, hãy đặt mã đó vào 1 vị trí được chia sẻ. Điều đó sẽ làm cho mã của bạn có thể tái sử dụng và giúp quản lý sự phức tạp.

Dưới đây là một số lời khuyên bổ sung để giảm thiểu độ phức tạp của Bộ điều khiển View:

Storyboard thay vì Programmatic

Tạo các phần tử View là rất nhiều mã và mã hình học khung cũng rất nhiều công việc. Nếu chưa xem xét sử dụng các ràng buộc bố cục tự động và đặt càng nhiều phần tử View trong bảng phân cảnh càng tốt.

Mã / bình luận không cần thiết

Ngoài ra hãy chắc chắn để loại bỏ mã / ý kiến ​​không cần thiết. Rất nhiều lần một tệp Trình điều khiển xem mới sẽ đi kèm với các phương thức bạn không sử dụng. Nếu bạn không sử dụng một phương pháp như thế didReceiveMemoryWarningthì có thể lấy nó ra. Ngoài ra, vì tệp View Controller quá lớn nên đôi khi việc xóa mã hoặc nhận xét cũ là điều đáng sợ. Đừng tắt nó đi! Nó chỉ làm tăng thêm sự phức tạp.

Thông báo

Để trả lời câu hỏi của bạn về thông báo: Thông báo không phải là Búa Vàng để sử dụng với mọi thứ. Tôi thấy thông báo hữu ích khi nhiều Bộ điều khiển Chế độ xem cần cập nhật cùng lúc vì 1 hành động cụ thể. Tuy nhiên, hãy cẩn thận với các thông báo, việc lạm dụng chúng có thể khiến bạn đau đớn khi cố gắng theo dõi chúng.


2

Có một kiến ​​trúc đặc biệt mà họ gọi là VIPER (View, Interactor, Presenter, Entity và Routing). Tôi sẽ thử tiếp tục ở đây những gì bạn cần biết:

Lượt xem

  • họ là quan điểm giả;
  • chứa các đối tượng như UIView, UIViewControll, UILabel, v.v;
  • chờ đợi nội dung từ Người trình bày ;
  • xử lý tương tác người dùng và chuyển nó đến lớp Presenter .

Người trình bày

  • không biết các đối tượng UI;
  • nhận đầu vào từ lớp View ;
  • xử lý logic xem (thêm phương thức sẽ trình bày màn hình khác);

định tuyến

  • xử lý logic điều hướng và hình ảnh động chuyển tiếp;
  • biết các đối tượng như UINavestionControll, UIWindow, v.v;

Vì vậy, những gì tôi nghĩ bạn sẽ làm sạch trong mã của bạn:

  • xác nhận dữ liệu sẽ chuyển sang lớp Presenter ;

  • điều hướng sẽ di chuyển đến các đối tượng Wireframe ( lớp định tuyến );

  • phân chia bộ điều khiển xem của bạn quan sát nguyên tắc DRY ;

  • Các màn hình phức tạp sẽ có hai hoặc nhiều Lượt xem và Trình bày.

Bạn sẽ thấy liên kết theo dõi về kiến ​​trúc VIPER http://mutualmobile.github.io/blog/2013/12/04/viper-int sinhtion /

Chuc bạn may măn!


1
Kiến trúc này có hoạt động cho các ứng dụng nhỏ không? Có vẻ như bạn phải tạo ra rất nhiều đối tượng để giới thiệu nó cho dự án.
Tomasz Bąk

vâng, tôi đồng ý rằng nó nhiều đối tượng hơn MVC truyền thống nhưng nó có giá trị. Bạn có thể thấy một ví dụ đơn giản mà tôi đã tạo trong năm nay github.com/orafaelreis/cascavel Cascavel giống như một dự án cơ sở để khởi tạo các dự án VIPER.
orafaelreis

Thông minh ! Kiến trúc VIPER dường như được thiết kế chính xác để tránh sự cố của bộ điều khiển xem lớn.
Barshe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.