2009-06-11 27 views
52

Tôi đang dabbling với ý tưởng thiết lập PHP CodeSniffer trên máy chủ tích hợp liên tục của chúng tôi trong một nỗ lực để cải thiện chất lượng của cơ sở mã của chúng tôi. Sau khi đọc tài liệu, tôi rất vui mừng về ý tưởng bình thường hóa và thực thi các tiêu chuẩn mã hóa của chúng tôi. Tuy nhiên, tôi đã tự hỏi về cải tiến thực tế cho sản phẩm của mình. Tôi nhận thức rõ rằng trình thám thính chỉ phát hiện vi phạm đối với một tiêu chuẩn mã hóa được xác định nhưng loại lợi ích nào làm sạch, nhất quán, mã cơ sở cung cấp? Có đáng để làm việc thêm để tái cấu trúc một dự án với 100k + dòng mã để phù hợp với tiêu chuẩn PEAR không?PHP CodeSniffer hữu ích như thế nào? Thực thi tiêu chuẩn mã trong tổng quát?

Đối với những người không quen thuộc với PHP CodeSniffer hoặc mã mùi nói chung, đây là một ví dụ đầu ra:

FILE: /path/to/code/myfile.php
FOUND 5 LỖI (S) ẢNH HƯỞNG 2 DÒNG (S)
-
2 | L ERI | Thiếu nhận xét tài liệu về tệp
20 | L ERI | Các từ khóa PHP phải là chữ thường; dự kiến ​​"sai" nhưng được tìm thấy "FALSE"
47 | L ERI | Dòng không thụt lề một cách chính xác; dự kiến ​​4 không gian nhưng đã tìm thấy 1
51 | L ERI | Thiếu chú thích doc chức năng
88 | L ERI | Dòng không thụt lề một cách chính xác; dự kiến ​​9 chỗ nhưng thấy 6

Nói đúng ra, người dùng/khách hàng sẽ không nhận thấy bất kỳ sự khác biệt trong một sản phẩm đã được refactored được tiêu chuẩn tương thích nhưng tôi tự hỏi nếu có những lợi ích tiềm ẩn khác

Ngay bây giờ mã của chúng tôi không có nghĩa là cẩu thả và chúng tôi cố gắng tuân theo các tiêu chuẩn cá nhân của chúng tôi, phần lớn, có nguồn gốc từ Pear's Coding Standards nhưng mắt được đào tạo có thể phát hiện sự khác biệt.

Vì vậy, câu hỏi của tôi là mức độ cải thiện chất lượng của sản phẩm. Loại lợi ích tiềm ẩn nào được tạo ra từ nó?

Tôi chỉ bị ám ảnh cưỡng chế với mong muốn di chuyển sản phẩm của mình đến gần một bộ tiêu chuẩn hơn? Nó có đáng không? Nếu có, bạn đã sử dụng loại chiến lược nào để triển khai mã-sniffer và sửa các vi phạm tiếp theo đã được phát hiện?

+7

Nó không bao giờ ngừng làm tôi kinh ngạc như thế nào tôi tiếp tục tìm kiếm dường như tốt, câu hỏi thông tin về SO mà có được đóng cửa "như không xây dựng". –

Trả lời

32

Có quy ước kiểu mã hóa là một ý tưởng hay, vì nó giúp các nhà phát triển không bị phân tâm bởi mã được viết theo một kiểu khác khi làm việc trên mã mà họ không viết. Nó sẽ làm cho cơ sở mã của bạn gọn gàng hơn. Thật tuyệt nếu bạn có thể tự động hóa nó, nhưng thường không cần phải trải qua các độ dài lớn để tuân thủ (trừ khi kiểu hiện tại là khủng khiếp). Nếu bạn đã có một tiêu chuẩn đủ tốt, hãy gắn bó với nó.

Mùi mã là một điều khác biệt mặc dù: đó là (một tập hợp) các triệu chứng có thể cho biết vấn đề sâu hơn với mã. Ví dụ là độ phức tạp của chu trình, tên phương thức dài, các lớp lớn, tên không mô tả, mã trùng lặp, v.v. Điều này thường có nhiều vấn đề hơn, vì nó có thể làm tổn thương triệt để khả năng bảo trì mã của bạn. Bạn chắc chắn nên giải quyết những vấn đề này.

