Với đặc thù dự án: quy mô lớn, thực hiện phát triển và triển khai đồng thời nên rất khó để tổ chức. Quy mô lớn được thể hiện: có nhiều phân hệ khác nhau nên để phát triển dự án đã thực hiện triển khai từng phân hệ một, đồng thời phải lựa chọn cho mình phương án nhiều người cùng tham gia thực hiện hay gọi là làm việc nhóm. Nhờ đó mà nhóm phát triển dự án được thành lập, gồm 8 thành viên và mỗi thành viên nhận công việc theo bảng phân công công việc mà nhóm phát triển dự án đưa ra dựa trên đặc thù của phần mềm.
Với việc chọn phương án phát triển phần mềm theo nhóm, trước khi thực hiện công việc, nhóm đã thông qua bảng quy ước lập trình. Nhờ có quy ước trong lập trình nên công việc của nhóm mới có thể thực hiện một cách đồng bộ, trơn tru và luôn tạo nên bầu không khí làm việc thỏa mái dễ chịu, giúp các thành viên trong nhóm làm việc có hiệu quả. Để có được những điều đó thì nhóm chọn cho mình môi trường làm việc như sau.
3.2.1. Tổ chức môi trường làm việc
Dự án đổi mới quy trình quản lý nhà trường được triển khai ở các cấp: cấp trường, cấp phòng/sở và cấp bộ nên phần mềm của dự án được thực hiện hoàn thiện từng bước. Hoàn thiện từ cấp trường đến cấp bộ và các cấp trên với CSDL tập trung, chia sẻ giữa các phân hệ, thống nhất cấu trúc CSDL đi đến chuẩn hóa định dạng cho
việc trao đổi thông tin sau này giữa các cấp. Mặt khác, trong từng cấp phải tập trung vào các nghiệp vụ tương đối ổn định, bức thiết và giải quyết tính đa dạng của từng nghiệp vụ tại các trường, vùng miền khác nhau. Do mặt bằng trình độ khác nhau của các vùng miền nên đòi hỏi phần mềm phải đơn giản, dễ sử dụng tới mức có thể: giao diện trên nền Windows, thống nhất phương thức quản trị và đăng nhập hệ thống, cơ sở hạ tầng chênh lệch như: cấu hình phần cứng thì đơn giản, quy mô lớn, giảm thiểu chi phí nên tận dụng các phiên bản phần mềm nền tảng miễn phí, mã nguồn mở, hệ thống có tính mở giúp hỗ trợ các nghiệp vụ mới sau này khi cần thiết. Từ những yếu tố đó giúp nhóm phát triển phần mềm đưa ra quyết định lựa chọn môi trường phát triển sao cho đáp ứng với đặc thù đã nêu, môi trường phát triển phải giúp tăng năng suất, đơn giản dễ bảo trì cũng như khi muốn mở rộng phải dễ dàng. Ngoài ra còn giúp giảm nhẹ thao tác viết mã cho người lập trình và cho phép tạo ra các ứng dụng mà các yếu tố bên ngoài có thể tương tác được với các chương trình đó.
Vì vậy nhóm sử dụng các công cụ sau hỗ trợ cho việc phát triển:
- Sử dụng ngôn ngữ lập trình hướng đối tượng là C# theo chuẩn .Net Framework 3.5 của Microsoft.
- Hệ quản trị CSDL: SQL Express Edition (phiên bản miễn phí của Microsoft) với hệ điều hành XP 32 bit cùng với IDE Visual Studio 2008.
- Công cụ hỗ trợ kiểm soát phiên bản Subversion
- Phương pháp kiểm thử là kiểm thử đơn vị (NUnit), kiểm thử hộp trắng, kiểm thử hộp đen và còn sử dụng thêm một công cụ nữa đó là log4net. Tại sao nhóm lại sử dụng ngôn ngữ lập trình hướng đối tượng là C# mà không phải là ngôn ngữ lập trình hướng đối tượng khác như Java, C, C++… Thực tế, với ngôn ngữ này các thành viên trong đội dự án sử dụng thành thạo, đồng thời là xu thế phát triển hiện đại và sức mạnh của ngôn ngữ này. Sức mạnh của ngôn ngữ này được thể hiện: Thứ nhất, ngôn ngữ đơn giản, hỗ trợ dễ dàng bởi công cụ trên nền Windows như việc sử dụng kết hợp với MS SQL, Excel của Microsoft. Thứ hai, nó là ngôn ngữ hiện đại, nó có thể xử lý các ngoại lệ, thu gom bộ nhớ tự động, có những kiều dữ liệu mở rộng và bảo mật mã nguồn. Thứ ba, là ngôn ngữ hướng đối tượng, mạnh mẽ, mềm dẻo, ít từ khóa và hướng mô đun.
Với việc lựa chọn môi trường phát triển đúng đắn cho nhóm phát triển, sẽ giúp cho việc kiểm soát chất lượng của từng giai đoạn thực hiện dễ dàng và chính xác. Đảm bảo chất lượng cho từng giai đoạn phát triển cũng chính là đảm bảo chất lượng cho sản phẩm cuối cùng khi chuyển giao cho khách hàng. Giúp giảm thiểu lỗi khi
thực hiện triển khai trên diện rộng, khi bảo trì hoặc khi mở rộng phần mềm. Tạo niềm tin cho khách hàng khi sử dụng sản phẩm cũng là nâng cao uy tín cho nhóm phát triển giúp nhóm phát triển có nhiều cơ hội nhận được các dự án phần mềm khác.
3.2.2. Quy ước lập trình
Thấy được ý nghĩa của việc tạo ra quy ước lập trình trước khi bắt tay vào việc nên nhóm phát triển đã đưa ra quy ước lập trình cụ thể như sau :
Các quy ước lập trình phổ biến
- Chú thích (comments)
- Kiểu lùi dòng (indent style)
- Cách đặt tên (naming)
- Kỹ thuật lập trình (programming practices)
- Nguyên tắc lập trình (programming principles)
- Bí quyết lập trình (programming rules of thumb)
- Phong cách lập trình (programming style)
Kiểu lùi dòng (indent style)
- Gióng hàng thẳng theo dấu ngoặc mở đầu tiên (dấu ngoặc phải ở dòng tiếp theo)
- Mỗi lần lùi dòng là 1 ký tự tab (\t), không lùi dòng bằng nhiều phím trắng (Space)
Bằng cách gióng hàng thế này, mã nguồn được thể hiện hết sức rõ ràng. Các lệnh bên trong được bao bởi 2 dấu đóng mở ngoặc bao tương ứng. Ngoài ra, 2 dấu này đứng cùng cột trong những dòng riêng lẻ nên việc tìm những dấu cặp đôi cũng hết sức dễ dàng. Ví dụ: while (x == y) { something(); somethingelse(); } finalthing();
Cách đặt tên (Naming convention)
Một quy ước đặt tên là tập hợp các quy tắc chọn ký tự được dùng cho định danh của biến, kiểu và hàm… trong mã nguồn và tài liệu. Nhìn chung, các lý do căn bản cho việc sử dụng quy ước đặt tên bao gồm:
- Giảm công sức cần cho việc đọc và hiểu mã nguồn
- Tăng mức độ biểu hiện của mã nguồn (ví dụ, không cho phép tên quá dài hoặc viết tắt)
Một số lợi ích từ việc áp dụng quy ước đặt tên là:
- Cung cấp thêm thông tin về việc sử dụng những định danh đang được quan tâm
- Tăng cường tính nhất quán trong toàn đội phát triển
- Cho phép việc dùng các công cụ refactoring tự động/tìm kiếm/thay thế với khả năng lỗi ít nhất
- Tăng tính rõ ràng trong trường hợp nhập nhằng
- Tránh trùng tên nếu sản phẩm từ nhiều tổ chức khác nhau được kết hợp lại…
Quy ước trong nhóm được định nghĩa như sau:
Vĩ lệnh
Mỗi vĩ lệnh (macro) thực ra là một khai báo hằng số trong các chương trình. Quy ước đặt trên vĩ lệnh cũng cần phải được quán triệt. Không giống như các loại biến (variable) ở phía dưới, các vĩ lệnh cần được định nghĩa với các ký tự viết hoa, giải thích đầy đủ ý nghĩa của chúng. Các từ được phân cách bởi gạch chân. Lý do: Vì toàn bộ là chữ viết hoa nên rất khó tách các từ đơn ra từ chuỗi ban đầu. Ví dụ sau được trích từ frmNapAnhHocSinh.cs của VEMIS_Student.
public const int IMAGE_RETRIEVAL_PORT = 9050;
public const int MAX_SENT_BLOCKSIZE = 1024;
public const string IR_SAVE_COMMAND = "SAVE_COMMAND";//
ImageRetrieval Save Command
public const string IR_VIEW_COMMAND = "VIEW_COMMAND";//
ImageRetrieval View Command
public const int MAX_IMAGE_SIZE = 100000;// kich thuoc anh hoc sinh toi da 100 Kbytes
Vĩ lệnh đầu tiên định nghĩa số hiệu cổng của IMAGE_RETRIEVAL (trình trao đổi ảnh học sinh giữa máy chủ và máy trạm thông qua giao thức TCP/IP). Tiếp theo là kích thước 1 block dữ liệu lớn nhất được gửi giữa các máy…
Biến
Ở đây có sự phân biệt rõ, biến (variable) khác với thành phần dữ liệu (data member) trong các lớp (class) và tham số (parameter) trong các hàm. Do vậy, biến có thể hiểu là biến cục bộ (local variable) trong hàm hoặc biến toàn cục (global variable).
Các biến (dù là local hay global) cần tuân thủ quy ước gồm những thành phần sau:
- Tên kiểu dữ liệu (viết tắt bằng chữ thường). Ví dụ: kiểu string → str, int → n (number), mảng [ ] → a…
- Mục đích của biến được viết thành xâu liền nhau với ký tự đầu viết hoa (giống như quy ước của Microsoft).
Để ngắn gọn, chúng ta gọi quy ước đặt tên như trên là LV (local variable). Ví dụ:
static void Main()
{
DataSet ds = new DataSet();
DataTable dtCustomer = GetCustomers(); DataTable dtOrder = GetOrders();
ds.Tables.Add(dtCustomer); ds.Tables.Add(dtOrder);
ds.Relations.Add("CustomerOrder",
new DataColumn[] { dtCustomer.Columns[0] }, new DataColumn[] { dtOrder.Columns[1] }, true);
System.IO.StringWriter swNoHierarchy = new System.IO.StringWriter(); dtCustomer.WriteXml(swNoHierarchy, XmlWriteMode.WriteSchema, false); PrintOutput(swNoHierarchy, "Customer table, without hierarchy"); System.IO.StringWriter swHierarchy = new System.IO.StringWriter(); dtCustomer.WriteXml(swHierarchy, XmlWriteMode.WriteSchema, true); PrintOutput(swHierarchy, "Customer table, with hierarchy");
Console.ReadKey(); }
Trong ví dụ trên, các biến cục bộ là
- ds: chỉ có thành phần đầu tiên đại diện cho kiểu DataSet
- dtCustomer: dt (DataTable) + Customer → bảng dữ liệu về khách hàng
- dtOrder: dt + Order → bảng dữ liệu về vận đơn
- swNoHierarchy: sw (StringWriter) + NoHierarchy → ghi chuỗi ra ngoài mà không có cây thế hệ
- swHierarchy: sw (StringWriter) + Hierarchy → ghi chuỗi ra ngoài có cây thế hệ
Với biến toàn cục (global variable), đặt tên biến với tiền tố g_, tức là g_ + LV (cách đặt tên biến cục bộ local variable). Ví dụ: g_dtCustomer → Biến toàn cục bảng dữ liệu (dt) về khách hàng (Customer).
Thành phần dữ liệu
Thành phần dữ liệu (data member) trong các lớp có thể được đặt tên theo chuẩn: m_ + LV (m_ là member). Ví dụ sau được trích từ frmNapAnh.cs của VEMIS_Student.
Public partial class frmNapAnh:
DevComponents.DotNetBar.Office2007Form
{
#region khai bao
private static string m_strFileName = "";
Ở đây, m_strFileName là một thành phần của lớp frmNapAnh dùng để lưu đường dẫn tới file ảnh học sinh. Nó có tiền tố m_, theo sau bởi kiểu str (string) và diễn giải mục đích của biến (FileName).
Tham số hàm
Trong trường hợp được tự định nghĩa tên tham số (với Visual Studio, đặc biệt là các giao diện, các hàm xử lý giao diện có tham số do Wizard của Visual Studio tạo ra nên chúng ta không cần can thiệp vào), tuân thủ kiểu đặt tên như sau: p_ + LV (p_ là parameter).
Lớp
- Lớp giao diện GUI (do các form) thì có thể dùng tiền tố frm đứng trước LV. Ví dụ: frmNapAnh ở trên đại diện cho giao diện nạp ảnh học sinh.
- Với các dạng lớp khác thì tùy tình hình, dùng trực tiếp LV hoặc tiền tố viết tắt tương ứng đứng trước LV.
Hàm
Với hàm (functions), chúng ta tuân thủ LV như trên. Tuy nhiên, vì bản chất của hàm là hành động, thủ tục thao tác trên một vài tham số đầu vào, chúng ta nên bắt đầu tên hàm bằng một động từ. Ví dụ: GuiAnh(), XemAnh()…
Quy ước chú thích
Các chú thích (comment) cần được sử dụng thường xuyên trong mã nguồn, khoảng 4-5 dòng code phải có comment giải thích ý nghĩa của đoạn code đó.