จะอธิบายการฉีดเข้าสู่ 5 ปีได้อย่างไร? [ปิด]


208

เป็นวิธีที่ดีในการอธิบายการฉีดพึ่งพาอะไร

ฉันพบบทเรียนหลายอย่างใน Google แต่ไม่มีใครคิดว่าผู้อ่านเป็นเพียงผู้เริ่มต้นจาวา คุณจะอธิบายสิ่งนี้กับสามเณรได้อย่างไร


72
เสียงเหมือนที่เด็กในชีวิตที่ยาก ...
ire_and_curses

24
เริ่มต้นด้วย "กาลครั้งหนึ่งนานมาแล้ว ..... "
Martin

1
พวกเรากำลังพูดถึงผู้เริ่มต้น Java หรืออายุห้าปีที่แท้จริงหรือไม่?
Drew

2
# พึ่งพาการฉีด # Don' ขึ้นอยู่กับอายุของผู้เรียนมันเป็นเหมือนกันสำหรับทุกคน
Rakesh Juyal

2
Rakesh: วิดีโอแนะนำ JavaOne 2009 ถูกสร้างขึ้นบนพื้นฐานที่ว่าแม้กระทั่ง 13 ปีก็สามารถเป็นผู้พัฒนา Java ได้เพราะ Java เป็น "ทุกที่" และ "ง่าย"
Esko

คำตอบ:


789

ฉันให้การฉีดยาแก่คุณสำหรับเด็กอายุห้าขวบ

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

สิ่งที่คุณควรทำคือการระบุความต้องการ "ฉันต้องการบางอย่างที่จะดื่มด้วยอาหารกลางวัน" แล้วเราจะทำให้แน่ใจว่าคุณมีบางอย่างเมื่อคุณนั่งลงกิน


93

แล้วเรื่องนี้ล่ะ

หากคุณมีคลาสEmployeeและพนักงานนี้มีคลาสที่Address คุณสามารถEmployeeกำหนดคลาสไว้ดังต่อไปนี้:

class Employee {
    private Address address;

    // constructor 
    public Employee( Address newAddress ) {
        this.address = newAddress;
    }

    public Address getAddress() {
    return this.address;
    }
    public void setAddress( Address newAddress ) {
        this.address = newAddress;
    }
}

ทุกอย่างดูดีจนถึงตอนนี้

รหัสนี้แสดงความสัมพันธ์HAS-Aระหว่างพนักงานและที่อยู่ของเขาซึ่งก็ดี

ตอนนี้ความสัมพันธ์HAS-A นี้สร้างการพึ่งพาระหว่างกัน ปัญหาเกิดขึ้นภายในตัวสร้าง

ทุกครั้งที่คุณต้องการสร้างEmployeeอินสแตนซ์ที่คุณต้องการAddressอินสแตนซ์:

 Address someAddress = ....
 Employee oscar = new Employee( someAddress ); 

การทำงานด้วยวิธีนี้จะเป็นปัญหาโดยเฉพาะอย่างยิ่ง เมื่อคุณต้องการทำการทดสอบหน่วย

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

เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถเปลี่ยนนวกรรมิกได้ดังนี้

  public Employee(){
  }

ใช้ตัวสร้าง args ไม่

จากนั้นคุณสามารถตั้งค่าที่อยู่ได้ตลอดเวลาที่คุณต้องการ:

 Address someAddress = ....
 Employee oscar = new Employee();
 oscar.setAddress( someAddress ); 

ตอนนี้อาจเป็นการลากหากคุณมีคุณสมบัติหลายอย่างหรือหากวัตถุนั้นสร้างยาก

