---
# System prepended metadata

title: Naming Rules
tags: [eGroupAI 開發規範]

---

# Naming Rules
###### tags: `eGroupAI 開發規範`

## 基本原則

### 命名方法介紹
- [Pascal Case，巴斯卡命名法／帕斯卡命名法](https://zh.wikipedia.org/wiki/%E5%B8%95%E6%96%AF%E5%8D%A1%E5%91%BD%E5%90%8D%E6%B3%95)
    - 名稱的第一個字母和每個隨後串聯單字的第一個字母都是大寫。e.g.FirstName、MemberName。

- [Camel Case，駝峰式命名法](https://zh.wikipedia.org/wiki/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB)
    - 名稱的第一個字母是小寫，而每個隨後串聯文字的第一個字母是大寫。e.g.firstName、memberName。


### 類別命名
- 主要採 Pascal Case 或 Upper Camel Case 命名
```java
public class Caculate {
    //code here
}
```

### 介面與介面實作命名
- 主要採 Pascal Case 或 Upper Camel Case 命名法，字尾加上DAO或是DAOImpl
    - 介面

        ```java
        public interface MemberDAO {
          //your method
        }
        ```

    - 介面實作

        ```java
        public class MemberDAOImpl implements MemberDAO {
          //your implement method 
        }
        ```

### 常數命名

- 主要採 Pascal Case 或 Upper Camel Case 命名法，字尾加上DAO或是DAOImpl

    ```java
    public class FacebookConnection {
      private static final String CLIENT_ID = "xxxxxxxx";
      private static final String CLIENT_SECRET = "xxxxxxxxx";
      private static final String REDIRECT_URI = "xxxxxxxxxx";
      private static final String SCOPE = "public_profile, email";
    }
    ```

- 實體(instance)常數：採 Lower Camel Case 命名法

    ```java
    public class Counter {
        /**
         * 最大值
         */
        final int maxSize = 123;

        /**
         * 最小值
         */
        final int minSize = 1;

    }
    ```
### 屬性(Field)的命名

- 主要採 Lower Camel Case

    ```java
    public lass Member {
        private String account;
        private String password;
        private String name;
        private String email;
        private String content;
        private Date birth;
     }
    ```

### 函式方法命名

- 主要採 Lower Camel Case
- 動詞+(名詞)+(介系詞，如：By)+(名詞)

    ```java
    public interface MemberDAO {
      public void insert(Member member);
      public void update(Member member);
      public void delete(Member member);
      public void updateResetNO(Member member);
      public List<Member> getListByIdentity(Member member);
    }
    ```

## 資料庫

### 原則

- 不用艱澀單字，名稱盡可能簡單易讀(除專有名詞)
- 不使用系統字、SQL語法名稱，避免衝突
- 不要加上非功能意義的名稱


### 資料表Table

- 使用_分隔單字
- 全部使用小寫

e.g.article_category

### 欄位Column

- 主要欄位冠 Table 名
- 是否判斷欄位 前面冠上 is
- FK不冠 Table 名
- Table 名稱 3 個單字以上，Colum使用[前兩個單字縮寫]+[ _ ]

**注意：不使用系統字、SQL語法命名TB，e.g. order**


### DynamoDB 命名規則

#### **特性**

DynamoDB強調搜尋速度，使用Key、Value進行資料索引，並建議將資料表依照屬性的

1. 使用頻率
2. 資料大小

分割成多的資料表，因此規則有所更動

#### **資料表分割規則**


##### **常用資料 VS 不常用資料**

1. **常用 : 主名詞(使用者) + _ + 副名詞 + _ + info**
2. **不常用 : 主名詞**

`舉例 :`

`photo 內有100屬性`

`10個屬性常用到`

`90個屬性不常用常用 : member_photo_info`

`不常用 : member_photo`



##### **敏感資料**

**主名詞 + 名詞(敏感資料)**

1. 登入 login
2. 銀行 bank

`舉例 :`

`login : member_login_info、member_login`

`bank : member_bank_info、member_bank`
 

##### **常用資料 VS 不常用資料+敏感資料**

**主名詞 + 名詞(敏感資料)**

1. 登入 login
2. 銀行 bank

`舉例 :`

`login : member_login_info`

`bank : member_bank_info`

#### **資料屬性命名規則**


1. 不用主名詞
2. 使用副名詞
3. 不包含判斷常用的名詞(info)

舉例 :member_bank_info : PK 為 bank(副名詞) + ID = bankID

member_bank : PK 為 bank(副名詞) + ID = bankID

## Package命名
### 一般原則

- package 名稱全為小寫
- 不同功能以不同的 package 來切割、歸類
- 通常 package 會包含了以下項目
    - 專案名稱
    - 功能名稱
    - 模組、API服務商名稱

### 專案名稱

假設專案名稱為 eGroupAI，一般而言 package 會以 com.egroupai 開頭

```java
package com.egroupai.webapp.entity;

```

### 功能名稱

```java
//網頁系統的 MVC 控制器
package com.egroupai.webapp.controller;

//資料存取方法介面
package com.egroupai.webapp.dao;

//資料存取方法實作
package com.egroupai.webapp.dao.impl;

```

### 模組、API服務商名稱

```java
//排程模組
package com.egroupai.webapp.schedule;

//共用模組(系統共同使用模組放在util下 e.g. 日期轉換模組、上傳模組、UUID產生器模組)
package com.egroupai.webapp.util;

//Microsoft 臉部辨識API
package com.egroupai.webapp.projectoxford.entity
package com.egroupai.webapp.projectoxford.util
```

## Service命名

## **新增**

---

- 單筆儲存

`save`

- 多筆儲存

`batchsave`

## **刪除**

---

## **修改**

---

## **查詢**

---

DynamoDB 分成兩種搜尋方式

1.Query

- PK + RK 搜尋

`query`

- Second-Index只有PK

`query + By + 搜尋的PK名稱`

e.g : queryByMemberID

- Second-Index有PK和RK

`query + By + 搜尋的PK名稱 + 搜尋的RK名稱`

- queryByMemberIDCreateDate

2.Scan

PK + RK 搜尋

`scan`

- Second-Index只有PK

`scan+ By + 搜尋的PK名稱`

e.g : scanByMemberID

- Second-Index有PK和RK

`scan+ By + 搜尋的PK名稱 + 搜尋的RK名稱`

- scanByMemberIDCreateDate

- Auto-generated Table of Content
[ToC]



