Daha iyi okunabilirlik için PHP kodunu yeniden düzenleme örneği
Bu makalede ne zaman yeniden düzenlemeniz gerektiğinden bahsetmeyeceğim (kişisel olarak, her kötü kod bulduğunuzda bunu yapmanız gerektiğinden eminim), neden yeniden düzenlemeniz gerektiği hakkında konuşmayacağım (bu teknik borcu azaltır). Bunun yerine, yeniden düzenleme yaparken uygulayabileceğiniz ve gerçek bir kod örneğiyle hangi şekle ilişkin örnekleri verebileceğiniz bazı genel ve pratik ilkeleri görmek istiyorum. Bu makalenin amacı için PHP kodunu kullanacağım (WordPress PHP’de yazıldığı için), ancak bu ilkeler herhangi bir programlama dili için geçerli olacaktır.
Kendinizi tekrarlamayın (kuru) Belki de duyabileceğiniz en popüler programlama ilkesi “Kendinizi Tekrarlamayın” (kuru). Kendinizi aynı kodu birkaç kez çoğaltırken bulursanız, sınıftaki veya kendi işlevlerinde işlevselliği özetlemeniz ve tekrarlamayı önlemek için sınıfı veya işlevi kullanmanız gerekebilir. Bu, kodu yalnızca birkaç ay sonra kaçınılmaz bir hata göründüğünde tek bir yerde düzeltmeniz gerektiği anlamına gelir. Bunun iyi bir örneği, iki farklı ama benzer sınıfın aynı işlevlerden bazılarını gerektirmesidir. İki farklı sınıftaki kodları çoğaltmak yerine, genel işlevlere sahip soyut sınıflar oluşturabilir ve daha sonra iki sınıfın soyut sınıfları genişletmesini sağlayabilirsiniz. Örneğin:
Olmak:
Bu, çoğaltmayı önlemek için kodunuzu nasıl düzenleyebileceğinizin basit bir örneğidir. Karmaşık işlevlerin ayrılması, okunması zor teknik borca ve kodlara neden olabilecek diğer genel programlama problemleri karmaşık bir işlev veya yöntemdir. “Program, insanların okunabilmesi için ve sadece makine tarafından yürütülmesi için yazılmalıdır.” -Harold Abelson, kodunuzu başkaları tarafından kolayca okumayı ve anlaşılmasını sağlar en önemli şeydir, bu nedenle karmaşık işlevlerle başa çıkmanın bir yolu, onu anlaşılması daha kolay olan (ve test edilebilen) küçük parçalara ayırmaktır.
Aşağıda karmaşık fonksiyon örneğidir. Yaptığı her şeyi anlama konusunda endişelenmeyin. Sadece ne kadar karmaşık göründüğüne dikkat edin.
Tüm işlevler böyle görünüyorsa daha kolay değil mi:
Bunu okumak ve anlamak çok daha kolaydır. Fark sadece büyük ve karmaşık kod bitini kod tabanına bölmek şaşırtıcı. Burada dikkat edilmesi gereken başka bir şey, karmaşık işlevleri bu şekilde bölerken uzun ve tanımlayıcı bir işlev adına sahip olmak konusunda çok fazla endişelenmenize gerek olmamasıdır. Hedefin insan okunabilirliği olduğunu unutmayın, bu nedenle işlevinizin adıyla çok özlü olmaya çalışmak, kodunuzu anlamayı zorlaştırabilir. Örneğin: $ this-> get_att_inf ($ post_id); Anlaması daha zor: $ this-> get_attachment_s3_info ($ post_id); Ayrı karmaşık gereksinimler şöyle görünen büyük gereksinimleri gördünüz mü:
Gereksinimlere sahip uzun kod parçalarını okumak ve anlamak zordur. Bunun basit çözüm, koşullu kodu net olarak adlandırılan yönteme çıkarmaktır. Örnek olarak:
Bu, kodunuzu gelecekte yöneticiler için anlamayı daha kolay hale getirir. Koşullu yöntem net bir ad verildiği sürece, gerçek yöntem kodunu kontrol etmeden ne yaptığını kolayca anlaşılacaktır. Bu uygulama bildirim programlama olarak da bilinir.
Bir yuvalama durumunun bir koruma maddesi ile değiştirilmesi, koşullu kompleks refactor için başka bir yol “koruma maddesi” olarak bilinen şeyi kullanmaktır. Koruma Maddesi, yöntemin doğrudan değerinin istisnasının veya geri dönüşünün çağrılmasına yol açan ve yöntemin başlangıcına yerleştiren tüm koşulları çıkarmak için yeterlidir. Örnek olarak:
Burada yöntem daha karmaşık hale gelirse ne kadar hızlı “koşullu cehennem” olabileceğinizi görebilirsiniz. Ancak bir koruma maddesi kullanmak için bu yöntemi yeniden aktarırsak, şu şekilde görünecektir: Şimdi yöntem daha karmaşık olsa bile, yolda baş ağrısı olmayacaktır. Bu fonksiyonel yöntemi kullanarak döngü ve koşullu yeniden düzenleme, fonksiyonel programlama dili ve kütüphanesinde daha fazla kullanılan biraz daha gelişmiş bir yeniden düzenleme türüdür (bu tür işlev JavaScript toprağında yaygın olarak kullanılmaktadır). Haritalar gibi işlevleri duymuş olabilir ve ne olduğunu ve nasıl kullanılacağını azaltıp merak etmiş olabilirsiniz. Bu yöntemin kod okunabilirliğinizi önemli ölçüde artırabileceği ortaya çıkıyor. Bu örnek, Adam Wathan’ın bu sorunla ilgili büyük ekranından esinlenmiştir (yaklaşan kitaba bakmalısınız) ve Laravel koleksiyonlarının kullanımına dayanmaktadır. Ancak, numuneyi standart PHP işlevine işlev görecek şekilde uyarladım.
İki genel senaryoya bakalım ve fonksiyonel yöntemler kullanılarak nasıl geliştirilebileceklerini görelim. Aşağıdaki örneğimiz yangından bir grup $ etkinliği alır ve skoru etkinliğin türüne göre hesaplar:
Artırabileceğimiz ilk şey, foreach döngüsünü harita işleviyle değiştirmektir. Harita işlevi, mevcut diziden yeni bir dizi yapmak istediğinizde kullanılabilir. Örneğimizde, Dray $ etkinliklerinden bir dizi $ türü yaptık. PHP, yukarıdaki kodda ilk foreach yazmamızı sağlayan bir Array_map işlevine sahiptir:
Not: Bunun gibi anonim işlevleri kullanabilmek için PHP 5.3+ çalıştırmanız gerekir.
Yapabileceğimiz ikinci şey, işlenmesi biraz daha kolay olması için büyük bir anahtarın ifadesini kırmaktır. Ancak aslında buraya gidebilir ve bir işlevdeki $ skorunu hesaplamak için Array_Reduce PHP işlevini kullanabiliriz. İndirgeme işlevi değerin değerini alır ve tek bir değere düşürür. $ Skorumuzu hesaplamak için burada yapacağız.
Şimdi her şeyi bir araya getirdiğimiz:
Çok daha iyi. Döngü veya koşullu görünmez. Telefonda $ türleri veya $ skorları bulmak için daha fazla karmaşıklık gerekli olduğunu hayal edebilirsiniz, bir haritayı yeniden düzenlemek ve işlevin işlevini ayrı bir yönteme indirmek kolay olacağını hayal edebilirsiniz. Bu artık mümkün çünkü karmaşıklığı bir işlev haline getirdik.
Daha fazla okuma Bu makalede yeniden düzenleme yüzeyini çizdim. Konuşabileceğim çok daha fazlası var, ancak umarım bu size kod refactor’unuzun gerçekte neye benzediğine dair biraz fikir verir. Daha derine dalmak istiyorsanız, bir kaynak yapma yeniden düzenleme kılavuzu öneririm. Bu birçok konuyu içerir ve her birinin bir örneği vardır, böylece yeniden düzenleyicinin tam olarak ne olduğunu görebilirsiniz. Hiç kodunuzu yeniden aktarmaya çalıştınız mı? Paylaşmak istediğiniz harika bir yeniden düzenleme ipucunuz var mı? İşlevsel yöntemler hakkında ne düşünüyorsunuz? Bana yorumlarda söyle.