Dependency Injection ile gevşek bağlı Python kodu

Jan 13 2023
Değişime cevap verebilmek için yazılımın esnek olması gerekir. Bağımlılık enjeksiyonu, yazılım bileşenleri arasındaki bağımlılıkları yönetmek için kullanılan bir tekniktir.

Değişime cevap verebilmek için yazılımın esnek olması gerekir. Bağımlılık enjeksiyonu, yazılım bileşenleri arasındaki bağımlılıkları yönetmek için kullanılan bir tekniktir. Sistemin başka herhangi bir parçasını değiştirmeden test etme veya başka amaçlar için bileşenleri değiştirme yeteneği sağlamak için kontrolün ters çevrilmesini kullanan bir tasarım modelidir .

Python'da Bağımlılık Enjeksiyonu

Bağımlılık enjeksiyonunun arkasındaki ana fikir, yapıcı işlevlerden veya doğrudan örnekleme yöntemlerinden hizmet sağlama sorumluluğunu diğer nesnelere aktarmaktır. Başka bir deyişle, bir nesneye bağımlılıkları oluşturmak yerine bağımlılıkları verilir. Bu şekilde, yeni özellikler eklemek istiyorsak, mevcut kodu değiştirmek zorunda kalmayız, bunun yerine ona yeni bağımlılıklar aktarırız.

Arayüzlerle Soyutlamalar Oluşturma

Bağımlılık enjeksiyonu ile gevşek bağlı Python kodu yazmanın üç adımı vardır. İlk adım, kodun hangi bağımlılıklara ihtiyaç duyduğunu belirlemek, ikinci adım her bağımlılık için arayüzler oluşturmak ve üçüncü adım, yapıcı veya yöntem parametreleri aracılığıyla bunları bağımlı nesneye iletmektir.

Son zamanlarda, iş verilerini işlemek için bir bayt kodlayıcı ve kod çözücü gerektiren bir işlevsellik uyguladım ( okunabilirlik amacıyla uygulamasını basitleştirdim ). Arayüzlere karşı sorumluluklarını soyutladım. Python, Golang gibi bir arabirim anahtar sözcüğüne sahip değildir, ancak arabirim işlevselliğini ABC kitaplığıyla çoğaltabilirsiniz .

Kodlayıcı ve kod çözücü için arabirimler.

Arayüze odaklanarak IPacketEncoder, somut bir kodlayıcı sınıfı onu uygulamalıdır. İlk iş gereksinimleri, tüm türlerin kodlanmasını ve dizelerin uzunluklarıyla doldurulmasını gerektiriyordu. Neyse ki Python, zor işlerin çoğunu yapmak için yapı kitaplığını sağlar .

PaddedPacketEncoder somut sınıfı.

Bağımlılık Enjeksiyonunu Uygulama

İşlev encode_name, belirtilen ada sahip kodlanmış bir yük oluşturmak için basit bir uygulamadır. IPacketEncoderParametre olarak bir nesne ve bir dizi alır .

PaddedPacketEncoder örneği, encode_name işlevine aktarıldı.

IPacketEncoderİki temel uygulama ayrıntısı, somut sınıf yerine arabirimi kullanmaktır PaddedPacketEncoderve encoderişlev içinde başlatılmak yerine bir argümandır. Bu bağımlılık enjeksiyonudur. Geçirildiği için kolayca uzatılabilir, değiştirilebilir veya bir saplamaIPacketEncoder ile sağlanabilir , böylece sistem gevşek bir şekilde akuple edilir.

Birkaç hafta sonra, bir kodlayıcının boş sonlandırılmış kodlamaları işlemesi için yeni bir gereksinim ortaya çıktı. Neyse ki, mevcut uygulama nedeniyle kolayca uygulanabilir.

NullTerishedPacketEncoder somut sınıfı.

NullTerminatedPacketEncoderesasen NULL_BYTEher kodlanmış dizeden sonra ekler. İşleve geri dönersek encode_name, örneğinin bir örneği NullTerminatedPacketEncodergeçerli bir kodlayıcı bağımsız değişkenidir çünkü NullTerminatedPacketEncoderarabirimi .IPacketEncoderPaddedPacketEncoder

NullTerishedPacketEncoder, encode_name işlevine geçirildi.

Bağımlılık enjeksiyonu burada kullanılmadıysa, sıkı bir şekilde bağlı ve değiştirilmesi zor bir kodla sonuçlanabilir, örneğin:

Eşleştirilmiş kodlama Python kodu.

Yeni bir kodlayıcı gerekirse, encode_nameişlevin testleriyle birlikte neredeyse tamamen değiştirilmesi gerekecek ve bu da teslimat sürelerini uzatacaktır. Daha da kötüsü, özellikle orijinal geliştirici artık mevcut değilse, gizli yan etkilere neden olabilir.

Sonuç olarak, bu tekniği kullanarak daha az basit bir örnek vereceğim. SocketServicebir işlem kodunu çözmek, ilgili işleyicisini çağırmak ve sonucunu döndürmekten sorumludur. Tüm bağımsız değişken türleri, yapıcısı da dahil olmak üzere arabirim soyutlamalarıdır. CLI, NullTerished veya Padded gibi hangi kodlayıcının kullanılacağını belirlemekten ve örneğini sınıfa iletmekten sorumludur SocketService.

Bağımlılık enjeksiyonunu kullanan SocketService.

Projeler büyümeye devam ettikçe, bu bağımlılıkları otomatik olarak "enjekte etmek" için Dependency Injector gibi bir bağımlılık enjeksiyon çerçevesinin kullanılması önerilir .

Umarım bu, bağımlılık enjeksiyonu ile gevşek bağlı Python kodunun nasıl yazılacağını gösterir. Pek çok Python geliştiricisi, "Pythonic" olmadığını düşündükleri için bağımlılık enjeksiyonundan hoşlanmazlar, ancak ben, özellikle diğer pek çok programlama dilinde mevcut olduğunda, faydalarının gözden düşürülemeyeceğini iddia ediyorum.

Okuduğunuz için teşekkürler . Benimle bağlantı kurmak isterseniz, beni Linkedin veya Github'da bulabilirsiniz .