Làm thế nào để giải thích tiêm phụ thuộc cho một đứa trẻ 5 tuổi? [đóng cửa]


208

Một cách tốt để giải thích tiêm phụ thuộc là gì?

Tôi đã tìm thấy một số hướng dẫn trên Google, nhưng không ai trong số họ cho rằng người đọc chỉ là người mới bắt đầu Java. Làm thế nào bạn sẽ giải thích điều này với một người mới?


72
Âm thanh như đứa trẻ đó cho một cuộc sống khó khăn ...
ire_and_curses

24
Bắt đầu với "Ngày xửa ngày xưa ....."
Martin

1
Chúng ta đang nói về một người mới bắt đầu Java hoặc một đứa trẻ năm tuổi theo nghĩa đen?
vẽ

2
# Tiêm phụ thuộc # don 'tùy thuộc vào độ tuổi của người học, Điều này cũng tương tự đối với mỗi người
Rakesh Juyal

2
Rakesh: Video giới thiệu JavaOne 2009 được xây dựng dựa trên tiền đề rằng thậm chí 13 năm có thể là nhà phát triển Java vì Java "ở mọi nơi" và "dễ dàng".
Esko

Câu trả lời:


789

Tôi cung cấp cho bạn tiêm phụ thuộc cho trẻ năm tuổi.

Khi bạn đi và lấy đồ ra khỏi tủ lạnh cho chính mình, bạn có thể gây ra vấn đề. Bạn có thể để cánh cửa mở, bạn có thể nhận được một cái gì đó Mẹ hoặc bố không muốn bạn có. Bạn thậm chí có thể đang tìm kiếm thứ gì đó chúng tôi thậm chí không có hoặc đã hết hạn.

Những gì bạn nên làm là nêu rõ một nhu cầu, "Tôi cần uống gì đó vào bữa trưa", và sau đó chúng tôi sẽ đảm bảo bạn có thứ gì đó khi bạn ngồi xuống ăn.


93

Cái này thì sao?

Nếu bạn có một lớp Employeevà nhân viên này có một lớp , Address bạn có thể có Employeelớp được định nghĩa như sau:

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;
    }
}

Mọi thứ có vẻ tốt cho đến nay.

Mã này cho thấy mối quan hệ HAS-A giữa nhân viên và địa chỉ của anh ta, điều đó tốt.

Bây giờ, mối quan hệ HAS-A này đã tạo ra sự phụ thuộc giữa họ. Vấn đề xuất hiện trong hàm tạo.

Mỗi lần bạn muốn tạo một Employeecá thể, bạn cần một Addresscá thể:

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

Làm việc theo cách này trở nên có vấn đề đặc biệt là khi bạn muốn thực hiện kiểm tra đơn vị.

Vấn đề chính xuất hiện khi bạn cần kiểm tra một đối tượng cụ thể, bạn cần tạo một thể hiện của đối tượng khác và rất có thể bạn cần tạo một thể hiện của đối tượng khác để thực hiện điều đó. Chuỗi có thể trở nên không thể quản lý.

Để tránh điều này, bạn có thể thay đổi hàm tạo như thế này:

  public Employee(){
  }

Sử dụng một hàm tạo không có đối số.

Sau đó, bạn có thể đặt địa chỉ khi nào bạn muốn:

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

Bây giờ, đây có thể là một lực cản, nếu bạn có một vài thuộc tính hoặc nếu các đối tượng khó tạo.

