PHP CodeSniffer faydalı mı?

8 Cevap php

Ben kod tabanının kalitesini artırmak için bir çaba bizim sürekli entegrasyon sunucu üzerinde PHP CodeSniffer kurma fikri uğraşmaya ediyorum. Belgeleri okuduktan sonra ben bizim kodlama standartlarını normalleştirilmesi ve uygulanması fikri konusunda çok heyecanlıyım. Ancak, bizim ürün gerçek iyileşme merak terk ediyorum. Ben sniffer sadece ihlalleri tespit farkında değilim, bir kodlama standart tanımlı ama temiz, tutarlı, kod-baz faydaları ne tür sağlar? O PEAR standardına uymak için kod 100k + hatları ile bir proje refactor ek iş değer mi?

PHP CodeSniffer veya genel olarak kod-koku aşina olmayanlar için, burada bir örnek çıktı:

FILE: /path/to/code/myfile.php
FOUND 5 ERROR(S) AFFECTING 2 LINE(S)
--
2 | ERROR | Missing file doc comment
20 | ERROR | PHP keywords must be lowercase; expected "false" but found "FALSE"
47 | ERROR | Line not indented correctly; expected 4 spaces but found 1
51 | ERROR | Missing function doc comment
88 | ERROR | Line not indented correctly; expected 9 spaces but found 6

Açıkçası, kullanıcı / müşteri standartlarına uyumlu olması refactored bir üründe herhangi bir fark olmaz ama diğer gizli faydaları vardır merak ediyorum

Şu anda bizim kod hiçbir özensiz yoluyla ve biz, çoğunlukla, Pear's Coding Standards türetilen ancak eğitimli bir göz farkları olabilir bizim kendi kişisel standartları takip etmeye çalışıyorum.

Yani benim soru, bir ürünün kalitesini artırmak ne kadar çok olduğunu. Gizli ne tür yararları ondan sonuçlandı?

Ben sadece bir standartlar kümesi yakın ürün taşımak için benim arzu ile obsesif-kompulsif davranıyor muyum? Buna değer olurdu? Eğer öyleyse, strateji ne tür kod sniffer uygulamak ve saptandı sonraki ihlalleri düzeltmek için kullanabilir mi?

8 Cevap

Öncelikle, ben PHP_CodeSniffer ve sürdürücüsü değilim, bu yüzden açıkça bu alanda önyargılı değilim. Ama aynı zamanda bir PHP dev olarak benim 10 yıl içinde bazı büyük kod tabanları üzerinde çalıştık, bu yüzden ben kodlama standartları iyi bir şey neden bazı somut nedenleri getirebilir umuyoruz. Ben bu konuyla ilgili bir blog serisi yazabilirsiniz, ama ben sadece seni PHP_CodeSniffer hakkında böylece araç benim için sorun çözüldü anlayabiliyorum nasıl meydana geldiği hakkında küçük bir hikaye vereceğim.

Ben birkaç büyük CMS projeler üzerinde çalıştık. İlk arkasında kod bir yığın ve nispeten küçük bir geliştirme ekibi vardı. Biz hiçbir standartları vardı. Ama biz hiçbir gerçek sorunları vardı. Ekip küçük ve uzunca bir süre birlikte kaldı. Biz birbirimize alıştık.

Sonra yeni bir CMS inşa. Biz Devs sadece bir çift taze başladık. O zaman sadece iki geliştiriciler bir ekibin parçası oldu. Yine, kodlama standartları bize herhangi bir sorun neden yoktu. Ben ve diğer dev aynı arka plan geldi ve zaten biz takip bazı kurallar kurmuştu. Biz o zamanlar PHPCS gerek yoktu.

