Vấn đề cơ bản tương tự bạn thường gặp phải với lập trình hướng đối tượng, quy tắc phong cách và mọi thứ khác. Trên thực tế, điều đó là có thể - rất phổ biến - thực hiện quá nhiều sự trừu tượng hóa và thêm quá nhiều sự gián tiếp, và nói chung là áp dụng các kỹ thuật tốt quá mức và ở những vị trí sai.
Mỗi mô hình hoặc cấu trúc khác mà bạn áp dụng đều mang lại sự phức tạp. Trừu tượng và phân tán thông tin phân tán xung quanh, đôi khi di chuyển chi tiết không liên quan ra khỏi đường đi, nhưng đôi khi cũng làm cho khó hiểu chính xác những gì đang xảy ra. Mỗi quy tắc bạn áp dụng đều mang lại sự không linh hoạt, loại trừ các tùy chọn có thể là phương pháp tốt nhất.
Vấn đề là viết mã thực hiện công việc và mạnh mẽ, dễ đọc và duy trì. Bạn là một nhà phát triển phần mềm - không phải là người xây dựng tháp ngà.
Liên kết có liên quan
http://thed Dailywtf.com/Articles/The_Inner-Plevelop_Effect.aspx
http://www.joelonsoftware.com/articles/fog0000000018.html
Có lẽ hình thức tiêm phụ thuộc đơn giản nhất (không cười) là một tham số. Mã phụ thuộc phụ thuộc vào dữ liệu và dữ liệu đó được đưa vào bằng phương tiện truyền tham số.
Vâng, thật ngớ ngẩn và nó không đề cập đến điểm tiêm phụ thuộc hướng đối tượng, nhưng một lập trình viên chức năng sẽ cho bạn biết rằng (nếu bạn có chức năng hạng nhất) thì đây là loại tiêm phụ thuộc duy nhất bạn cần. Vấn đề ở đây là lấy một ví dụ tầm thường, và chỉ ra những vấn đề tiềm ẩn.
Hãy thực hiện chức năng truyền thống đơn giản này - cú pháp C ++ không có ý nghĩa ở đây, nhưng tôi phải đánh vần nó bằng cách nào đó ...
void Say_Hello_World ()
{
std::cout << "Hello World" << std::endl;
}
Tôi có một phụ thuộc mà tôi muốn trích xuất và tiêm - văn bản "Hello World". Vừa đủ dễ...
void Say_Something (const char *p_text)
{
std::cout << p_text << std::endl;
}
Làm thế nào là không linh hoạt hơn so với bản gốc? Chà, nếu tôi quyết định rằng đầu ra sẽ là unicode. Tôi có lẽ muốn chuyển từ std :: cout sang std :: wcout. Nhưng điều đó có nghĩa là các chuỗi của tôi sau đó phải là của wchar_t, không phải của char. Mỗi người gọi phải được thay đổi, hoặc (hợp lý hơn), việc triển khai cũ được thay thế bằng một bộ chuyển đổi dịch chuỗi và gọi thực hiện mới.
Đó là công việc bảo trì ngay tại đó sẽ không cần thiết nếu chúng ta giữ nguyên bản gốc.
Và nếu nó có vẻ tầm thường, hãy xem chức năng trong thế giới thực này từ API Win32 ...
http://msdn.microsoft.com/en-us/l Library / ms632680% 28v = vs85% 29.aspx
Đó là 12 "sự phụ thuộc" để giải quyết. Ví dụ: nếu độ phân giải màn hình thực sự lớn, có thể chúng ta sẽ cần các giá trị phối hợp 64 bit - và một phiên bản khác của CreatWindowEx. Và đúng vậy, đã có một phiên bản cũ hơn vẫn còn tồn tại, có lẽ được ánh xạ tới phiên bản mới hơn đằng sau hậu trường ...
http://msdn.microsoft.com/en-us/l Library / ms632679% 28v = vs85% 29.aspx
Những "phụ thuộc" đó không chỉ là vấn đề đối với nhà phát triển ban đầu - mọi người sử dụng giao diện đó phải tìm kiếm các phụ thuộc là gì, chúng được chỉ định như thế nào và ý nghĩa của chúng và tìm ra cách làm cho ứng dụng của chúng. Đây là nơi mà các từ "mặc định hợp lý" có thể làm cho cuộc sống đơn giản hơn nhiều.
Nguyên tắc tiêm phụ thuộc hướng đối tượng là không khác nhau về nguyên tắc. Viết một lớp là một chi phí chung, cả về văn bản mã nguồn và thời gian của nhà phát triển và nếu lớp đó được viết để cung cấp các phụ thuộc theo một số đặc tả của đối tượng phụ thuộc, thì đối tượng phụ thuộc sẽ bị khóa để hỗ trợ giao diện đó, ngay cả khi có nhu cầu để thay thế việc thực hiện đối tượng đó.
Không ai trong số này nên được đọc là tuyên bố rằng tiêm phụ thuộc là xấu - xa nó. Nhưng bất kỳ kỹ thuật tốt có thể được áp dụng quá mức và sai chỗ. Giống như không phải mọi chuỗi cần được trích xuất và biến thành một tham số, không phải mọi hành vi cấp thấp đều cần được trích xuất từ các đối tượng cấp cao và biến thành một phụ thuộc có thể tiêm được.