Tuy nhiên, hãy nghĩ về điều này, giả sử, bạn thêm Departmentthuộc tính:

  class Employee {
      private Address address;
      private Department department;

  ....

Nếu bạn có 300 nhân viên, và tất cả trong số họ cần phải có cùng một bộ phận, và cộng với bộ phận đó phải được chia sẻ giữa một số đối tượng khác (như danh sách các phòng ban của công ty, hoặc vai trò của từng bộ phận, v.v.) có một thời gian khó khăn với khả năng hiển thị của Departmentđối tượng và chia sẻ nó thông qua tất cả các mạng của các đối tượng.

Những gì mà Dependency Injection là tất cả về nó để giúp bạn, "tiêm" những phụ thuộc này vào mã của bạn. Hầu hết các khung cho phép bạn thực hiện điều này bằng cách chỉ định trong một tệp bên ngoài, đối tượng nào sẽ được chèn.

Giả sử một tệp thuộc tính cho một người tiêm phụ thuộc hư cấu:

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

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

Bạn sẽ xác định những gì cần tiêm cho một kịch bản nhất định.

Những gì khung công tác phụ thuộc sẽ làm là đặt các đối tượng chính xác cho bạn, do đó bạn không phải viết mã setAddresshoặc setDepartment. Điều này sẽ được thực hiện bằng cách phản chiếu hoặc bằng cách tạo mã hoặc các kỹ thuật khác.

Vì vậy, lần tới khi bạn cần kiểm tra Employeelớp, bạn có thể tiêm giả AddressDepartmentsđối tượng mà không phải mã tất cả các tập hợp / nhận cho tất cả bài kiểm tra của mình. Thậm chí tốt hơn, bạn có thể tiêm thực tế AddressDepartmentcác đối tượng vào mã sản xuất, và vẫn có sự tự tin rằng mã của bạn hoạt động như được thử nghiệm.

Đó là khá nhiều về nó.

Tuy nhiên, tôi không nghĩ rằng lời giải thích này phù hợp với trẻ 5 tuổi như bạn yêu cầu.

Tôi hy vọng bạn vẫn thấy nó hữu ích.


3
Hoặc: Tiêm phụ thuộc là khi bạn có thứ gì đó đặt phụ thuộc cho bạn. Điều này thường là một khuôn khổ. :)
OscarRyz

2
một người rất thông minh thực sự.
OscarRyz

24

Khi viết một lớp, việc sử dụng các đối tượng khác là điều tự nhiên. Bạn có thể có một kết nối cơ sở dữ liệu, ví dụ, hoặc một số dịch vụ khác mà bạn sử dụng. Những đối tượng khác (hoặc dịch vụ) là phụ thuộc. Cách đơn giản nhất để viết mã chỉ đơn giản là tạo và sử dụng các đối tượng khác. Nhưng điều này có nghĩa là đối tượng của bạn có mối quan hệ không linh hoạt với các phụ thuộc đó: bất kể tại sao bạn gọi đối tượng của mình, nó sử dụng cùng các phụ thuộc.

Một kỹ thuật mạnh mẽ hơn là có thể tạo đối tượng của bạn và cung cấp cho nó các phụ thuộc để sử dụng. Vì vậy, bạn có thể tạo một kết nối cơ sở dữ liệu để sử dụng, sau đó đưa nó cho đối tượng của bạn. Bằng cách này, bạn có thể tạo đối tượng của mình với các phụ thuộc khác nhau vào các thời điểm khác nhau, làm cho đối tượng của bạn linh hoạt hơn. Đây là tiêm phụ thuộc, trong đó bạn "tiêm" các phụ thuộc vào đối tượng.

BTW: Trong phong cách trình bày hiện đại sử dụng ảnh flickr để minh họa các khái niệm, điều này có thể được minh họa với một người nghiện tự bắn mình bằng ma túy. Oh, đợi đã, đó là sự phụ thuộc tiêm ... OK, xin lỗi, dở khóc dở cười.


10

Tôi không biết bất kỳ hướng dẫn đơn giản hóa nào, nhưng tôi có thể cung cấp cho bạn gần 25 phiên bản 250 từ hoặc ít hơn:

Với việc tiêm phụ thuộc, một đối tượng không cấu hình các thành phần của chính nó dựa trên những điều nó đã biết, thay vào đó, đối tượng được cấu hình bằng logic mức cao hơn, và sau đó nó gọi các thành phần mà nó không có sẵn. Ý tưởng là làm cho đối tượng nhiều thành phần hơn và ít ứng dụng hơn, di chuyển các tác vụ cấu hình ở mức cao hơn. Điều này làm cho đối tượng có nhiều khả năng hữu ích trong tương lai hoặc với một cấu hình khác.

Tốt hơn để thử nghiệm, sẽ tốt hơn khi đến lúc sửa lại ứng dụng. Một triển khai điển hình đặt cấu hình trong XML và sử dụng khung để tải động các lớp.


7

Khi bạn được tặng một Nintendo mới, bạn chỉ cần sử dụng các nút và màn hình cảm ứng để chơi game.

Nhưng tại nhà máy của Nintendo, họ cần biết cách kết hợp chúng lại với nhau.

Khi những người thông minh tại nhà máy đưa ra Nintendo DS, nó sẽ khác bên trong, nhưng bạn vẫn sẽ biết cách sử dụng nó.


5
Điều này nghe có vẻ giống như một mô tả về giao diện hoặc đa hình, nhưng tôi cho bạn biết rằng thực sự dễ hiểu cho một đứa trẻ 5 tuổi.
Natix
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.