Ama bu takım bir anda bir geliştirici büyüdü ve sonunda 12 tam zamanlı devs ulaştı ve epeyce geldi ve gitti. Bazı eski CMS geldi ve bazı şirket dışından geldi. Tüm farklı geçmişlere ve geliştirme için farklı bir yaklaşım vardı. Stilleri çok farklı çünkü ne kodu kim yazdı belliydi. Eğer karmaşık bir şey üzerinde çalıştı zaman, ilk önce sadece kod görmeye kullanılan yol değildi çünkü onların tarzı ayarlamak gerekiyor. Bu ilk kez Shakespeare okuma gibi. Eğer doğal bir tempoda okuyabilir önce buna alışması gerekiyor.

Geliştiriciler için, durdurmak ve başka bir kodlama stilini anlamaya zorunda ekstra zaman sadece saf boşa zaman. Bu boşluk, girinti ve dirsek pozisyonu ile batağa saplanmış iken bir fikir uzak kayma için bir şans. Günün sonunda, bu şeyler sadece bir önemi yok. Ama bana onların akışını kırmak için geliştiriciler neden olmadığını onlar çok önemli, size söyleyeyim. Bu yüzden onları doğru yoldan almak ve geliştiriciler en iyi ne yapalım yapmak için bir yol gerekli.

Aynı zamanda, biz çok daha fazla JavaScript içine kazıyordu. Tarzı genellikle pencereden dışarı atıldı Yeni bir dil. Kod örneği sitelerinden yapıştırılan copy / idi ve birlikte püre. Yeni bir dilde karmaşık kod geliştirmek için öğrenme zaman, bizim JS bizim PHP benzer görünmesi için bir yol bulmak için mantıklı. Biz daha sonra bunu en aza olabilir, ama bizim akışını tutmak için tekrar, hızla diller arasında geçiş yapabilmek için gerekli.

Yani PHP_CodeSniffer yapmak için doğdum. Bu geliştiriciler biçimlendirme ve diğer alev yem konular dışına tamamen hareket yapmak için aynı kodlama tarzı çalışmasına yardımcı olur. Bu bir ölçüde PHP gibi JS tedavi sağlar. Ben doğru sınıf içerme kodu kullanarak değil non-tercüme dizeleri veya geliştirici gibi ürüne özgü kokuları algılamak için kullanabilirsiniz. Ben de IE öldürür JS virgül etrafında sol değil emin yapma gibi dile özgü kokuları kullanabilirsiniz. İstediğini için kullanabilirsiniz. Bu XML ruleset file ile birlikte birleştirmek için kolay burun çekmeler yığınları ile birlikte gelir. Ayrıca kendi yazabilirsiniz. Bunu statik kod analizi için bir one-stop-shop yapmak için 3. parti araçları entegre edebilirsiniz. Sen standartları ve istediğiniz gibi kod kokuyor hakkında da ciddi olabilir.

PHP_CodeSniffer, herhangi dev bir araç gibi, sizin için çalışması gerekir. Bunun için çalışmak yok. Bu, umurumda istemediğiniz olanları kaldırmak için standart özelleştirmek veya uyarılar haline hataları açmazlar çok fazla hata üretir eğer. Benim hikayem üzerinden gidiyoruz bir şey gibi geliyor ya da gelecekte geçmesi olabilir ama eğer o size yardımcı olabilir görmek için PHP_CodeSniffer yakından göz alarak değer.

Ben kodlama standartları, bazı proje ve geliştiriciler için gerçekten önemli olduğunu anlamak, bu size yardımcı olur, ve diğerleri umarım. Bu ayrıntı değil. Bu geliştiriciler odak kaybetmek neden şeyler listesinden bir kodlama stilini kaldırma hakkında.

Bu geliştiriciler yazmadım kod üzerinde çalışırken farklı bir tarzda yazılmış bir kod dalıp alamadım yardımcı olur, çünkü kodlama tarzı sözleşmeler olması, iyi bir fikirdir. Bu kod tabanı yüzeysel temiz yapacaktır. Bunu otomatik olarak yapabilirsiniz eğer o harika, ama uymak için büyük çaba geçmesi gerek genellikle yoktur (geçerli stil sürece terrible). Zaten yeterince iyi bir standart varsa, ona sopa.

