-
Notifications
You must be signed in to change notification settings - Fork 34
Quy tắc viết mã nguồn OpenCPS
Đây là trang mô tả quy ước code theo chuẩn dự án OpenCPS!
Đối với gói (package)
Cách đặt tên gói cho một thành phần có tên module
Tiền tố: org.opencps.module
Thành phần backend:
-
org.opencps.module.dao
chứa fileservice.xml
-
org.opencps.module.model
chứa các đối tượng Entity -
org.opencps.module.service
chứa các API service -
org.opencps.module.util
chứa các lớp tiện ích Thành phần Frontend: -
org.opencps.module.ui
chứa các action xử lý giao diện frontend -
org.opencps.module.admin
chứa các action giao diện quản trị nằm trong control panel của Liferay -
org.opencps.module.samples
chứa giao diện phục vụ test các API của mô đun
Tất cả các ký tự tên của packet phải đưọc viết thường.
Ví dụ:
org.opencps.usermgt.dao -> Đúng
org.opencps.user_mgt.dao -> Sai
org.opencps.usermgt.Dao -> Sai
Đối với lớp (class)
Tên của class đặt sử dụng theo cú pháp [Camel Case] (https://en.wikipedia.org/wiki/CamelCase). Sử dụng danh từ để đặt tên cho các class. Ví dụ:
class Customer
class Account
Interfaces: Có thế sử dụng cú pháp [Camel Case] (https://en.wikipedia.org/wiki/CamelCase).
Class = UserImpl, Interface = User
Đối với biến (Variables)
Đặt tên biến theo quy tắc mix case, viết thường ký hiệu đầu tiên của biến, và viết hoa ký tự tiếp theo. Ví dụ:
String firstName
int orderNumber
Đối với hằng (Constants)
Phần Backend của OpenCPS được viết bằng cách sử dụng bộ công cụ Service Builder của Liferay. Các entity dữ liệu phải được khai báo trong service.xml
. Một entity dữ liệu sẽ cần được khai báo với đầy đủ các thành phần như ví dụ sau
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE service-builder PUBLIC "-//Liferay//DTD Service Builder 6.2.0//EN" "http://www.liferay.com/dtd/liferay-service-builder_6_2_0.dtd">
<service-builder package-path="org.opencps.module">
<entity name="EntityName" local-service="true" remote-service="true"
data-source="opencpsdatasource" table="opencps_entityname">
<!-- PK fields -->
<column name="entityNameId" type="long" primary="true" />
<!-- Audit fields -->
<column name="companyId" type="long" />
<column name="groupId" type="long" />
<column name="userId" type="long" />
<column name="createDate" type="Date" />
<column name="modifiedDate" type="Date" />
<!-- Attribute fields: attribute of entity -->
<!-- Relationships: attribute of entity -->
<!-- Order: sorting by columns -->
<!-- Finder methods: row filters -->
</entity>
</service-builder>
Khai báo các ràng buộc dữ liệu cần thiết vào têp portlet-model-hints.xml
như ví dụ sau
<?xml version="1.0"?>
<model-hints>
<hint-collection name="TEXTAREA">
<hint name="display-height">105</hint>
<hint name="display-width">500</hint>
<hint name="max-length">4000</hint>
</hint-collection>
<model name="org.opencps.datamgt.model.DictCollection">
<default-hints>
<hint name="display-width">150</hint>
</default-hints>
<field name="dictCollectionId" type="long" />
<field name="companyId" type="long" />
<field name="groupId" type="long" />
<field name="userId" type="long" />
<field name="createDate" type="Date" />
<field name="modifiedDate" type="Date" />
<field name="collectionCode" type="String">
<hint name="max-length">100</hint>
</field>
<field name="collectionName" type="String" localized="true">
<hint name="max-length">255</hint>
</field>
<field name="description" type="String">
<hint-collection name="TEXTAREA" />
</field>
</model>
</model-hints>
Với mỗi entity dữ liệu, cần phải tạo các hàm truy xuất dữ liệu CRUD theo nguyên tắc đặt tên hàm như sau
- C:
EntityName addEntityName(...)
- U:
EntityName updateEntityName(...)
- D:
void deleteEntityName(...)
- R:
EntityName getEntityName(...)
- R:
List<EntityName> getEntityNames(...)
Ở đầu mỗi file mã nguồn, cần đưa thông tin mô tả giấy phép như sau:
OpenCPS is the open source Core Public Services software
Copyright (C) 2016-present OpenCPS community
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.