Android - เหตุใดการใช้อินเทอร์เฟซจึงถือเป็นแนวทางปฏิบัติที่ดีที่สุดในการสื่อสารระหว่างกิจกรรมและแฟรกเมนต์

ในเอกสารนี้"การสื่อสารกับส่วนอื่นๆ" Google แจ้งให้เราทราบว่า แนวทางปฏิบัติที่ดีที่สุดในการสื่อสารกิจกรรมและแฟรกเมนต์คือใช้งานอินเทอร์เฟซ อินเทอร์เฟซนี้สามารถเรียกโดย Fragment และดำเนินการพฤติกรรมที่จำเป็นในกิจกรรม

แต่ยังมีวิธีแฮ็กในการทำเช่นนี้ รับ Activity โดยตรงด้วยเมธอด "getActivity()" จากนั้นเราสามารถใช้ "public method" ทั้งหมดข้างใต้ได้

สิ่งนี้ทำให้ฉันสับสนมาก เพราะฉันไม่สามารถคิดถึงข้อเสียที่สำคัญของการใช้วิธีการแฮ็กเพื่อทำสิ่งนี้ได้

ข้อดีของแนวทางแรกที่เกิดขึ้นในหัวของฉันคือ:

  1. ฉันสามารถจำกัด "การเข้าถึงทรัพยากร" ไว้ใต้กิจกรรมของฉันได้ แต่เนื่องจาก Fragment สามารถเรียก "getActivity()" ได้ จึงสามารถเข้าถึงเมธอด "public" ทั้งหมดในนั้นได้ ดังนั้นนี่จึงไม่สามารถโน้มน้าวใจฉันได้จริงๆ
  2. อ่านและเล่าเรื่องได้มากขึ้นในโค้ด ด้วยแนวทางแรก โค้ดบอกเราว่า "กิจกรรมนี้เปิดเฉพาะพื้นที่ที่เข้าถึงได้เฉพาะเหล่านี้สำหรับ Fragment" เราสามารถรู้ได้ว่า "สิ่งที่อยู่ภายใน Fragment อาจรบกวนกิจกรรม" ได้โดยตรง เพียงแค่ดูโค้ดในกิจกรรม ไม่เช่นนั้น เราจะต้องเปิดโค้ดใต้ Fragment เพื่อดูว่ามันทำอะไร

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


person KunYu Tsai    schedule 09.03.2015    source แหล่งที่มา
comment
@QuentinTsai: คุณเห็นคำตอบของฉันไหม?   -  person Y.S    schedule 15.03.2015
comment
@ZygoteInit ใช่แล้ว! ขอโทษที่ฉันตอบช้า ฉันป่วยมาก่อน ฉันได้อ่านคำตอบของคุณทั้งหมดแล้ว มันมีประโยชน์มาก แต่ขออภัยที่ฉันอาจจะให้คำตอบที่ถูกต้องกับ Reinier เพราะสำหรับฉัน มันทำให้ฉันนึกถึงสิ่งที่ฉันไม่เคยสังเกตมาก่อนจริงๆ ขอบคุณทุกคน !!   -  person KunYu Tsai    schedule 19.03.2015


คำตอบ (3)


เหนือสิ่งอื่นใด ข้อได้เปรียบหลักคือความเป็นโมดูลของโค้ดของคุณ เมื่อคุณเรียกคลาส "พาเรนต์" โดยตรงจากคลาส "ลูก" คุณจะสร้าง การพึ่งพาแบบวนรอบ . ซึ่งหมายความว่าคุณไม่สามารถแทนที่อันหนึ่งได้โดยไม่เปลี่ยนอันอื่นอย่างมีประสิทธิภาพ แนวทางนี้มักส่งผลให้เกิดสปาเก็ตตี้โค้ดที่ยากต่อการบำรุงรักษา ขยายได้ยากยิ่งขึ้น และแทบจะเป็นไปไม่ได้เลยที่จะแทนที่หากไม่มีความพยายามในการปรับโครงสร้างใหม่ครั้งใหญ่

สำหรับตัวอย่างของคุณ: หากคุณเรียกใช้วิธีการสาธารณะของ Activity ของคุณโดยตรงจาก Fragment คุณจะไม่สามารถใช้ Fragment ของคุณซ้ำในกิจกรรมอื่น ๆ ได้โดยไม่ต้องใช้วิธีแก้ปัญหาแบบแฮ็ก (เช่น if(getActivity() instanceof A) {...} else {...}) และคุณไม่สามารถสลับกิจกรรมของคุณเป็น เช่น. คลาสคอนโทรลเลอร์หรือโซลูชันอื่นใดที่คุณคิดขึ้นมา

หากคุณมีปัญหาในการทำความเข้าใจเรื่องนี้ ฉันขอแนะนำให้คุณอ่านหนังสือ จาวาที่มีประสิทธิภาพ

person Reinier    schedule 09.03.2015

ไม่มี "ข้อได้เปรียบ" ใดๆ ในแนวทางนี้ นอกเหนือจากนั้น

  • มันเป็นสำนวนที่เป็นที่รู้จัก การใช้อินเทอร์เฟซเป็นวิธีทั่วไปที่ทั้งสองคลาสสื่อสารระหว่างกันใน Java
  • รหัสเดียวกันสามารถนำมาใช้ซ้ำได้ใน Fragments & Activitys ที่แตกต่างกันมากมาย
  • มันเป็นไปตามหลักการทั่วไปของการแยกส่วนและนามธรรม โดยที่ Fragment "บอก" Activity ว่าถึงสถานะหนึ่งแล้ว และ Activity กำหนดพฤติกรรมของตัวเองที่เกี่ยวข้องกับสถานะนี้
person Y.S    schedule 09.03.2015
comment
ฉันคิดว่าอันที่สองควรเป็น The fragment เดียวกันสามารถใช้ได้จาก activities มากกว่า (ซึ่งอาจทำได้หลังจาก getActivity() แต่ด้วยอินสแตนซ์ของการตรวจสอบและการร่ายที่ตามมา...) - person DNax; 09.03.2015
comment
@ZygoteInit ทำไปแล้ว!! ตามที่คุณให้คำตอบนี้! ฉันโหวตทันที! ขอบคุณ : ) !! - person KunYu Tsai; 19.03.2015

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

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

ดังนั้นในกรณีของคุณ Activity และ Fragment ควรถือเป็นสององค์ประกอบที่แยกจากกัน และแต่ละองค์ประกอบไม่ทราบรายละเอียดเกี่ยวกับอีกองค์ประกอบหนึ่ง และนี่คืออินเทอร์เฟซ Java ขึ้นมา

person frogatto    schedule 10.03.2015