WordPress Bölüm 7 için Devam OOP: Yeniden düzenleme, test tabanlı gelişimi benimseme fırsatıdır

Şimdiye kadar nesne yönelimli PHP kullanarak WordPress eklentisi yazma serisinde, özellikle testlere odaklanıyorum. Bunun nedeni, nesne yönelimli PHP’nin ana avantajının, test edilebilecek ve çok yeniden kullanılabilecek şekilde yazılabilmesidir. Sadece mucizevi olmayan sınıf kullanmak bize bunu verir. Fikir, aramayı WordPress Rest API ile nasıl ayarlayacağını göstermektir. Eklentilere örnekler, bıraktığım noktada sadece wp_posts dizisini döndürür. Bununla birlikte, sistem için kamu yangını artık tamamen geliştirilmiştir ve doğru davranışı açıklayan testlere sahiptir.
Bir geliştirici olarak kişisel yolculuğumda, bazen test etmeyi daha ciddi ve çok ciddi değil. Şu anda “Her şeyi test et !!!” Moda ve hoşuma gittiğim nedenlerden biri, bir yeniden düzenleyici yapma özgürlüğü. Test edilmemiş bir kodla, yan etkilerin ne olduğunu bilmediğiniz için bir yeniden düzenleyici yapmak zordur. Test edilebilecek kodlar yazarken yan etki olasılığını azaltırken, test ile yönlendirilen gelişme (TDD), bir değişikliğin etkilerinin ne etkilerini bilmenize yardımcı olur. TDD’ye taşınmak kolay değil, ancak mevcut kod tabanında kademeli olarak benimsenebileceğini düşünüyorum. Böylece, bu makale, test yoluyla yeniden düzenlenmeye odaklanan sürdürülebilir dizinin bir kısmını başlatıyor.
Kod İncelemesi Bu diziye başladığımda ileri adım atmadan önce, Know the Code’dan Tonya Mork, ilk makale için kod incelemeleri sunuyor. Benim gibi beğeneceğinizi umduğum bir kod inceleme makalesi yazdı. Bu makalenin örnek kodu, Tonya’ya, değiştirilebilecek arama talebinin uygulanmasını tasarlayan makaleyi takip etmek için eklenen gerilme talebi üzerine başlar. İncelemeye katılıyorum ve değişiklikleri kabul ediyorum ve daha sonra daha fazla değişiklik tartışıyoruz. Çekme talebi hakkındaki yorumlar temel olarak bu makalenin kaba taslağı ve bu serinin bir sonraki taslağıdır. Kod ve nedenlerde birçok değişiklik yapmak için sürecimizi okuyabilirsiniz. Benim için bir sorun hakkında bildiğim her şeyi yazmanın ve bununla ilgili soruları cevaplamanın çok yararlı olduğunu gördüm. Bu bir kod incelemesi. Şirketinize ve/veya arkadaşlarınız arasında tanıtmanızı şiddetle tavsiye ediyorum. Niyet nedir? Üzerinde çalıştığımız örnek kodla ilgili bir şey, kodun oluşturulmaya başlamasıdır, ancak örnek bir koddur. Ancak, yavaş yavaş bunu gerçekten kullanışlı hale getiriyoruz, çünkü daha eğlenceli. Sonuç olarak, sistemlerimizin veritabanından veya ateşten gerçekten içerik alan “içerik alıcıları” olarak hareket edecek nesneler için Tonya tarafından belirlenen arayüz, dış dünyaya doğru soruları sormayın.
Tonya burada konuşmamızı tamamladı, WP_Query ve WP_REST_REQUEST yaymaya karar verdik, çünkü nesne, kodumuzun amacını yerine getirmek için HTTP isteğinin amacını belirtti -/wp/v2/direk gibi rota türlerini yayınlamak istedik. Birkaç yazı türünde arama yapmak için daha kullanışlı olun. Demek istediğim, daha yararlı olan çeşitli WP_Query türleri veya farklı sistemlerle üretilen sonuçlardır. Arayüzü bir tutkal olarak planlamak, amacım her şeyi birbirine bağlayan bir fabrikaya sahip olmak ve yol boyunca hiçbir şeye zarar vermediğimi kanıtlamak için bir testin nasıl kullanılacağını göstermektir. Tüm nesnelerim için bir arayüz yapmayı içerir, böylece test edilebilecek bir fabrika yapabilirim ve daha sonra mevcut arayüzü yenileyebilirim, böylece her şey birbirine bağlanabilir. Ayrı olarak çalışan iki veya üç sistemim olacak ve daha sonra birleştirmekte zorluk çekecek. Modifyschema için son nokta şemasını değiştiren yeni bir arayüz eklemek ve WP_Query bağımsız değişkenini değiştiren ModifyQuerargs her şeyi yapıştırmak için ilk adımım. Oradan başlamak, daha sonra nasıl bağlanacaklarının biçimini belirlememe izin verdi. Sınıfların hiçbirinin bir arayüzü yoktur. Her ikisinde de bir ussFilter () yöntemi vardır, ancak farklı imzalar vardır. FiltresrewPquery ayrıca bir omuz (), farklı imzalar ve statik vardır. Bu benim için kötü kokuyor.

