Massive View Controller - IOS - โซลูชั่น


16

ฉันแน่ใจว่านักพัฒนา iOS ใหม่ทุกคนมีปัญหาดังต่อไปนี้: ตัวควบคุมมุมมองได้รับความแออัดอย่างรวดเร็วด้วยรหัสสำหรับวัตถุประสงค์ที่หลากหลายรับ 500 บรรทัดของรหัสได้อย่างง่ายดาย

นี่คือหน้าตาพื้นฐานและหน้าจอทั่วไปสองแบบ:

1) หน้าจอแบบฟอร์ม: ป้อนคำอธิบายรูปภาพที่นี่

2) หน้าจอควบคุมมุมมองตาราง ป้อนคำอธิบายรูปภาพที่นี่

จนถึงตอนนี้ฉันได้อ่านเกี่ยวกับโซลูชันที่แตกต่างกันสองวิธี:

  1. โซลูชั่นแรก: https://bendyworks.com/single-responsibility-principle-ios/ สิ่งนี้ยึดตามการแจ้งเตือนซึ่งแยกตัวควบคุมมุมมองออกจากตัวแบบมุมมอง (ความตั้งใจ) โดยสมบูรณ์และลดรหัสในตัวควบคุมมุมมอง ฉันคิดว่ามันมีข้อเสียของการทำลายโค้ดคล้ายกับโครงสร้างของ Go-To ดูเหมือนว่านี้: ป้อนคำอธิบายรูปภาพที่นี่

  2. โซลูชันที่สองช่วยให้ View Controller เป็นแออัดเหมือนเดิม (การทำงานของปุ่มจะถูกดำเนินการภายใน VC และอื่น ๆ ) แต่ใช้ไลบรารีเช่นTPKeyboardAvoiding , BlocksKit หรือโซลูชันอื่น ๆ ส่วนใหญ่อ้างอิงจากหมวดหมู่ ด้วยวิธีที่สองนี้รหัสจะลดลงอย่างมาก แต่ตัวควบคุมมุมมองยังคงมีความรับผิดชอบจำนวนมาก

คุณคิดอย่างไรเกี่ยวกับการแก้ปัญหาเหล่านี้? ไหนดีกว่ากัน มีดีกว่าไหม


5
ฉันไม่สามารถให้คำตอบที่ดีเพราะเวลา แต่นี้ควรจะชี้ให้คุณในทิศทางที่เหมาะสม
Mike D

ความตั้งใจของฉันคือการรวบรวมคำตอบที่ดีที่สุดเท่าที่จะทำได้เพื่อเอาชนะปัญหานี้ที่นักพัฒนาใหม่ ๆ ขอบคุณสำหรับลิงค์ถ้าฉันพบสิ่งใหม่ฉันจะโพสต์ที่นี่แน่นอน
Ravul

นี่คือการพูดคุยที่ดีเกี่ยวกับการต่อสู้กับตัวควบคุมไขมันโดย Andy Matuschak https://realm.io/news/andy-matuschak-refactor-mega-controller/
Tomasz Bąk

คำตอบ:


6

เราสามารถใช้ MVVM เพื่อแก้ไขปัญหานี้

Model-View-ViewModel หรือรูปแบบ MVVM ตามที่รู้จักกันทั่วไปคือรูปแบบการออกแบบ UI VM ให้ความสำคัญกับการเตรียมข้อมูลโมเดลสำหรับ UI จาก VC

ตัวอย่าง:
คุณมีโมเดลวัตถุที่มีบางฟิลด์คุณต้องการจัดรูปแบบบางส่วนทำการคำนวณและรวมเข้าด้วยกัน

ในกรณี MVC ตรรกะทั้งหมดที่อยู่ใน ViewController
ใน MVVM คุณย้ายทั้งหมดจาก VC เป็น VM

VM จะเตรียมข้อมูลทั้งหมดสำหรับ UI และ VC เพียงตั้งค่าเช่นนี้

(ในชั้นเรียน VC)

self.descriptionLabel = self.viewModel.textForDescriptionLabel;

บทช่วยสอนและหัวข้อ:


3
ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Bart van Ingen Schenau

