風格指南

提供如何最佳架構您的 proto 定義的指引。

此文件提供 .proto 檔案的風格指南。透過遵循這些慣例,您將使您的 Protocol Buffer 訊息定義及其對應的類別保持一致且易於閱讀。

請注意,Protocol Buffer 的風格會隨著時間演變,因此您可能會看到以不同慣例或風格撰寫的 .proto 檔案。當您修改這些檔案時,請尊重現有的風格一致性是關鍵。然而,當您建立新的 .proto 檔案時,最好採用當前最佳風格。

標準檔案格式

  • 將行長度保持在 80 個字元。
  • 使用 2 個空格的縮排。
  • 字串偏好使用雙引號。

檔案結構

檔案應命名為 lower_snake_case.proto

所有檔案都應按以下順序排列

  1. 授權標頭(如果適用)
  2. 檔案概述
  3. 語法
  4. 套件
  5. 匯入(已排序)
  6. 檔案選項
  7. 其他所有內容

套件

套件名稱應為小寫。套件名稱應根據專案名稱,並可能根據包含 Protocol Buffer 類型定義的檔案路徑,擁有唯一名稱。

訊息和欄位名稱

訊息名稱使用 PascalCase(首字母大寫):SongServerRequest。縮寫字偏好視為單字並大寫:GetDnsRequest 而非 GetDNSRequest。欄位名稱使用 lower_snake_case,包括 oneof 欄位和擴展名稱:song_name

message SongServerRequest {
  optional string song_name = 1;
}

針對欄位名稱使用此命名慣例,您將獲得如以下兩個程式碼範例中所示的存取器。

C++

const string& song_name() { ... }
void set_song_name(const string& x) { ... }

Java

public String getSongName() { ... }
public Builder setSongName(String v) { ... }

如果您的欄位名稱包含數字,數字應出現在字母之後,而不是底線之後。例如,使用 song_name1 而非 song_name_1

重複欄位

重複欄位使用複數名稱。

repeated string keys = 1;
  ...
  repeated MyMessage accounts = 17;

列舉

列舉類型名稱使用 PascalCase(首字母大寫),值名稱使用 CAPITALS_WITH_UNDERSCORES

enum FooBar {
  FOO_BAR_UNSPECIFIED = 0;
  FOO_BAR_FIRST_VALUE = 1;
  FOO_BAR_SECOND_VALUE = 2;
}

每個列舉值都應以分號結尾,而不是逗號。偏好為列舉值加上前綴,而不是將它們包圍在一個封閉的訊息中。由於某些語言不支援在「結構」類型內定義列舉,因此這確保了跨繫結語言的一致方法。

零值列舉應具有 UNSPECIFIED 後綴,因為伺服器或應用程式若收到非預期的列舉值,將會在 proto 實例中將該欄位標記為未設定。然後,欄位存取器將傳回預設值,對於列舉欄位而言,預設值為第一個列舉值。有關未指定列舉值的更多資訊,請參閱Proto 最佳實務頁面

服務

如果您的 .proto 定義了 RPC 服務,則服務名稱和任何 RPC 方法名稱都應使用 PascalCase(首字母大寫)

service FooService {
  rpc GetSomething(GetSomethingRequest) returns (GetSomethingResponse);
  rpc ListSomething(ListSomethingRequest) returns (ListSomethingResponse);
}

有關更多服務相關指引,請參閱 API 最佳實務主題中的 針對每個方法建立唯一的 Proto請勿在頂層請求或回應 Proto 中包含基本類型,以及 Proto 最佳實務中的 在單獨檔案中定義訊息

應避免的事項

  • 必要欄位(僅適用於 proto2)
  • 群組(僅適用於 proto2)