FSC - CodeConvention(chuẩn viết code và thiết kế giao diện)
Trang 1CODE CONVENTION (Chuẩn viết code và thiết kế giao diện)
Hà Nội, Ngày 11/02/2011
Trang 2I MỞ ĐẦU 4
1 Mục đích 4
2 Phạm vi 4
3 Thuật ngữ và viết tắt 4
4 Tham khảo 4
II CHUẨN VIẾT CODE TRONG C# 5
1 Quy tắc đặt tên 5
2 Vòng lặp 8
3 lập trình hướng đối tượng 8
4 Ngoại lệ 9
5 Sự kiện.(Events) 10
6 Biến và kiểu dữ liệu(Various data types) 11
7 Khuôn dạng code 13
8 Ghi chú 13
III CHUẨN VIẾT CODE TRONG SQL SERVER 15
1 Chuẩn đặt tên trong SQL SERVER 15
2 Chuẩn viết mã nguồn trong SQL Server 17
3 Kiểu dữ liệu 18
4 Thủ tục 18
5 Các cân nhắc khi viết lệnh(Performance considerations) 19
IV CHUẨN VIẾT CODE TRONG ORACLE PL/SQL 20
1 Chuẩn đặt tên trong ORACLE PL/SQL 20
2 Khuôn dạng code 21
3 Sử dụng ngôn ngữ.(Language Usage) 22
1.1 Xử lý ngoại lệ 26
1.2 Đối tượng lưu trữ 27
V CHUẨN THIẾT KẾ GIAO DIỆN 28
1 Chuẩn thiết kế giao diện Winform 28
1.1 Chuẩn đặt tên trong Winform 28
Trang 31.2 Chuẩn thiết kế giao diện các thành phần control của WinForm 29
1.2 Chuẩn thiết kế giao diện các thông báo(Message) 32
2 Chuẩn thiết kế giao diện Webform 33
2.1 Chuẩn đặt tên các thành phần control của ASP.NET 33
2.2 Tiêu chuẩn tối ưu 34
2.3 Tiêu chuẩn về hiển thị 34
Trang 4I MỞ ĐẦU
1 Mục đích
Mục đích của tài liệu là hướng dẫn thi hành viết mã và thiết kế giao diện Winform và Webform theo quy ước và chuẩn hoá sự trình bày mã nguồn và thiết kế giao diện của các developer
Trang 5II CHUẨN VIẾT CODE TRONG C#
1 Quy tắc đặt tên
1 Sử dụng tiếng Anh để khai báo tên
Ví dụ: magnetization, optimizing, realize,
2 Sử dụng kiểu Pascal và Camel để đặt tên
- Với kiểu Pascal chữ cái đầu tiên của mỗi từ được viết hoa
Trang 69 Không sử dụng chữ cái đơn để đặt tên ví dụ như i, n, s…
Trường hợp ngoại lệ là khi nó được sử dụng trong vòng lặp
10 Không sử dụng dấu gạch dưới „_‟ cho tên biến cục bộ
11 Tất cả các biến thành viên đều được bắt đầu bằng dấu gạch dưới “m_” để phân biệt với biến cục bộ Phần còn lại của tên biến được sử dụng cú pháp Pascal
12 Không sử dụng tên biến trùng với các từ khóa
13 Thêm tiền tố “is” cho tên biến, phương thức và thuộc tính Boolean
Ví dụ:
private bool isFinished
14 Phương thức trả về giá trị nên có tên mô tả giá trị được trả về
Ví dụ:
GetObjectState()
15 Các biến thành viên nên được khai báo trên cùng và trên từng dòng tách biệt
16 Khai báo biến cục bộ gần nơi đầu tiên nó được sử dụng
17 Tên của không gian(namespace) tên phải theo khuôn dạng chuẩn sau:
<company name>.<product name>.<top level module>.<bottom level module>
18 Quy định đặt tên cho các thành phần giao diện của Winform cách đặt tiền tố theo bảng sau:
Trang 719 Tên tập tin phải phù hợp với tên lớp
Ví dụ: class HelloWorld thì tên tập tin là HelloWorld.cs
Trang 820 Sử dụng kiểu Pascal cho tên tập tin
21 Không sử dụng các chữ cái có thể bị lẫn với chữ số và ngược lại
Ví dụ:
Không viết : bool b001 = (lo == l0) ? (I1 == 11) : (lOl != 101);
2 Vòng lặp
1 Không thay đổi giá trị biến lặp trong vòng lặp For:
Cập nhật các biến lặp trong vòng lặp thường gây nhầm lẫn thậm chí sẽ còn tệ hơn nếu bạn thay đổi biến lặp tại hơn một vị trí Luật này áp dụng cho cả vòng lặp Foreach
2 Thay đổi giá trị biến lặp gần nơi điều kiện của vòng lặp được chỉ định
3 Tất cả các điều khiển If, Else, While, Do, Swicth phải được theo sau bởi một cặp dấu ngoặc nhọn ({ }) ngay cả khi trong thân nó rỗng
Ví dụ:
// Count number of elements in array
for (int i = 0; i < y; i++)
{
}
Ngoại lệ:
- Nếu câu lệnh “else” có thể trực tiếp theo sau một câu lệnh “if”
- Nếu mệnh đề “if” theo sau bởi một câu lệnh đơn thì không cần đặt nó trong một khối và toàn bộ câu lệnh sẽ được viết trên một dòng
Ví dụ:
if (x < 10) x = 0;
4 Tất cả các khối lệnh switch đều phải có nhãn “Default” như là nhãn “Case” cuối cùng
5 Không so sánh rõ ràng điều kiện là đúng hay sai
Ví dụ:
while (((condition == true) == true) == true //Sai
while (condition) // Đúng
3 lập trình hướng đối tượng
1 Cung cấp một bộ khởi dựng mặc định „Private‟ nếu chỉ có phương thức và thuộc tính tĩnh (static) trong lớp
- Ngoại lệ:
Trang 9+ Nếu lớp đó được khai báo là “Static” thì không yêu cầu tạo bộ khởi dựng
4 Ngoại lệ
1 Không bao giờ đưa ra một “Catch Exception” mà không làm gì cả Nếu bạn che giấu một ngoại lệ bạn sẽ không bao giờ biết một ngoại lệ có xảy ra hay không Rất nhiều nhà phát triển sử dụng phương pháp này để bỏ qua các lỗi không đáng kể Nên tránh các ngoại lệ bằng cách kiểm tra tất cả các lỗi điều kiện lập trình Trong mọi trường hợp bắt một ngoại lệ mà không làm gì cả là không được phép
2 Trong trường hợp ngoại lệ hãy đưa ra một thông báo thân thiện tới người sử dụng Đưa ra chỉ tiết nhất các thông tin về lỗi(nếu có thể)
3 Chỉ bắt ngoại lệ cụ thể không phải chung chung
// read from file
} catch (FileIOException ex) {
Trang 10// read from file
// it was a file error or some other error
// Here you are hiding an exception
// In this case no one will ever know that an exception happened
và kiểm tra lỗi không đáng tin cậy Trong những trường hợp này bạn nên sử dụng bộ
xử lý ngoại lệ và cố gắng khắc phục lỗi
6 Không nên viết một khối Try-Catch lớn Nếu cần thiết chỉ viết mỗi khối Try – Catch cho một công việc mà bạn thực hiện Điều này giúp bạn dễ dàng tìm được đoạn mã nguồn nào của bạn đưa ra ngoại lệ để đưa ra thông báo cho người dùng
7 Chỉ đưa ra ngoại lệ trong trường hợp đặc biệt
8 Không dùng khối Try- Catch cho vòng lặp
9 Không lồng một khối Try – Catch trong một khối catch khác
5 Sự kiện.(Events)
1 Luôn luôn kiểm tra thể hiện của một sự kiện có null không trước khi gọi
2 Luôn sử dụng mặc định EventHandler và EventArgs cho hầu hết những sự kiện đơn giản
Trang 116 Biến và kiểu dữ liệu(Various data types)
1 Sử dụng kiểu “enum” bất cứ nơi nào cần thiết, không dùng kiểu số và kiểu chuỗi để chỉ ra các giá trị riêng rẽ
void SendMail (string message, MailType mailType) {
switch ( mailType ) {
case MailType.Html:
// Do something break;
case MailType.PlainText:
// Do something break;
case MailType.Attachment:
// Do something break;
default:
// Do something break;
} }
Không tốt:
void SendMail (string message, string mailType) {
switch ( mailType ) {
case "Html":
// Do something break;
Trang 12case "PlainText":
// Do something break;
case "Attachment":
// Do something break;
default:
// Do something break;
} }
2 Cố gắng khởi tạo biến tại nơi mà bạn khai báo chúng
3 Luôn sử dụng bí danh của kiểu dữ liệu được xây dựng trong C# hơn là dùng của hệ thống kiểu chung của NET
Ví dụ:
short không dùng System.Int16
int không dùng System.Int32
long không dùng System.Int64
string không dùng System.String
4 Khai báo các biến thành viên kiểu “Private” Sử dụng các thuộc tính truy cập để cung cấp khả năng truy cập tới chúng như “Public”, “Protect”, “Internal”
5 Chỉ sử dụng kiểu “long” cho các biến có khả năng chứa đựng giá trị lớn hơn kiểu
“int”
6 Sử dụng kiểu “double” cho phân số để đảm bảo độ chính xác trong tính toán
7 Sử dụng kiểu “int” cho những giá trị số không phải phân số, các biến đó sẽ phù hợp với kiểu dữ liệu “int” ngay cả khi biến đó dùng cho một số không âm
8 Sử dụng kiểu “float” cho các phân số khi nó không phù hợp với kiểu “double” hay
“Decimal”
9 Tránh sử dụng kiểu “float” trừ khi bạn hiểu rõ các tác động khi có sự tính toán
10 Sử dụng kiểu “decimal” cho phân số khi nó cần được làm tròn tới một độ chính xác nhất định để tính toán Điển hình các tính toán liên quan đến tiền bạc
11 Tránh chỉ định kiểu cụ thể cho một “enum”, sử dụng kiểu mặc định là “int” trừ khi bạn có nhu cầu cụ thể về việc sử dụng kiểu “long”(rất hiếm)
12 Chỉ khai báo hằng (constants) cho những loại đơn giản
13 Tránh chuyển đổi trực tiếp thay vào đó sử dụng từ khóa “as” và kiểm tra null
Ví dụ:
object dataObject = LoadData();
DataSet ds = dataObject as DataSet;
if(ds != null)
Trang 13{…}
14 Không bao giờ ghép chuỗi trong vòng lặp
7 Khuôn dạng code
1 Luôn đặt 2 dấu ngoặc nhọn({ và }) trên một dòng mới
2 Luôn sử dụng 2 dấu ngoặc nhọn ({ và }) trong câu lệnh điều kiện
3 Khai báo các biến độc lập trên từng dòng tách biệt
4 Đặt các Namespace dùng “using” trên đầu của file Nhóm các Namespace NET trên các Namespace tùy biến (custom namespace)
5 Nhóm nội dung trong thân lớp theo thứ tự như sau:
6 Sử dụng “#region” để nhóm các phần code có liên quan tới nhau
7 Sử dụng Tab để thụt đầu dòng không dùng backspace Kích thước mặc định của Tab
là 4
8 Sử dụng một dòng trắng để phân chia nhóm mã nguồn có cùng logic
9 Chỉ nên có một dòng trắng để tách biệt 2 phương thức trong một lớp
8 Ghi chú
1 Tất cả các ghi chú nên được viết bằng cùng ngôn ngữ (tiếng Anh), đúng ngữ pháp và chứa các dấu câu thích hợp
2 Dùng ký hiệu // hoặc /// không dùng /*….*/
3 Không dùng nhiều dấu sao “*” cho khối comment
// Format a message and display
string fullMessage = "Hello " + name;
DateTime currentTime = DateTime.Now;
string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString();
MessageBox.Show ( message );
Trang 14Không tốt:
// Format a message and display
string fullMessage = "Hello " + name;
DateTime currentTime = DateTime.Now;
string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString();
Trang 15III CHUẨN VIẾT CODE TRONG SQL SERVER
1 Chuẩn đặt tên trong SQL SERVER
Quy tắc đặt tên view tương tự như với bảng trừ một số ngoại lệ sau
- View không chỉ đại diện cho một bảng đơn lẻ Một view có thể là liên kết dữ liệu của 2 hay nhiều bảng với một điều kiện liên kết Vì thế trong trường hợp này nên xem xét tới việc nối tên của các bảng cơ sở làm tên View
Ví dụ: Một view được lấy dữ liệu từ 2 bảng „Customer‟ và bảng „Address‟ vậy tên view sẽ tương ứng là „CustomerAddress‟
3 Thủ tục
- Tên thủ tục được viết liền bằng tiếng Anh
- Tên thủ tục nên sử dụng các động từ mô tả hành động mà nó thực hiện Ví dụ: 'GetCustomerDetails'
- Giống như đã trình bày với quy tắc đặt tên bảng, bạn có thể nhóm các thủ tục có cùng nhóm logic vào một nhóm sử dụng tiền tố Ví dụ có các thủ tục xử lý vấn đề liên quan tới bảng “Order” bạn có thể viết:
- Tên trigger được viết liền bằng tiếng Anh
- Tên trigger nên có sự liên hệ với tên bảng mà nó phụ thuộc
Trang 16- Tên trigger nên có các ký tự thể hiện loại của nó Insert – ins, Update – upd, Delete – del
Ví dụ sau là các trigger phụ thuộc bảng titles
Cấu trúc tên của index như sau:
Tên bảng + tên cột + U/NU+ Cidx/Nidx
Trong đó:
+ U: Unique
+ NU: Non Unique
+ Cidx: Clustered index
+ Nidx: Non clustered index
ví dụ 1: index thuộc loại unique clustered
- Tên cột được viết bằng tiếng Anh không có khoàng trống
- Tên cột cần có nghĩa và khái quát được nội dung của cột Ví dụ:
Trang 17CustomersID
8 Khóa ngoại
- Tên khóa ngoại được viết theo cấu trúc:
Tên bảng được tham chiếu+khóa chính
9 Ràng buộc Default và ràng buộc Check
- Tên ràng buộc Default có tiền tố “DEF”+ tên cột
- Tên ràng buộc check có tiền tố “CHK” + tên cột
2 Chuẩn viết mã nguồn trong SQL Server
1 Code cần dễ đọc và có khuôn khổ rõ ràng
- Viết chú thích trong thủ tục, trigger và các khối lệnh SQL bất cứ khi nào có vấn đề không rành mạch Điều này giúp các lập trình viên khác có thể hiểu được code của bạn
- Luôn sử dụng Tab để thụt đầu dòng khi cần thiết giúp việc đọc mã nguồn được dễ dàng
- Luôn thống nhất trong việc sử dụng chữ in hoa và in thường trong việc đặt tên cho đối tượng và khi sử dụng tên đó trong một thủ tục, trigger,…
Ví dụ: Khi bạn tạo một bảng với tên “MyTable” khi viết trong câu select bạn nên viết : SELECT * FROM MyTable
- Không dùng số của cột trong mệnh đề ORDER Sẽ khiến code khó hiểu
sử dụng để xử lý cả điều kiện Join và dữ liệu lọc Ví dụ 1 cho kiểu join ANSI, ví dụ
2 cho kiểu join cũ hơn
Trang 18SELECT a.au_id, t.title
FROM titles t, authors a, titleauthor ta
WHERE
a.au_id = ta.au_id AND
ta.title_id = t.title_id AND
t.title LIKE '%Computer%'
- Để câu lệnh SQL dễ đọc viết mỗi mệnh đề trên một dòng mới và thụt đầu dòng nếu cần thiết
Ví dụ:
SELECT title_id, title
FROM titles
WHERE title LIKE '%Computer%' AND
title LIKE '%cook%'
- Không sử dụng “Go to” hoặc hạn chế tới mức tối thiểu vì dùng nhiều gây khó đọc
và khó hiểu
- Luôn viết tên cột cần insert trong câu lệnh INSERT để tránh sai sót khi có sự thay đổi cấu trúc của bảng
3 Kiểu dữ liệu
- Sử dụng kiểu dữ liệu CHAR cho một cột chỉ khi cột đó không thể null
- Sử dụng kiểu dữ liệu Unicode NCHAR, NVARCHAR hoặc NTEXT nếu cơ sở dữ liệu của bạn không chỉ lưu trữ các ký tự tiếng Anh Chỉ sử dụng kiểu dữ liệu Unicode khi thực sự cần thiết vì nó chiếm gấp hai lần không gian không bộ nhớ so với kiểu dữ liệu không phải Unicode
- Cố gắng không dủng kiểu dữ liệu TEXT và NTEXT để lưu một khối lượng lớn dữ liệu văn bản
4 Thủ tục
- Không gọi hàm liên tục trong một thủ tục, trigger, một hàm hay một lô (batches) khác Ví dụ bạn cần lấy chiều dài của một biến kiểu string tại nhiều nơi trong thủ tục Thay vì gọi hàm LEN nhiều lần bạn gọi hàm đó một lần duy nhất và lưu kết quả vào một biến cho lần sau sử dụng
Trang 19- Nếu thủ tục của bạn luôn trả về một tập kết quả là hàng đơn nên xem xét tới việc
sử dụng tham số OUTPUT để trả về tập kết quả đó thay vì sử dụng câu lệnh SELECT
- Không đặt tên thủ tục với tiền tố “SP_”, tên này giành riêng cho thủ tục hệ thống
5 Các cân nhắc khi viết lệnh(Performance considerations)
- Không dùng “SELECT *” trong câu truy vấn mà viết chính xác tên cột bạn cần lấy
ra sau câu SELECT
- Tránh sử dụng bảng tạm hoặc sử dụng ở mức tối thiểu
- Tránh sử dụng ký tự đại diện tại đầu của một từ khi tìm kiếm với từ khóa như LIKE
- Hạn chế sử dụng toán tử không bằng (<> và NOT)
- Sử dụng bảng được tạo ra bởi một câu truy vấn như truy vấn con bất cứ khi nào có thể Chúng ta sẽ xem xét hai ví dụ sau:
ORDER BY Salary Desc)
Sẽ chạy chậm hơn ví dụ 2 sau:
- Thực hiện kiểm tra toàn vẹn tham chiếu và kiểm tra tính hợp lệ của dữ liệu nên sử dụng các ràng buộc (constraint) như khóa ngoại hay ràng buộc “check” thay vì dùng trigger
- Chỉ dùng trigger khi bạn chắc rằng không thể sử dụng được bằng ràng buộc Sử dụng ràng buộc sẽ tiết kiệm thời gian và bạn không cần viết code để kiểm tra
Trang 20IV CHUẨN VIẾT CODE TRONG ORACLE PL/SQL
1 Chuẩn đặt tên trong ORACLE PL/SQL
1 Quy tắc đặt tên gói (Naming package)
- Tên của một gói theo cấu trúc sau:
Tên khóa: APPLICATION_PK
b Quy tắc đặt tên khóa ngoại
Trang 21Tên khóa ngoại bao gồm tên viết tắt (là các chữ cái đầu tiên của tên bảng và chỉ gồm 4
ký tự) của 2 bảng và theo sau là hậu tố “_FK” Tên hai bảng theo thứ tự bảng tham chiếu, bảng chứa khóa ngoại Giữa các chữ có dấu gạch dưới
Ví dụ:
Tên bảng tham chiếu: APPLICATION
Tên bảng chứa khóa ngoại: FUNCTION
Tên khóa ngoại: APPL_FUNC_FK
7 Quy tắc đặt tên một số đối tượng khác
- Ràng buộc check: tên_CHK
- View : tên_V
- Sequences: tên_SEQ
8 Quy tắc đặt tên biến
- Quy tắc đặt tên con trỏ
+ Với con trỏ chỉ đọc ta thêm tiền tố “cr_”
+ Với con trỏ có thể cập nhật ta thêm tiền tố “cu_”
- Biến cục bộ bắt đầu với tiền tố “l”
- Biến toàn cục và hằng số lần lượt được thêm tiền tố “g”, “c”
- Ngoại lệ (Exception): e_tên ngoại lệ
- Tham số đầu vào: i_tên tham số
- Tham số đầu ra: o_tên tham số
- Tham số vào ra(In/out parameter): io_tên tham số
9 Quy tắc đặt tên trigger
Tên trigger được viết bằng tiếng Anh gồm tên bảng + tên viết tắt loại trigger + hậu tố