ฉันเห็นด้วยกับบาร์ต หากไม่มีใครจะโพสต์สรุปของวิธีการเหล่านี้ทั้งหมดฉันจะทำทันทีที่ฉันเข้าใจและทดสอบพวกเขาทั้งหมด
Ravul

2
@Ravul อัปเดตคำตอบ
kaspartus

ฉันได้รับคำตอบแล้วและขอบคุณสำหรับความคิดนี้ ฉันแค่อ่านเกี่ยวกับฟังก์ชั่นการเขียนโปรแกรมปฏิกิริยาและดูเหมือนว่าความคิดที่ดี ฉันคิดว่าคำตอบสำหรับคำถามนี้คือการแจงนับโดยมีข้อดีข้อเสียและแผนภาพความคิดอย่างน้อยหนึ่งอย่างสำหรับสี่วิธีต่อไปนี้ในการเข้าถึงปัญหา: 1) ปฏิกิริยาโกโก้ 2) KVO 3) วิธีการมอบหมายและ 4) การเขียน View Controller ฉันจะเขียนทันทีที่ฉันทดสอบวิธีการเหล่านี้ทั้งหมดหากไม่มีใครทำอย่างนั้นก่อนฉัน หากในขณะเดียวกันฉันพบวิธีการใหม่ที่ดียิ่งขึ้น
Ravul

3

ฉันต้องแก้รหัสในตัวควบคุมมุมมองขนาดใหญ่ก่อนหน้านี้และมันขัดขวางความสามารถของฉันในการนำทางเนื้อหาในตอนแรก สิ่งสำคัญอย่างหนึ่งที่ฉันรู้คือขนาดเพียงอย่างเดียวของ View Controller นั้นไม่มีเหตุผลเพียงพอที่จะแยกสิ่งต่าง ๆ ออกจากกัน มีความซับซ้อนในการมี 1 ไฟล์ขนาดใหญ่และความซับซ้อนในการมีไฟล์จำนวนน้อย ต่อไปนี้เป็นเหตุผลที่ถูกต้องในการ refactor เพื่อแบ่ง View Controller ออกเป็นส่วนย่อย ๆ :

MVC

View Controller ไม่ควรทำอะไรมากไปกว่าการเป็นกาวเชื่อมต่อระหว่าง View และ Model หากคุณมีรหัสการเชื่อมต่อเครือข่ายจำนวนมากรหัสการจัดการภาพ ฯลฯ ให้พิจารณาแบ่งออกเป็นคลาสตัวช่วย

การควบคุมหลายอย่างด้วย View Controller เป็นแหล่งข้อมูล

หากคุณมีการควบคุมหลายอย่างบนหน้าจอที่มี View Controller เป็นแหล่งข้อมูลให้พิจารณาแบ่งสิ่งเหล่านั้นออกเป็นวัตถุแหล่งข้อมูลแยกต่างหาก หรือคุณสามารถแบ่งมันออกเป็นมุมมองแยกตัวควบคุม (เช่นถ้าคุณดูตัวควบคุมมีมุมมองตารางนอกเหนือจากตัวควบคุมอื่นคุณสามารถแบ่งสิ่งนั้นลงในคลาสตัวควบคุมมุมมองตารางของตัวเอง)

รหัสซ้ำ

หากคุณมีรหัสเดียวกันที่แน่นอนในตัวควบคุมมุมมองที่แตกต่างกันให้ใส่ไว้ใน 1 ตำแหน่งที่แชร์ ซึ่งจะทำให้โค้ดของคุณสามารถนำกลับมาใช้ใหม่และช่วยจัดการความซับซ้อน

นี่คือคำแนะนำเพิ่มเติมเพื่อลดความซับซ้อนของ View Controller:

กระดานเรื่องราวแทนที่จะเป็นแบบโปรแกรม

การสร้างองค์ประกอบ View เป็นรหัสจำนวนมากและรหัสเรขาคณิตของเฟรมก็มีผลงานมากมายเช่นกัน หากยังไม่ได้พิจารณาใช้ข้อ จำกัด เลย์เอาต์อัตโนมัติและวางองค์ประกอบ View ให้มากที่สุดในกระดานเรื่องราวให้มากที่สุด

รหัส / ความคิดเห็นที่ไม่จำเป็น