Kod koku olsa farklı bir şeydir: bu kod ile daha derin bir soruna işaret ediyor olabilir belirtiler (bir set) olduğunu. Örnekler iyice kodunuzu yaşatılabilirlik zarar verebilir gibi bu, genellikle çok daha sorunlu vb cyclomatic karmaşıklığı, uzun yöntem adları, büyük sınıflar, undescriptive isimler, yinelenen kod vardır. Kesinlikle bu sorunları çözmek gerekir.

PHP CodeSniffer ağırlıklı stil kuralları değil, kod koku kontrol için geliştirilmiş gibi görünüyor. Eğer stil kuralları, büyük uygulamak yardımcı olması için kullanabilirsiniz. Fakat bu sizin kod tabanı yapmaz sakının better. Bunu başarmak için manuel değerlendirmeleri yapmak isteyeceksiniz.

Eğer mümkün görünmektedir your current standardına uymak durumunda sorunun cevabını görmek, denetlemek için kullanmak istiyorsanız, "ben senin kodlama standartları ile aynı fikirde değilim! Ben PHP_CodeSniffer zorlamak yapabilir miyim benim kendi? " in their FAQ.

CodeSniffer evangelise olanlar arasında ben de varım. Yıllar için son derece şüpheci olduktan sonra, ben şimdi üzerinde çalışıyorum her projede kullanabilirsiniz. Neden?

Grace Hopper ve / veya Andrew Tanenbaum gibi ünlü dedi,

The wonderful thing about standards is that you have so many to choose from.

Aynı şekilde, hemen hemen her zaman kötü bir fikir ™ kendi kodlama standardını oluşturmak için; tüm kodunuzu kapsayacak kadar kapsamlı bir oluştururken, çok daha önemlisi, kim standart "geliştirmek" için çalışacağız, kodunuzu korumak için yanındaki kişinin beğenisine olmayacak hard, ve böylece onun uzun tutulan kodlama stili uyuyor. , Zend veya armut veya Kohana veya JoeBobBriggsAndHisFifthCousin olsun, standart dışında bir appropriate benimseyen Eğer content yerine formatting konsantre sağlar. Daha da iyisi, PHP CodeSniffer gibi araçlar ya da daha önce gitmiş olanlar neredeyse kesinlikle bir eklenti olarak destek hayata geçirdik "teneke taze" standardını desteklemesi ya.

Iki basit, tamamlayıcı kurallarını kabul sürece standart yazılı olmayan varolan kodla kodlama standartları karıştırma, size uygun verecektir.

Exclude files which predate your adoption of the coding standard from being checked, through the --ignore command-line option or equivalent configuration-file settings. But, when you do modify any part of a source file, update the entire file to comply with your chosen standard.

Ben sadece wrote a new blog post bu tür bir şey hakkında.

Orada insan yargısını gerektiren durumlarda çok, ve CodeSniffer bir yok.

Tutarlı parantez, kod geliştirmek çukurlaşma. Işlev çağrısında virgülden sonra boşluk eksikliği? Muhtemelen affedilebilir, ama ERROR CodeSniffer göre bulunuyor. Olabilir

CS tarafından bildirilen yol çok hatalar vardır IMHO. Temiz kod var görünüyor, hatta projeleri kolayca thousands CS konuların içine çalıştırabilirsiniz. Her ikisi de eşit sıklıkta ERRORS olarak işaretlenmiş - Bu hızlı gerçek sorunları ve obsesif-kompulsif saçma bir karışımı, özellikle tüm bu sorunları çözmek için yorucu ve neredeyse imkansız hale gelir.

Bunun yerine sadece tamamen yüzeysel ve boşluk yorumlar değişiklikler dışında (tasarım, algoritmalar açısından) kodu gerçek iyileştirmeler CS ve vakit görmezden daha iyi olabilir (1-satır isAlpha işlevi gerçekten 8 satır ihtiyacı var yorumlar? Evet, siz) CS sorarsanız.

CS çok kolay tezek-parlatma aracı olabilir.