Bir dizi değişen uygulamayı aktarmam gerektiği göz önüne alındığında, her yazı türü için dinlenme _ {$ post_type} _collection_params ve dinlenme _ {$ post_type} query’yi ilişkilendirmemiz gerektiğini varsayıyorum. Aslında bu fikri kanca için yerel WordPress ortamımda arama yaparken aldım. Ateş dinlenmesinde kancayı bulmaya çalıştım ve Gutenberg’in Gutenberg yerine iki filtreyi ilişkilendirmesi yerine kullandığını buldum _ {$ post_type} _collection_params ve dinlenme _ {$ post_type} _query burada tekrarlandı. Aslında ihtiyaç duyan arayüzle başladım ve daha sonra fabrikayı daha fazla yapıştırmayı işlemek için uyguladığımda gereksinimleri sildim.
API REST şemasını modelleyen sınıfı yeniden düşünerek başlayalım. İlk adım bir arayüz eklemektir. Bunu yaparak, bu sınıfı restoran rotası şemasını değiştiren sınıftan değiştirmeye hazır olacağız ve onu restoran rotası şemasını değiştiren sınıftan değiştirilebilecek bir uygulamaya dönüştüreceğiz. Mümkünse, beton uygulamadan önce bir arayüz tasarlamak, yaşayacağım yeniden düzenleme gerekliliğini önleyebilir. Ancak, ilk uygulamayı arayüz kısıtlamaları olmadan ve daha sonra başarıdan sonra arayüz tasarımı oluşturmak genellikle daha pratiktir. Bazen bir arayüzle başladığımda, kendimi somut uygulamamı bir arayüzle ayarlamak için mücadele edeceğim ve yaptığım sözleşmenin yanlış olduğunu fark etmeden önce çalışmasını sağlamak için çok fazla zaman harcayacağım.
Genellikle arayüzü “sözleşme” olarak adlandırırız çünkü sınıfın programın geri kalanıyla ilgili olarak nasıl hareket etmesi gerektiğini tanımlarlar. Sözleşmeye karar verdikten sonra, onun tarafından sıkışıp kaldık. Bizi başarısız kılan sözleşmeye bağlı iş ve programlamada kötüdür. Mevcut sınıf için bir arayüz yaparken ilk adımım boş bir arayüz eklemek ve orijinal sınıftan uygulamasını istemektir:
Bundan sonra, yöntemin imzasını ve belgeyi arayüze doğru kopyalayabilirim. Arayüzün farkında olan bir fikir, bu süreçte çok yardımcı olmak için phpstorm kullanıyorum, çünkü görünen yöntemin imzasının çatışmasını vurgulayacak.
Yeniden düzenlemeye başlamadan önce bu modifySchema:
Daha önce dedim ki, amacım FiltreShema yöntemini gerekli hale getirmektir. İlk düşüncem arayüzün bir Filtreschema () ve Omuz () olmasını sağlamak olsa da, şu anda halka maruz kalması gereken şey budur. Ama Filtreschema ‘ı ortadan kaldırmak istiyorum, bu yüzden bu sınıf tarafından hangi bilgilerin iletilmesi gerektiğini düşünüyorum:

Ek şema argümanı