Mã PHPSniffer dường như được phát triển chủ yếu để kiểm tra các quy ước về phong cách, không phải là mùi mã. Nếu bạn có thể sử dụng nó để giúp thực thi các quy ước phong cách, tuyệt vời. Nhưng hãy cẩn thận rằng nó sẽ không làm cho cơ sở mã của bạn đáng kể là tốt hơn. Bạn sẽ muốn thực hiện các đánh giá thủ công để thực hiện điều đó.

Nếu bạn muốn sử dụng nó để kiểm tra xem bạn có tuân theo tiêu chuẩn hiện tại của mình, có vẻ như có thể, hãy xem câu trả lời cho câu hỏi "Tôi không đồng ý với các tiêu chuẩn mã hóa của bạn! Tôi có thể thực thi PHP_CodeSniffer của riêng tôi?" in their FAQ.

+0

Tôi muốn chỉ ra rằng phpcs không đi kèm với một bộ sniff * đặc biệt * giải quyết thực tế [mã mùi] (http://en.wikipedia.org/wiki/Code_smells) và có thể dễ dàng được mở rộng để phát hiện mùi bạn tự xác định. – Potherca

0

Bạn có đang cung cấp các gói PEAR để phân phối công khai thông qua PEAR/PECL không? Nếu vậy thì bạn có thể muốn gắn bó với các công ước PEAR.

Nếu không, tôi không thể thấy nó đáng giá đối với người tái cấu trúc lớn. Điều lớn nhất là đồng ý với tiêu chuẩn mã hóa cho nhóm của bạn ... không phải là tiêu chuẩn của PEAR ... chỉ cần đảm bảo có một số quy ước tiêu chuẩn được thi hành.

Ví dụ, tôi là một fan hâm mộ của các định dạng

function foo() { 

vs tiêu chuẩn PEAR ..

function foo() 
{ 

Tóm lại, đừng lo lắng quá nhiều về phù hợp với tiêu chuẩn của họ nếu nó sẽ là một tấn công việc, đặc biệt nếu bạn không đặt các gói trên PECL.

6

Có rất nhiều trường hợp yêu cầu phán đoán của con người và CodeSniffer không có.

Dấu ngoặc kép nhất quán, thụt đầu dòng cải thiện mã. Thiếu không gian sau dấu phẩy trong chức năng gọi? Có lẽ có thể được tha thứ, nhưng đó là ERROR theo CodeSniffer.

IMHO có quá nhiều lỗi do CS báo cáo. Ngay cả các dự án dường như có mã gọn gàng có thể dễ dàng chạy vào các vấn đề về số hàng nghìn. Nó nhanh chóng trở nên mệt mỏi và gần như không thể giải quyết tất cả những vấn đề đó, đặc biệt khi nó là sự pha trộn của các vấn đề thực sự và vô nghĩa cưỡng chế - cả hai đều được đánh dấu là ERRORS.

Bạn có thể nên bỏ qua CS và dành thời gian thực hiện các cải tiến thực tế cho mã (về mặt thiết kế, thuật toán) thay vì chỉ thay đổi hoàn toàn các khoảng trắng và nhận xét (chức năng 1-isAlpha thực sự cần 8 dòng nhận xét ? Có, nếu bạn hỏi CS).

CS có thể dễ dàng trở thành công cụ đánh bóng turd.

+9

Tôi cảm thấy có giá trị chỉ ra rằng tất cả các phản đối trong câu trả lời của bạn thực sự phản đối một tiêu chuẩn mã hóa cụ thể (Zend hoặc PEAR, có lẽ), chứ không phải chính CodeSniffer. Tôi đã tìm thấy nó * rất * hữu ích để xây dựng một tiêu chuẩn mới cho từng dự án, bằng cách chọn và lựa chọn trong số các sniffs "chung chung" và viết riêng của tôi (rất dự án cụ thể) sniffs. Đây thực sự là cách tiếp cận hợp lý duy nhất tôi có thể thấy cho các dự án lớn với mã kế thừa (rằng bạn không có sự viết lại từ đầu) và các quy tắc XML + ngoại lệ đã giúp việc quản lý này trở nên dễ dàng hơn nhiều. – Peter

+1

Hoàn toàn đồng ý với Peter. Để chắc chắn các tiêu chuẩn cơ bản của CS sẽ không đáp ứng nhu cầu của bạn. Bạn phải dành một chút thời gian để - ít nhất - tweakets tinh chỉnh. Viết quy tắc của riêng bạn đến sau, vì nó cần thêm một chút kỹ năng. –

3

Điều này chắc chắn là một điều tốt. Chúng tôi chạy của chúng tôi từ một móc SVN để tất cả các mã phải vượt qua tiêu chuẩn nhà (một sửa đổi từ PEAR) trước khi nó có thể được cam kết (đây là một trong những quyết định tốt nhất tôi từng thực hiện).

Tất nhiên, điều này phù hợp nhất với dự án mới, nơi không có nhiều mã kế thừa để chuyển đổi sang tiêu chuẩn mới. Một cách xung quanh điều này là sửa đổi của bạn SVN trước cam kết móc để chỉ chạy bổ sung mới để các codesniffer và bỏ qua sửa đổi. Bạn có thể làm điều này bằng cách thêm dòng:

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

Điều này sẽ thoát khỏi tập lệnh móc nếu không có mã PHP mới để phân tích cú pháp. Do đó tất cả các tệp mới sẽ cần phải tuân thủ tiêu chuẩn và bạn có thể đưa mã di sản lên tiêu chuẩn theo thời gian của riêng bạn.

3

Lưu ý rằng nếu bạn đang sử dụng Eclipse hoặc Zend IDE, bạn có thể hưởng lợi từ các công cụ tự động làm cho sự tôn trọng tiêu chuẩn ít tốn kém hơn. Bạn cũng có thể sử dụng một công cụ tích hợp liên tục như Hudson hoặc PHPUndercontrol.

  • PDT là một trình soạn thảo mát mẻ cho PHP
  • PDT-Tools là một số plugin cho PDT với một công cụ định dạng tự động
  • DTLK (Toolkit Thư viện động) có thể được sử dụng để khởi động một số kịch bản bên ngoài để kiểm tra tập tin của bạn .

Bạn cũng có thể có một cái nhìn tại PHP Checkstyle mà tôi nghĩ là dễ dàng hơn để cấu hình (từ chối trách nhiệm: Tôi đã làm việc trên nó)

Một số công cụ khác được liệt kê trên trang "tài liệu" của trang web .

+0

Tuyệt vời! Cảm ơn Tchule –

+0

Bất kỳ cách nào để truyền nó từ dòng lệnh (argv) đến lệnh '$ _GET' hoặc' $ _POST'? –

1

CodeSniffer là một điều tuyệt vời để thực hiện, nhưng bạn phải biết cách sử dụng nó. Trừ khi bạn phải tuân thủ một tiêu chuẩn mã hóa nhất định bởi vì bạn đang gửi công việc của mình cho một số dự án bên ngoài, bạn hoàn toàn tự do xác định các tiêu chuẩn mã hóa của riêng mình.

Mã PHPSniffer nên thực hiện điều này rất dễ dàng cho bạn, bởi vì đã có nhiều đoạn mã đơn lẻ mà bạn có thể đưa vào định nghĩa chuẩn mã hóa của riêng bạn và không cần viết chúng từ đầu. Trong khi khám phá các khả năng của các Codeniffers hiện có, bạn có thể sẽ viết một phần mở rộng cho một sniff hiện tại hoặc một sniff trên của riêng bạn, nếu bạn cảm thấy cần thiết.

Nếu bạn muốn bắt đầu với CodeSniffer, bước đầu tiên là lấy một tập hợp các sniff hoàn toàn giống với các tiêu chuẩn mã hóa hiện tại của bạn và kiểm tra các lỗi và cảnh báo kết quả. Không áp dụng một trong các tiêu chuẩn được xác định trước, vì điều này rất có thể sẽ dẫn đến quá nhiều lỗi với quá ít lợi ích nếu cố định. Ví dụ, nếu bạn không sử dụng PHPDoc để tạo ra một tài liệu, nó sẽ không sử dụng để thực hiện tất cả các lỗi mã hóa lỗi về việc thiếu các thẻ và nhận xét của PHPDoc.

11

Đếm tôi trong số những người truyền giáo CodeSniffer. Sau nhiều năm hoài nghi, bây giờ tôi sử dụng nó trên mọi dự án tôi đang làm. Tại sao?

Như Grace Hopper và/hoặc Andrew Tanenbaum nổi tiếng cho biết,

Điều tuyệt vời về các tiêu chuẩn là rằng bạn có rất nhiều để lựa chọn.

Tương tự như vậy, nó hầu như luôn luôn là một ý tưởng tồi ™ để tạo tiêu chuẩn mã hóa của riêng bạn; tạo một cái đủ toàn diện để bao gồm tất cả mã của bạn là cứng và quan trọng hơn, nó sẽ không theo ý thích của người tiếp theo để duy trì mã của bạn, người sẽ cố gắng "cải thiện" tiêu chuẩn của bạn để nó phù hợp với kiểu mã hóa dài. Áp dụng thích hợp tiêu chuẩn bên ngoài, cho dù đó là Zend hoặc PEAR hoặc Kohana hoặc JoeBobBriggsAndHisFifthCousin, cho phép bạn tập trung vào nội dung thay vì định dạng . Vẫn còn tốt hơn, các công cụ như PHP CodeSniffer hoặc hỗ trợ tiêu chuẩn "tươi ra khỏi tin" hoặc những người đã đi trước đó đã gần như chắc chắn thực hiện hỗ trợ như là một tiện ích.

Tiêu chuẩn mã hóa trộn với mã hiện tại không được viết theo tiêu chuẩn đó sẽ cho bạn phù hợp, trừ khi bạn áp dụng hai quy tắc bổ sung, đơn giản.

Loại trừ các tập tin mà có trước thông qua bạn của tiêu chuẩn mã hóa từ đang được kiểm tra, thông qua --ignore dòng lệnh tùy chọn hoặc tương đương thiết lập cấu hình file cùng lúc. Tuy nhiên, khi bạn sửa đổi bất kỳ phần nào của tệp nguồn, hãy cập nhật toàn bộ tệp thành tuân thủ tiêu chuẩn bạn đã chọn.

Tôi chỉ wrote a new blog post về loại điều này.

+0

Điểm tuyệt vời, cảm ơn Jeff. –

+0

Tôi đã tìm thấy loại trừ các tệp có tác dụng làm việc tốt nhất cho sức khỏe tâm thần của tôi. Trên các lớp/phương thức mới chỉ cần lưu ý trong DocBlock 'Hay, điều này được mã hóa theo tiêu chuẩn này'. –

98

Thứ nhất, tôi là người duy trì PHP_CodeSniffer, vì vậy tôi rõ ràng là thiên vị trong lĩnh vực này. Nhưng tôi cũng đã làm việc trên một số cơ sở mã lớn trong 10 năm của tôi như là một nhà phát triển PHP, vì vậy tôi hy vọng tôi có thể đưa ra một số lý do cụ thể để giải thích tại sao các tiêu chuẩn mã hóa lại là một điều tốt. Tôi có thể viết một loạt blog về chủ đề này, nhưng tôi sẽ chỉ cung cấp cho bạn một câu chuyện nhỏ về cách PHP_CodeSniffer xuất hiện để bạn có thể hiểu được vấn đề mà công cụ đã giải quyết cho tôi.

Tôi đã làm việc trên một số dự án CMS lớn. Đầu tiên có một đống mã đằng sau nó và một nhóm phát triển tương đối nhỏ. Chúng tôi không có tiêu chuẩn. Nhưng chúng tôi không có vấn đề gì. Nhóm nghiên cứu rất nhỏ và ở lại với nhau trong một thời gian dài. Chúng tôi quen với nhau.

Sau đó, chúng tôi đã xây dựng một CMS mới. Chúng tôi bắt đầu mới chỉ với một vài nhà phát triển. Sau đó tôi là thành viên của một nhóm chỉ gồm hai nhà phát triển. Một lần nữa, các tiêu chuẩn mã hóa không gây ra bất kỳ vấn đề nào. Tôi và một nhà phát triển khác đến từ cùng một nền tảng và đã thiết lập một số hướng dẫn mà chúng tôi đã theo dõi. Chúng tôi không cần PHPCS lúc đó.

Nhưng nhóm đó đã phát triển một nhà phát triển tại một thời điểm và cuối cùng đã đạt được 12 nhà phát triển toàn thời gian và một số ít đã đến và đi. Một số đến từ CMS cũ và một số đến từ bên ngoài công ty. Tất cả đều có nền tảng khác nhau và cách tiếp cận khác nhau để phát triển. Rõ ràng là ai đã viết mã gì bởi vì các phong cách rất khác nhau. Bất cứ khi nào bạn làm việc trên một cái gì đó phức tạp, trước tiên bạn phải điều chỉnh theo phong cách của họ bởi vì nó không chỉ là cách bạn đã từng nhìn thấy mã. Nó giống như đọc Shakespeare lần đầu tiên. Bạn cần phải làm quen với nó trước khi bạn có thể đọc với tốc độ tự nhiên của mình.

Đối với nhà phát triển, có thêm thời gian để dừng lại và tìm ra một kiểu mã hóa khác chỉ là thời gian lãng phí thuần túy. Đó là một cơ hội cho một ý tưởng để trượt đi trong khi bạn đang bị sa lầy với khoảng cách, thụt đầu dòng và vị trí khung. Vào cuối ngày, những thứ này không quan trọng. Nhưng hãy để tôi nói cho bạn biết, chúng quan trọng rất nhiều nếu chúng khiến các nhà phát triển phá vỡ dòng chảy của họ. Vì vậy, chúng tôi cần một cách để làm cho họ có được quyền ra khỏi con đường và để cho các nhà phát triển làm những gì họ làm tốt nhất.

Đồng thời, chúng tôi đã đào sâu vào JavaScript nhiều hơn nữa. Một ngôn ngữ mới, nơi phong cách thường được ném ra ngoài cửa sổ. Mã đã được sao chép/dán từ các trang web mẫu và được trộn với nhau. Khi học để phát triển mã phức tạp trong một ngôn ngữ mới, nó có ý nghĩa để tìm cách làm cho JS của chúng ta trông giống như PHP của chúng ta. Chúng ta có thể giảm thiểu nó sau này, nhưng chúng ta cần phải có thể chuyển đổi giữa các ngôn ngữ một cách nhanh chóng, một lần nữa để giữ cho luồng của chúng ta.

Vì vậy, PHP_CodeSniffer được sinh ra để thực hiện điều đó. Nó giúp các nhà phát triển làm việc theo cùng một kiểu mã hóa để tạo ra các định dạng và các vấn đề về mồi lửa khác di chuyển hoàn toàn ra khỏi con đường. Nó cho phép bạn xử lý JS của bạn như PHP của bạn đến một mức độ. Tôi sử dụng nó để phát hiện các mùi cụ thể của sản phẩm như các chuỗi không được dịch hoặc các nhà phát triển không sử dụng mã bao gồm lớp thích hợp của chúng tôi. Tôi cũng sử dụng nó cho các mùi ngôn ngữ cụ thể như đảm bảo rằng các dấu phẩy JS giết chết IE không bị bỏ lại. Bạn có thể sử dụng nó cho bất cứ điều gì bạn muốn. Nó đi kèm với đống sniffs dễ dàng hợp nhất với nhau bằng cách sử dụng XML ruleset file. Bạn có thể tự viết mà.Bạn có thể tích hợp các công cụ của bên thứ ba để làm cho nó trở thành một điểm dừng cho phân tích mã tĩnh. Bạn có thể nghiêm túc về các tiêu chuẩn và mùi mã như bạn muốn.

PHP_CodeSniffer, giống như bất kỳ công cụ tìm kiếm nào, sẽ phù hợp với bạn. Bạn không làm việc cho nó. Nếu nó tạo ra quá nhiều lỗi mà bạn không quan tâm, hãy tùy chỉnh tiêu chuẩn để loại bỏ những lỗi bạn không muốn hoặc biến các lỗi thành cảnh báo. Nhưng nếu câu chuyện của tôi có vẻ như một cái gì đó bạn đang trải qua hoặc có thể đi qua trong tương lai, bạn nên xem xét kỹ PHP_CodeSniffer để xem nó có thể giúp bạn không.

Tôi hy vọng sẽ giúp bạn và những người khác, hiểu tại sao các chuẩn mã hóa thực sự quan trọng đối với một số dự án và nhà phát triển. Nó không phải chi tiết. Đó là về việc loại bỏ kiểu mã hóa khỏi danh sách những thứ khiến các nhà phát triển mất tập trung.

+5

Cảm ơn rất nhiều Greg đã chia sẻ câu chuyện của bạn với chúng tôi. Tôi đã rất do dự về việc có bắt đầu sử dụng công cụ này hay không. Bây giờ tôi sẽ sử dụng nó cho chắc chắn. –

Các vấn đề liên quan