ตรวจสอบให้แน่ใจว่าได้ลบรหัส / ความคิดเห็นที่ไม่จำเป็นออกไป บ่อยครั้งที่ไฟล์ View Controller ใหม่จะมาพร้อมกับวิธีการที่คุณไม่ได้ใช้ หากคุณไม่ได้ใช้วิธีการเช่นdidReceiveMemoryWarningนั้นจะปลอดภัยที่จะนำออก นอกจากนี้เนื่องจากไฟล์ View Controller มีขนาดใหญ่มากบางครั้งมันน่ากลัวที่จะลบรหัสเก่าหรือความคิดเห็น อย่าเอาออก! มันเพิ่มความซับซ้อนเท่านั้น

การแจ้งเตือน

หากต้องการตอบคำถามของคุณเกี่ยวกับการแจ้งเตือน: การแจ้งเตือนไม่ใช่ Golden Hammer ที่จะใช้กับทุกสิ่ง ฉันพบว่าการแจ้งเตือนมีประโยชน์เมื่อ View Controller หลายรายการจำเป็นต้องอัปเดตพร้อมกันเนื่องจากมีการกระทำ 1 รายการ ระวังด้วยการแจ้งเตือนแม้ว่าการใช้งานมากเกินไปอาจทำให้คุณเจ็บปวดมากในการติดตามพวกเขา


2

มีสถาปัตยกรรมพิเศษที่เรียกว่า VIPER (มุมมอง, ผู้โต้ตอบ, ผู้นำเสนอ, เอนทิตีและการกำหนดเส้นทาง) ฉันจะลองทำต่อที่นี่สิ่งที่คุณต้องรู้:

ดู

  • พวกเขามีมุมมองที่หลอกตา;
  • มีวัตถุเช่น UIView, UIViewController, UILabel ฯลฯ
  • รอเนื้อหาจากผู้นำเสนอ ;
  • จัดการการโต้ตอบของผู้ใช้และส่งผ่านไปยังผู้นำเสนอเลเยอร์

พรีเซนเตอร์

  • ไม่รู้จักวัตถุ UI;
  • รับอินพุตจากView layer;
  • จัดการกับตรรกะมุมมอง (เพิ่มวิธีการจะนำเสนอหน้าจออื่น ๆ );

เส้นทาง

  • จัดการกับตรรกะการนำทางและภาพเคลื่อนไหวการเปลี่ยนแปลง
  • รู้ว่าวัตถุเช่น UINavigationController, UIWindow และอื่น ๆ ;

ดังนั้นสิ่งที่ฉันคิดว่าคุณจะทำความสะอาดในรหัสของคุณ:

  • การตรวจสอบข้อมูลจะย้ายไปที่เลเยอร์ผู้นำเสนอ ;

  • การนำทางจะย้ายไปยังวัตถุ Wireframe ( ชั้นการกำหนดเส้นทาง );

  • แยกมุมมองการควบคุมของคุณสังเกตหลักการแห้ง ;

  • หน้าจอที่ซับซ้อนจะมีจำนวนการดูและผู้นำเสนอสองคนขึ้นไป

คุณจะเห็นลิงค์ติดตามเกี่ยวกับสถาปัตยกรรม VIPER http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

โชคดีมาก!


1
สถาปัตยกรรมนี้ใช้งานได้กับแอปพลิเคชันขนาดเล็กหรือไม่ ดูเหมือนว่าคุณจะต้องสร้างวัตถุจำนวนมากเพื่อแนะนำให้กับโครงการ
Tomasz Bąk

ใช่ฉันเห็นด้วยว่ามันเป็นวัตถุมากกว่า MVC แบบดั้งเดิม แต่ก็คุ้มค่า คุณสามารถเห็นตัวอย่างง่าย ๆ ที่ฉันสร้างขึ้นในปีนี้github.com/orafaelreis/cascavel Cascavel เป็นเหมือนโครงการพื้นฐานเพื่อเริ่มต้นโครงการ VIPER
orafaelreis

ยอดเยี่ยม! ดูเหมือนว่าโครงสร้างของ VIPER นั้นออกแบบมาเพื่อหลีกเลี่ยงปัญหาของคอนโทรลเลอร์ขนาดใหญ่
Christophe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.