Ek şemaların argümanının eklenip eklenmeyeceği.
Bu listeye dayanarak, WorsFilter () mantıklı, ancak filtrelerchema () değil. Ayrıca ilk adımın eklenecek soyut argüman dizisi olduğunu ve onu halka erişilebilir kılmak olduğunu söyledi. Aşağıdakiler arayüzün başlangıcıdır:
Yeni GetAditionalsChemaargumens () yönteminin diziyi geri yüklemek için ima edilmektedir.Bir dizi şema argümanı almak için daha sonra güvenilir bir şekilde kullanabiliriz.Orijinal sınıfta getAddunschemaargumens () yoktur.Bir argüman dizisi vardır, ancak şu anda Filtreschema () ‘da tanımlanırlar, bu da iyi filtreShema () sorumlu olmalıdır, bu da sorumludur. Kötü kokar.Bir şey yapmanın her yöntemini sağlayarak geliştirelim – yöntemin adıyla söylenen şey. Bu yeni sürümde hala bir Filtreschema () var ama yaptığı tek şey şema taramasını ele alıyor.Veriler GetAdditlesalschemaargumens () tarafından sağlanır.Üç yöntem, belge satırını eklem @InheritDoc ile değiştirmiştir.Bunun nedeni arayüzde hepsi mevcuttur.
Hikayeyi yeniden anlatmak, arayüze Filtershema () eklemeye değer olup olmadığı, boşuna silmeyeceğimi bilerek tartışılabilir. Bu arayüze uyacak şekilde yapay testimi geliştirmem gerekiyor. Arayüz gerçek dünyada kullanıldıktan sonra, bunu değiştirmek geriye dönük uyumluluğu ihlal eden bir değişikliktir. Arayüz imzalarındaki değişiklikler Laravel’in ana versiyonundaki artışta meydana gelir. Somut uygulamanızı ölümcül hatalara uyacak şekilde değiştirmelisiniz veya artırmalısınız. Bizim durumumuzda, tüm bunlar bir üretim kodu değildir. Sadece bu eğitim kodu değil, aynı zamanda tamamlanmadığı için. Yol boyunca bazı değişiklikler yapmalıyız ve bu hala iyi bir hikaye yapıyor. Bu arayüzü yaptığım komite. Ayrıca, API REST tarafından izin verilen Kueri argümanının beyaz listesine WP_QUY argümanını eklemekten sorumlu bir ModifyQueryRims sınıfımız var. Burada, izin verilen listeye “Post_Type” argümanını eklemek için uygulandı: Bu sınıfla, son olarak aynı sorunu kokluyorum, beyaz listeyi değiştireceği ile iletişim kurmuyor. Filterqureargs () yöntemini ortadan kaldırmadan önce, filtreye eklenenleri iletmek için bir yönteme ihtiyacımız var. Bu kez, getAditionalquerarguments () yöntemi şunları iletebilir:
Orijinal sınıfı yeniden etkinleştirmenin ilk adımım, şu anda Filterquerargs () tarafından korunan bu arayüzle uyumlu hale getirmektir.
Bunu birlikte ayarlamaya başlamamız gereken ikinci arayüz budur.Buradan yeni bir arayüz için komiteyi görebilirsiniz.Tonya’ya göre bir parça yapın ve ikimiz de “yapışkan” metaforunu kullanıyoruz
Bu süreci tanımlamak için. Belki de son zamanlarda bir araya getirilmiş çok fazla mobilya gördüm çünkü yeni taşındım, ancak bu süreç daha çok tahtanın ucunu oluşturmaya benziyordu, böylece diğerlerine mükemmel bir şekilde gireceklerdi. Uyması gerektiğini düşündüğüm gibi bir tahta yapmak için adımları geçtim. Bir sonraki adım, onunla eşleşmesi gereken fabrika. Neyin gerekli olduğunu hayal etmek için elimden geleni yapıyorum, bir metaforla oynadığımızda, Laravel’in faydalarından birinin servis kabının sınıfa otomatik kablo bağımlılıklarına otomatik bir bağımlılık enjeksiyonu sağladığını belirtmek gerekir. Örneğin, WordPress’te, kullanıcıya erişmesi gereken bir restoran rotam varsa, dönüş çağrısı yönteminde get_user_by () veya yeni bir wp_user kullanıyorum. Laravel’de, yalnızca geri arama denetleyicisinin bir argümanı olarak bir kullanıcı modeli oluşturacağım ve türüne göre Laravel, kullanıcı modeli enjeksiyonunu geri aramama yönlendirecek. Hizmet konteynerine bağımlılık sağlamak için sorumlulukları aktararak – buna kontrol inversiyonu diyoruz – somut uygulama değişimini yapmak, örneğin test için bir taklit kullanarak daha basit olması. Tonya, WordPress’te alay etmek için çok iyi bir diziye sahip. Alaycı çok kullanışlı bir beceridir. Bunun yazma testinin en yavaş kısmı olduğunu hissediyorum ve Laravel veya React için bir test yazdığımda alayın daha doğal hale geldiğini ve daha az alay içerdiğini buluyor. Bütün bunları WordPress’i çağırmak için söylemedim. Bunun yerine, burada öğrettiğimiz yaklaşımın olumlu tarafını açıklayacağım.

admin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir