Nguyen Tien Si

Drupal Coding standards

Chú ý:

  • Chuẩn code này được áp dụng cho việc phát triển core và các module của Drupal và nó dựa trên chuẩn code của Pear (http://pear.php.net/manual/en/standards.php).
  • Và thêm nữa là module coder sẽ cung cấp cho bạn công cụ kiểm tra chuẩn viết code cho Drupal có phù hợp hay không.
  • Chuẩn viết code này được áp dụng cho việc áp dụng viết module cho Drupal. Ngoài ra nếu sử dụng thêm thư viện hoặc các class bên ngoài thì tuân thủ theo chuẩn của Pear.

Mục lục:

  1. Indenting and Whitespace (thụt đầu dòng và khoảng trắng)
  2. Operators (toán tử)
  3. Control Structures (cấu trúc điều khiển)
  4. Function Calls (lời gọi hàm)
  5. Function Declarations (khai báo hàm)
  6. Arrays (mảng)
  7. Quotes (dấu nháy)
  8. String Concatenations (nối chuỗi)
  9. Comments (ghi chú)
  10. Including Code (khai báo bao gồm)
  11. PHP Code Tags (thẻ dành cho code PHP)
  12. Semicolons (dấu chấm phẩy)
  13. CVS Header (khai báo cho các phần mềm revision)
  14. Example URLs (liên kết ví dụ)
  15. Naming Conventions (Functions, Constants, Global Variables, Classes, Files)
  16. Helper Script
  17. Helper Module

1. Indenting and Whitespace

  • Khi thụt đầu dòng (indent) thì dùng 2 khoảng trắng, không phải tab.
  • Không có khoảng trắng cuối câu.
  • File được format bằng \n ở kết thúc dòng (hay còn gọi là Unix line endings), không dùng \r\n (Windows line endings).

2. Operators (toán tử)

Những toán tử nằm giữa hai giá trị, ví dụ như +, -, =, !=, ==, >,... điều có một khoảng trắng ở đầu mỗi toán tử (trước và sau). Ví dụ: dùng $foo = $bar; sẽ tốt hơn là dùng $foo=$bar;. Đối với những toán tử có một giá trị, ví dụ như ++ thì không có khoảng trắng giữa toán tử và giá trị.

3. Control Structures (cấu trúc điều khiển)

Cấu trúc điều khiển bao gồm: if, for, while, switch, vv.

3.1. Ví dụ đối với if, else:

<?php
if (condition1 || condition2) {
 
action1;
}
elseif (
condition3 && condition4) {
 
action2;
}
else {
 
defaultaction;
}
?>

3.2. Đối với switch:

<?php
switch (condition) {
  case
1:
   
action1;
    break;
  case
2:
   
action2;
    break;
  default:
   
defaultaction;
}
?>

Đối với những cấu trúc điều khiển thì:

  • Sẽ có một khoảng trắng giữa từ khóa điều khiển và dấu ngoặc đơn (đóng, mở), giữa điều kiện và dấu ngoặc đơn là không có khoảng trắng.
  • Đối với thụt đầu dòng thì có hai khoảng trắng.
  • Tương tự cho các cấu trúc điều khiển khác.

4. Function Calls (lời gọi hàm)

Lời gọi hàm sẽ không có khoảng trắng giữa tên hàm và dấu ngoặc đơn và tham số đầu tiên. Mỗi tham số điều cách nhau bởi một khoảng trắng thông qua dấu phẩy (,) và không có khoảng trắng giữa tham số cuối cùng với dấu ngoặc đóng. Ví dụ:

<?php
  $var
= foo($bar, $baz, $quux);
?>

Đối với một khối các lời gọi hàm thì có dạng như sau để tăng tính dễ đọc:

<?php
  $short        
= foo($bar);
 
$long_variable = foo($baz);
?>

5. Function Declarations (khai báo hàm)

Các đối số có giá trị mặc định được đặt ở cuối danh sách đối số. Cố gắng trả lại một giá trị có nghĩa từ một hàm, nếu có giá trị thích hợp. Ví dụ:
<?php
function funstuff_system($field) {
 
$system["description"] = t("This module inserts funny text into posts randomly.");
  return
$system[$field];
}
?>

6. Arrays (mảng)

Mảng được định dạng với một khoảng trắng đối với mỗi phần tử sau dấu phẩy (,) và một khoảng trắng giữa các dấu => . Xem ví dụ:

<?php
$some_array
= array('hello', 'world', 'foo' => 'bar');
?>

Nếu một array nhiều hơn 80 ký tự thì tách ra thành nhiều dòng (thông thương khai báo menu thông qua hook_menu). Xem ví dụ:

<?php
$form
['title'] = array(
 
'#type' => 'textfield',
 
'#title' => t('Title'),
 
'#size' => 60,
 
'#maxlength' => 128,
 
'#description' => t('The title of your node.'),
);
?>

7. Quotes (dấu nháy)

Dùng dấu nháy đơn khi không có biến nào trong chuỗi, còn dùng dấu nháy đôi khi có biến xuất hiện trong chuỗi. Ví dụ:

<?php
echo "<h2>$header</h2>";
echo
'He\'s a good person.';
?>

Chú ý: Dấu nháy đơn sẽ chạy nhanh hơn dấu nháy đôi vì dấu nháy đơn khi chạy sẽ bỏ qua các biến có trong chuỗi đó.

8. String Concatenations (nối chuỗi)

Luôn sử dụng khoảng trắng giữa dấu . và các thành phần cần nối, ví dụ:

<?php
  $string
= 'Foo' . $bar;
 
$string = $bar . 'foo';
 
$string = bar() . 'foo';
 
$string = 'foo' . 'bar';
?>

Khi chỉ có một biến thì có thể dùng nháy đôi, ví dụ:

<?php
  $string
= "Foo $bar";
?>

Khi sử dụng dấu .= thì có một khoảng trắng giữa biến và các thành phần cần nối, ví dụ:

<?php
  $string
.= 'Foo';
 
$string .= $bar;
 
$string .= baz();
?>

9. Comments (ghi chú)

Chuẩn ghi chú được tuân theo chuẩn Doxygen.

Nên ghi chú những gì lại những gì trước và sau khi làm việc nào đó (viết code, phân tích). Đối với một coder thì việc ko ghi chú cho công việc của mình thì được coi đó là hành đông can đảm, nhưng nó không bao giờ được khuyến khích. Một team làm việc thì việc ghi chú lại là cực kỳ cần thiết đối với các thành viên khác hiểu bạn làm gì, ví dụ:

<?php
// Unselect all other contact categories.
db_query('UPDATE {contact} SET selected = 0');
?>

10. Including Code (khai báo bao gồm)

  • Dùng include_once được khuyến cáo dùng khi bạn sử dụng thư viện bên ngoài nhưng sự tồn tại của nó không gây đến sự gián đoạn của chương trình (những tài nguyên gây gián đoạn chương trình có thể kể đến như các bộ lọc bảo mật, kết nối cơ sở dữ liệu, lời gọi dịch vụ web...).
  • Dùng require_once thì ngược lại khi thư viện đó nó gây ảnh hưởng đến sự gián đoạn của chương trình. Vì khi dùng nó thì khi không load được tài nguyền nó sẽ báo lỗi fatal error làm ngừng ứng dụng.

Ví dụ:

<?php
require_once 'filename.class.php';
include_once
'filename.class.php';
?>

Ví dụ khác:

<?php
include_once ./includes/mymodule_formatting.inc
?>

Trên D7 thì có thêm thư mục gốc:

<?php
require_once DRUPAL_ROOT . '/' . variable_get('cache_inc', 'includes/cache.inc');
?>

Chú ý: include_once()require_once() chỉ là cách khai báo, không phải là hàm, tránh nhầm lẫn.

11. PHP Code Tags (thẻ dành cho code PHP)

  • Luôn luôn dùng thẻ dạng <?php ?> cho mã được viết trên ngôn ngữ PHP. Không nên dùng cách viết ngắn gọn như <? ?>.
  • Ở PHP 4 dấu đóng của code ?> có thể có hoặc không. Đối với các mã trong Drupal thì dấu đóng ?> không được dùng nữa.

12. Semicolons (dấu chấm phẩy)

PHP là ngôn ngữ nhiều dòng mà mỗi dòng luôn luôn dùng dấu chấm phẩy ở cuối của khối dòng, hoặc dòng đơn. Ví dụ:

<?php print $tax; ?> -- YES
<?php print $tax ?> -- NO

13. CVS Header (khai báo cho các phần mềm revision)

Tất cả source code được khai báo trong phần comment của đầu file như sau, ví dụ đối với PHP:

<?php
// $Id$

Nó được thay thế bởi phần mềm revision (SVN) như sau:

<?php
// $Id: uc_feature.admin.inc 2167 2010-02-05 08:33:18Z si-nguyen.tien $

Ví dụ đối với file txt:

; $Id$

Được thay thế bằng:

; $Id: CHANGELOG.txt 2127 2010-02-01 12:06:11Z si-nguyen.tien $

14. Example URLs (liên kết ví dụ)

Sử dụng example.com cho tất cả những liên kết ví dụ, dựa trên RFC 2606.

15. Naming Conventions (Functions, Constants, Global Variables, Classes, Files)

Functions (tên hàm)

  • Tên hàm sử được viết thường mỗi từ cách nhau dấu gạch dưới , tên hàm thông thường dùng nhóm/tên module làm tiền tố (prefix) để tránh đụng chạm tên giữa các module với nhau.
  • Những hàm nào chỉ dùng trong module/lớp đó thì thường đặt có dấu gạch dưới.

Constants (hằng)

  • Tất cả các tên hằng đều viết hoa và với mỗi một từ cách nhau bằng dấu gạch dưới.

Global Variables (biến toàn cục)

  • Nếu cần định nghĩa biến toàn cục thì tên biến là một từ đơn và được viết thường và duy nhất.

Class (lớp)

  • Lớp được viết theo chuẩn CamelCase, ví dụ:

<?php
abstract class DatabaseConnection extends PDO {
?>

  • Tên phương thức (method) và thuộc tính (property) sẽ được viết theo chuẩn lowerCamelCase, ví dụ:

<?php
public $lastStatement;
?>

  • Các thành viên lớp dạng private (nghĩa là thành viên đó được tạo ra chỉ nhằm để tiếp xúc với bên trong lớp mà chúng được khai báo mà thôi) thì được bắt đầu bằng một dấu gạch dưới, ví dụ:

<?php
_sort
()
_initTree()
$this->_status
?>

  • Quy tắc tương tương tự cũng sẽ áp dụng cho các thành viên lớp có điều khiển truy cập là protected, ví dụ:

<?php
protected $_somevar
protected function _initTree()
?>

Dùng _ để giảm thiểu số lượng tên chiếm dụng vì PHP không hỗ trợ method overloading.

File names (tên file)

  • Tất cả các tên file ghi chú, tài liệu đều có phần mở rộng là .txt, tất cả tên file đều viết HOA, ví dụ: README.txt, CHANGELOG.txt, INSTALL.txt, vv.

16. Helper Script

Đây là những đoạn script được lưu trong thư mục scripts/ từ thư mục gốc, sử dụng đơn giản như sau:
./code-style.pl path/to/file/example.module

17. Helper Module

Đây là những module đóng góp từ cộng đồng giúp review code một cách nhanh chóng, tự động và module thực hiện việc đó là module coderCoder Tough Love

No comments

Add your comment

The content of this field is kept private and will not be shown publicly. If you have a Gravatar account, used to display your avatar.
  • You can use Markdown syntax to format and style the text. Also see Markdown Extra for tables, footnotes, and more.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.

More information about formatting options