Bu kesinlikle iyi bir şeydir. Tüm kod (bu şimdiye kadar yapılmış en iyi kararlardan biri oldu) taahhüt edilebilir önce evi standardını (ARMUT bir değişiklik) geçmek zorundadır ki biz bir SVN kanca bizimki çalıştırın.

Tabii ki, bu eski kod yükler yeni standarda dönüştürmek için orada değil, yeni bir proje için en iyi çalışır. Bu etrafında bir yolu SVN sadece codesniffer yeni eklemeler çalıştırmak ve değişiklikleri görmezden kanca önceden taahhüt değiştirmektir. Sen satırı ekleyerek yapabilirsiniz:

$SVNLOOK changed "$REPOS" -t "$TXN" | grep "^A.*\.php " > /dev/null || exit 0

Ayrıştırmak için yeni bir PHP kodu yoksa, bu askıyı çıkacaktır. Bu nedenle tüm yeni dosyalar standart itaat etmek ve kendi zamanında standart kadar eski kod getirebilir gerekir.

Eclipse veya Zend IDE kullanıyorsanız eğer daha az masraflı bir standardın saygı yapar otomatik araçlardan yararlanabilirler unutmayın. Ayrıca Hudson veya PHPUndercontrol gibi sürekli entegrasyon aracı kullanabilirsiniz.

  • PDT PHP için serin bir editör
  • PDT-Tools otomatik biçimlendirme aracı ile PDT için bazı eklentileri
  • DTLK (Dinamik Toolkit Library) dosyaları kontrol etmek için bazı dış komut başlatmak için kullanılabilir.

Ayrıca ben yapılandırmak için daha kolay olduğunu düşünüyorum PHP Checkstyle de bir göz atabilirsiniz (yasal uyarı: Ben bunun üzerinde çalıştık)

Diğer bazı araçlar web sitesinin "dokümantasyon" sayfasında listelenir.

CodeSniffer uygulamak için harika bir şey, ama bunu nasıl kullanılacağını bilmek zorunda. Eğer bazı dış proje için işinizi göndererek, çünkü verilen bir kodlama standardına uymak zorunda sürece, tamamen kendi kodlama standartlarını tanımlamak için ücretsizdir.

Birçok tek kodu kendi kodlama standart tanımı içerebilir ve sıfırdan bunları yazmak gerekmez ki koklar zaten vardır çünkü PHP CodeSniffer, sizin için bu çok kolay yapmak gerekir. Mevcut Codesniffers olanaklarını keşfederken, size ihtiyacı hissediyorum, kendi varolan algılaması veya bir sniff bir uzantısı yazarak sonunda olabilir.

Eğer CodeSniffer ile başlamak istiyorsanız, ilk adım, tamamen mevcut standartları kodlama benzer burun çekmeler bir dizi kapmak ve çıkan hataları ve uyarıları kontrol etmek olacaktır. Sabit olursa, bu büyük olasılıkla çok az parası ile çok hatalara neden olacak gibi, önceden tanımlanmış standartlara birini geçerli değildir. Bir dokümantasyon oluşturmak için PHPDoc kullanmak istemiyorsanız Örneğin, bu PHPDoc etiketleri ve yorumlarınızı eksik ilgili tüm codesniffer hataları yerine getirmek için hiçbir faydası olacaktır.

Eğer ARMUT / PECL'de aracılığıyla kamu dağıtım için PEAR paketleri sunan mı? Eğer öyleyse o zaman muhtemelen ARMUT sözleşmelere sadık istiyorum.

Aksi takdirde, ben büyük Refactor değer olarak göremiyorum. Büyük şey takım için bir kodlama standardı üzerine kabul edilir ... Sadece zorlanan bazı standart sözleşme olduğundan emin olun ... PEAR'ın standart olmak zorunda değildir.

Örneğin, ben hayranıyım

function foo () {

PEAR standart vs biçimi ..

function foo ()
{

Alt çizgi, PECL'de üzerinde paketleri koyarak değil, özellikle eğer, onun bir ton iş olacak eğer onların standardına uygun hakkında çok fazla endişelenmenize gerek yok.