Mã Python được ghép lỏng lẻo với Dependency Injection
Phần mềm phải linh hoạt để đáp ứng với sự thay đổi. Dependency injection là một kỹ thuật để quản lý sự phụ thuộc giữa các thành phần phần mềm. Đó là một mẫu thiết kế sử dụng đảo ngược điều khiển để cung cấp khả năng hoán đổi các thành phần để thử nghiệm hoặc các mục đích khác mà không thay đổi bất kỳ phần nào khác của hệ thống.
Ý tưởng chính đằng sau phép nội xạ phụ thuộc là chuyển trách nhiệm cung cấp dịch vụ từ các hàm khởi tạo hoặc các phương thức khởi tạo trực tiếp lên các đối tượng khác. Nói cách khác, một đối tượng được cung cấp các phụ thuộc của nó thay vì tạo chúng. Bằng cách này, nếu chúng tôi muốn thêm các tính năng mới, chúng tôi không phải thay đổi mã hiện có mà thay vào đó, chuyển các phụ thuộc mới vào đó.
Tạo trừu tượng với giao diện
Có ba bước để viết mã Python liên kết lỏng lẻo với phép nội xạ phụ thuộc. Bước đầu tiên là xác định mã phụ thuộc cần gì, bước thứ hai là tạo giao diện cho từng phụ thuộc và bước thứ ba là chuyển chúng vào đối tượng phụ thuộc thông qua hàm tạo hoặc tham số phương thức của nó.
Gần đây, tôi đã triển khai chức năng yêu cầu bộ mã hóa và giải mã byte để thao tác dữ liệu kinh doanh ( Tôi đã đơn giản hóa việc triển khai chức năng này cho mục đích dễ đọc ). Tôi đã tóm tắt trách nhiệm của họ đối với các giao diện. Python không có từ khóa giao diện như Golang, nhưng bạn có thể sao chép chức năng giao diện bằng thư viện ABC .
Tập trung vào IPacketEncodergiao diện, một lớp mã hóa cụ thể phải thực hiện nó. Các yêu cầu kinh doanh ban đầu yêu cầu tất cả các loại phải được mã hóa và các chuỗi phải được đệm theo độ dài của chúng. May mắn thay, Python cung cấp thư viện cấu trúc để thực hiện hầu hết các công việc khó khăn.
Thực hiện tiêm phụ thuộc
Chức năng này encode_namelà một triển khai đơn giản để tạo tải trọng được mã hóa với tên được chỉ định. Nó nhận một IPacketEncoderđối tượng và một chuỗi làm tham số.
Hai chi tiết triển khai chính đang sử dụng IPacketEncodergiao diện thay vì PaddedPacketEncoderlớp cụ thể và encoderlà một đối số thay vì được khởi tạo bên trong hàm. Đây là tiêm phụ thuộc. Vì IPacketEncoderđược truyền vào nên nó có thể dễ dàng mở rộng, thay đổi hoặc cung cấp một sơ khai , do đó giữ cho hệ thống được liên kết lỏng lẻo.
Một vài tuần sau, có một yêu cầu mới đối với một bộ mã hóa để xử lý các mã hóa kết thúc null. May mắn thay, do triển khai hiện có, nó có thể được thực hiện dễ dàng.
NullTerminatedPacketEncodervề cơ bản thêm NULL_BYTEsau mỗi chuỗi được mã hóa. Quay trở lại encode_namehàm, một thể hiện của NullTerminatedPacketEncoderlà một đối số bộ mã hóa hợp lệ vì NullTerminatedPacketEncodertriển khai IPacketEncodergiao diện tương tự như PaddedPacketEncoder.
Nếu phép nội xạ phụ thuộc không được sử dụng ở đây, nó có thể dẫn đến mã được liên kết chặt chẽ và khó thay đổi, ví dụ:
Nếu cần một bộ mã hóa mới, encode_namechức năng này sẽ phải được thay đổi gần như hoàn toàn cùng với các thử nghiệm của nó, kéo dài thời gian phân phối. Tệ hơn nữa, nó có thể dẫn đến các tác dụng phụ tiềm ẩn, đặc biệt nếu nhà phát triển ban đầu không còn nữa.
Để kết luận, tôi sẽ cung cấp một ví dụ đơn giản hơn bằng cách sử dụng kỹ thuật này. SocketServicechịu trách nhiệm giải mã mã hoạt động, gọi trình xử lý có liên quan của nó và trả về kết quả của nó. Tất cả các loại đối số của nó là trừu tượng hóa giao diện, bao gồm cả hàm tạo của nó. CLI chịu trách nhiệm xác định bộ mã hóa nào sẽ sử dụng, tức là NullTerminated hoặc Padded và chuyển thể hiện của nó xuống lớp SocketService.
Khi các dự án tiếp tục phát triển, bạn nên sử dụng khung tiêm phụ thuộc để tự động "tiêm" các phụ thuộc này, chẳng hạn như Dependency Injector .
Hy vọng rằng, điều này cho thấy cách viết mã Python được ghép nối lỏng lẻo với phép nội xạ phụ thuộc. Nhiều nhà phát triển Python không thích tiêm phụ thuộc vì họ cảm thấy nó không phải là “trăn trở”, nhưng tôi cho rằng không thể phủ nhận lợi ích của nó, đặc biệt là khi nó có mặt trong rất nhiều ngôn ngữ lập trình khác.
Cảm ơn đã đọc . Nếu bạn muốn kết nối với tôi, bạn có thể tìm thấy tôi trên Linkedin hoặc Github .

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