แต่ลองคิดดูสิคุณเพิ่มDepartmentคุณสมบัติ:

  class Employee {
      private Address address;
      private Department department;

  ....

หากคุณมีพนักงาน 300 คนและทุกคนต้องมีแผนกเดียวกันและต้องมีแผนกเดียวกันนั้นร่วมกันระหว่างวัตถุอื่น ๆ (เช่นรายชื่อ บริษัท แผนกหรือบทบาทที่แต่ละแผนกมี ฯลฯ ) คุณจะต้อง มีช่วงเวลาที่ยากลำบากในการมองเห็นDepartmentวัตถุและแบ่งปันผ่านเครือข่ายทั้งหมดของวัตถุ

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

สมมติว่าไฟล์คุณสมบัติสำหรับหัวฉีดพึ่งพาการอ้างอิง:

  #mock employee
  employee.address = MockAddress.class
  employee.department = MockDepartment.class

  #production setup 
  employee.address = RealAddress.class
  employee.department = RealDepartment.class

คุณจะกำหนดสิ่งที่จะฉีดสำหรับสถานการณ์ที่กำหนด

สิ่งที่กรอบการพึ่งพาการฉีดจะทำคือการกำหนดวัตถุที่ถูกต้องสำหรับคุณเพื่อให้คุณไม่ต้องรหัสหรือsetAddress setDepartmentสิ่งนี้จะทำโดยการไตร่ตรองหรือโดยการสร้างรหัสหรือเทคนิคอื่น ๆ

ดังนั้นในครั้งต่อไปที่คุณต้องทดสอบEmployeeชั้นเรียนคุณอาจฉีดจำลองAddressและDepartmentsวัตถุโดยไม่ต้องเขียนรหัสชุดทั้งหมด / รับสำหรับการทดสอบทั้งหมดของคุณ ยิ่งไปกว่านั้นคุณสามารถฉีดของจริง AddressและDepartmentวัตถุในรหัสการผลิตและยังมีความมั่นใจว่ารหัสของคุณทำงานตามการทดสอบ

มันเกี่ยวกับมันมาก

ยังฉันไม่คิดว่าคำอธิบายนี้เหมาะสำหรับอายุ 5 ปีตามที่คุณร้องขอ

ฉันหวังว่าคุณจะยังคงมีประโยชน์


3
หรือ: การฉีดพึ่งพาเมื่อคุณมีบางสิ่งบางอย่างที่ตั้งค่าการพึ่งพาสำหรับคุณ สิ่งนี้มักจะเป็นกรอบ :)
OscarRyz

2
อันชาญฉลาดอย่างแน่นอน
OscarRyz

24

เมื่อเขียนคลาสเป็นเรื่องปกติที่จะใช้ประโยชน์จากวัตถุอื่น คุณอาจมีการเชื่อมต่อฐานข้อมูลตัวอย่างหรือบริการอื่น ๆ ที่คุณใช้ วัตถุอื่น (หรือบริการ) เหล่านี้เป็นการอ้างอิง วิธีที่ง่ายที่สุดในการเขียนรหัสคือการสร้างและใช้วัตถุอื่น ๆ แต่นี่หมายความว่าวัตถุของคุณมีความสัมพันธ์ที่ยืดหยุ่นกับการพึ่งพาเหล่านั้น: ไม่ว่าคุณจะเรียกใช้วัตถุของคุณอย่างไรมันก็ใช้การพึ่งพาเหมือนกัน

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

BTW: ในรูปแบบการนำเสนอที่ทันสมัยของการใช้ภาพถ่าย Flickr เพื่อแสดงให้เห็นถึงแนวคิดนี้อาจแสดงให้เห็นว่ามีคนติดยาเสพติดยิงตัวเองขึ้นมาด้วยยาเสพติด โอ้เดี๋ยวก่อนนั่นมันต้องพึ่งพาการฉีด ... โอเคขอโทษตลกไม่ดี


10

ฉันไม่รู้บทเรียนที่ง่าย แต่ฉันสามารถให้คุณเกือบ25 250 คำ - หรือ - รุ่นน้อย:

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

มันจะดีกว่าสำหรับการทดสอบมันจะดีกว่าเมื่อถึงเวลาที่ต้องแก้ไขแอปพลิเคชัน การใช้งานทั่วไปทำให้การกำหนดค่าใน XML และใช้กรอบการทำงานเพื่อโหลดคลาสแบบไดนามิก


7

เมื่อคุณได้รับ Nintendo ใหม่คุณสามารถใช้ปุ่มและหน้าจอสัมผัสเพื่อเล่นเกมได้

แต่ที่โรงงาน Nintendo พวกเขาจำเป็นต้องรู้วิธีการรวมเข้าด้วยกัน

เมื่อคนฉลาดที่โรงงานนำ Nintendo DS ออกมามันจะแตกต่างกัน แต่คุณจะรู้วิธีใช้งาน


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