Серия руководств по Thrift RPC (1) — язык Thrift

Java задняя часть Python Язык программирования

Thrift не является строго языком программирования, но он превосходит многие языки программирования и полон красоты.

базовый тип данных

Язык программирования Thrift предоставляет следующие основные типы данных:

  • bool: A boolean value (true or false)
  • byte: An 8-bit signed integer
  • i16: A 16-bit signed integer
  • i32: A 32-bit signed integer
  • i64: A 64-bit signed integer
  • double: A 64-bit floating point number
  • string: A text string encoded using UTF-8 encoding

Вообще говоря, мы также используем их, как и в других повседневных языках программирования. Я, например, в основном это "три топора":

  • bool
  • i32 (сейчас потихоньку используется i64, из-за производительности в принципе не обратил на него внимание в первый раз)
  • double
  • string

сложные типы данных (контейнеры)

Давайте посмотрим, какие типы контейнеров предоставляет Thrift:

  • list: An ordered list of elements. Translates to an STL vector, Java ArrayList, native arrays in scripting languages, etc.
  • set: An unordered set of unique elements. Translates to an STL set, Java HashSet, set in Python, etc. Note: PHP does not support sets, so it is treated similar to a List
  • map: A map of strictly unique keys to values. Translates to an STL map, Java HashMap, PHP associative array, Python/Ruby dictionary, etc. While defaults are provided, the type mappings are not explicitly fixed. Custom code generator directives have been added to allow substitution of custom types in various destination languages

Это почти то же самое, что и C++ STL, и имена у них похожи. Только структура данных списка на самом деле представляет собой «динамический массив». Уже по одному имени людям легко ассоциироваться со связанными списками. Это явление также встречается в других языках программирования. Например, в Python это также называется списком.

класс, т.е. структура

В немного нормальном языке поддержка ООП, естественно, необходима.Я думаю, что лучше всего указать класс ключевого слова напрямую и попытаться иметь четкую семантику.

Но Thrift имеет только одну структуру, которая в основном такая же, как структура C, и у нее очень мало функций, но, учитывая, что это всего лишь промежуточный язык, это, естественно, простительно.

Давайте посмотрим, как должна быть определена хорошо написанная структура, чтобы она была ясной и полной:

struct Person {
    1: required string name; // 必须字段,很明确
    2: required i64 age;
    3: optional string addr; // 可选字段
    4: optional string defaultValue = "DEFAULT"; // 默认字段
    5: string otherValue; // 不是很明确!
}

интерфейс, а именно сервис

В соответствии с принципом «интерфейсно-ориентированного программирования» «интерфейс» является очень важным фактором. Кто-то называет это функцией, кто-то — методом, и в этой статье мы все вместе называем его «методом».

В Thrift определение интерфейса — дело простое (пример взят с официального сайта):

// 接口, 还可以继承, 也许我们有时候可以搞个 『BaseService』 之类的,不过我很少用到。
service Calculator extends shared.SharedService {  
	
 // 正常方法,和C++这类传统语言,基本一模一样。
   void ping(),

   i32 add(1:i32 num1, 2:i32 num2),

   i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
	
 // 特殊方法,基本很少用到了,在我有限的经历中,只使用过一次,读者没必要关注它
   oneway void zip()

}

исключение

Что касается исключений, это похоже на определение структуры в Thrift, потому что концептуально исключение также является классом, так называемое «все является объектом». Но теперь мы используем ключевое слово «исключение», что соответствует четкой семантике, о которой я упоминал ранее. Давайте посмотрим, как исключения определяются в Thrift:

exception InvalidOperation {
  1: i32 whatOp,
  2: string why
}

перечислить

Очень важно перечислить эту вещь.Как и в предыдущем исключении, это просто класс. Однако Thrift поддерживает только целочисленные значения перечисления, что очень жаль, ведь во многих случаях у нас очень богатые требования к перечислению, например поддержка строк перечисления. Перечисление в Thrift выглядит следующим образом:

enum Operation { // 功能着实比较孱弱
  ADD = 1,
  SUBTRACT = 2,
  MULTIPLY = 3,
  DIVIDE = 4
}

Если вам нравятся мои статьи, обратите внимание на мой паблик: «Программирование в плавающей жизни».
Вы также можете обратить внимание на мою короткую книжную колонку: «Программирование в плавающей жизни».
Или присоединяйтесь к моей планете знаний, "программируя как мечта", чтобы получить больше галантерейных товаров.