2010-06-25 26 views
7

Tôi đã đọc Java hiệu quả và tôi có một số lo ngại về mục đầu tiên "sử dụng phương pháp nhà máy tĩnh" thay vì xây dựng "liên quan đến TDD và tiêm phụ thuộc.Ứng dụng Java mục 1 hiệu quả với TDD và tiêm phụ thuộc

Mục nói rằng bạn nên tránh sử dụng công cụ xây dựng công cộng/được bảo vệ/mặc định và để lộ bằng cách sử dụng nhà máy tĩnh. Tôi đồng ý với tất cả các ưu điểm liên quan đến việc sử dụng các nhà máy tĩnh như các nhà máy có thể có tên, bạn có thể trả lại loại phụ, bạn có thể giảm độ chi tiết ... Nhưng, tôi suy nghĩ trong bất lợi Joshua bỏ qua TDD vì có nhà máy tĩnh trong mã của bạn sẽ dẫn đến khớp nối chặt chẽ và bạn không thể chế nhạo lớp bằng cách sử dụng nó. Chúng tôi sẽ không thể giả lập lớp học sẽ có nhà máy tĩnh. Vì vậy, nó cản trở phát triển theo hướng thử nghiệm.

Điểm thứ hai, tôi nghĩ rằng anh ấy đã bỏ lỡ việc phát triển doanh nghiệp ngày nay hầu hết các ứng dụng sử dụng một hoặc một vùng chứa phụ thuộc khác. Vì vậy, khi chúng ta có thể tiêm phụ thuộc bằng cách sử dụng DI vậy tại sao tôi nên sử dụng nó.

Vui lòng giải thích cách áp dụng cho phát triển doanh nghiệp Java ngày nay bao gồm DI và TDD.

Trả lời

3

tôi thấy 2 vấn đề riêng biệt ở đây:

  • nhà máy tĩnh vs sử dụng mới()
  • dependency injection

Khi sử dụng mới mã của bạn là giống như chặt chẽ cùng như sử dụng một phương pháp tĩnh , thậm chí còn tồi tệ hơn kể từ khi nhà máy tĩnh có thể thực hiện một số phép thuật và trả về một số triển khai cụ thể miễn là nó là một phân lớp hoặc thực hiện một giao diện.

Với tiêm phụ thuộc nguyên tắc cũng được gọi là Nguyên tắc của Hollywood: "Không gọi cho chúng tôi, chúng tôi sẽ gọi cho bạn". Vì vậy, trong đó philosphy bạn không nên gọi mới() hoặc nhà máy tĩnh trong mã của bạn, nhưng có một điều bên ngoài làm điều đó cho bạn, hoặc khuôn khổ DI hoặc thử nghiệm đơn vị. Điều này không liên quan gì đến các nhà máy hoặc việc sử dụng mới, vì điều đó được thực hiện ở một nơi khác.

Trong trường hợp đó, các nhà máy tốt hơn vì bạn có thể tiêm nhà máy thử nghiệm dưới sự kiểm soát của bạn. Với điều này mới là không thể (mà không làm những điều kỳ lạ để classpath như ẩn việc thực hiện với các đối tượng giả trong classpath thử nghiệm, mà tôi không khuyên bạn nên btw).

4

Động cơ DI nhà máy.

Joshua Bloch hiểu DI đủ tốt. Tôi nghĩ đây là một hiện vật lịch sử, bởi vì sự phát triển của DI xuất hiện sau phiên bản đầu tiên của "Java hiệu quả".

"Java hiệu dụng" là published in 2001. Martin Fowler đặt ra thuật ngữ này vào năm 2004. Spring's 1.0 release xuất hiện vào tháng 3 năm 2004.

Joshua Bloch không sửa đổi chương đó cho ấn bản thứ hai.

Điểm là khớp nối mà "mới" giới thiệu. Bất cứ ai hiểu điều đó và các nhà máy sẽ dễ dàng thực hiện bước nhảy vọt cho động cơ DI. Vấn đề là tuyên bố của ông về "mới", và biện pháp khắc phục của việc sử dụng các nhà máy, vẫn là sự thật.

+0

Tôi không nghĩ bạn nhận được câu hỏi của mình. Câu hỏi không phải là chúng ta mới giới thiệu khớp nối và chúng ta nên sử dụng các nhà máy tĩnh. Về khả năng ứng dụng của nó trong phát triển doanh nghiệp ngày nay. Tôi không nói Joshua Bloch không biết DI. Vui lòng trả lời những gì tôi yêu cầu trong câu hỏi của tôi. Ấn bản thứ hai được xuất bản tháng 5 năm 2008 – Shekhar

+0

Tôi biết khi ấn bản thứ hai được xuất bản. Tôi nói rằng anh ta không cập nhật chương đó một cách đơn giản. Và "bất lợi Joshua nhớ TDD" khiến tôi kết luận rằng bạn đang nói Bloch không biết DI. – duffymo

0

Tôi có cùng mối quan tâm với bạn và đó là cách tôi đã tìm thấy câu hỏi của bạn.

Bạn nói:

vì có nhà máy tĩnh trong mã của bạn sẽ dẫn đến chặt chẽ khớp nối và bạn không thể thử các lớp sử dụng nó

cuốn sách gợi ý rằng bạn nên phơi bày sự constructor của lớp của bạn với một phương thức tĩnh (thiết kế api). Nó không đề nghị bạn "hardcode" cuộc gọi tĩnh trên tất cả ứng dụng của bạn (sử dụng api).

Giả sử bạn đang sử dụng Guice cho DI, và giao diện của bạn được gọi Connection, bạn có thể làm:

bind(Connection.class).toInstance(Connections.makeASpecificConnection(params)); 

Và sau đó bạn thường @Inject Connection connection;

Tất nhiên điều này là nếu kết nối của bạn là một Singleton. Nếu không, bạn có thể tiêm một Nhà máy Trừu tượng với triển khai tạo ra các cá thể gọi phương thức tĩnh của lớp của bạn, nhưng điều này có thể là quá mức cần thiết và bạn chỉ nên sử dụng Guice một cách tốt hơn.

Hãy nhớ rằng cuốn sách này không được nhắm mục tiêu chủ yếu vào việc xây dựng các ứng dụng doanh nghiệp lớn, mặc dù nó vẫn rất hữu ích. Trích từ lời nói đầu của cuốn sách:

Trong khi cuốn sách này không phải là mục tiêu duy nhất là các nhà phát triển của thể tái sử dụng thành phần, nó được chắc chắn màu bởi kinh nghiệm của tôi viết thành phần như vậy trong hai thập kỷ qua. Tôi tự nhiên nghĩ về các API xuất khẩu (Giao diện lập trình ứng dụng) , và tôi khuyến khích bạn cũng làm như vậy.

Các vấn đề liên quan