Какова цель иметь значение enum по умолчанию как "неопределенное" в Google protobuf?
Я вижу, что в источниках Google Chrome (Chromium) первое значение перечисления (по умолчанию) объявлено как "неопределенное":
// The type of a subresource filtering rule.
enum RuleType {
RULE_TYPE_UNSPECIFIED = 0;
RULE_TYPE_COMMENT = 1; // Comment rule.
RULE_TYPE_URL = 2; // Network level filtering rule based on URL pattern.
RULE_TYPE_CSS = 3; // Element hiding rule based on a CSS selector.
};
...
// Types of anchors that can be used to constrain where a URL pattern must
// begin/end in the URL in order to be considered a match.
enum AnchorType {
ANCHOR_TYPE_UNSPECIFIED = 0;
// Acts like a '*' wildcard at the respective end of a pattern.
ANCHOR_TYPE_NONE = 1;
// The pattern must match from the start/until the end of the URL.
ANCHOR_TYPE_BOUNDARY = 2;
// The pattern must match starting with the TLD+n of the URL's domain, but the
// scheme and subdomains (if any) can be arbitrary.
ANCHOR_TYPE_SUBDOMAIN = 3;
};
...
https://cs.chromium.org/chromium/src/components/url_pattern_index/proto/rules.proto
Какова цель сделать это?
Принять во внимание это protobuf
2, поэтому поля могут быть помечены optional
а также required
а также unspecified
Значение enum можно удалить, просто сделав поле необязательным.
Допустим, https://cs.chromium.org/chromium/src/components/url_pattern_index/proto/rules.proto?l=22:
// The format of a URL pattern.
enum UrlPatternType {
URL_PATTERN_TYPE_UNSPECIFIED = 0;
// A pattern without special characters, e.g. "example.com".
URL_PATTERN_TYPE_SUBSTRING = 1;
// The pattern contains one or more wildcards, namely '*' and/or '^'
// characters. The '*' matches any sequence of characters, while the '^'
// matches a separator, i.e. anything but a letter, a digit, or one of [-._%].
URL_PATTERN_TYPE_WILDCARDED = 2;
// The pattern is a regular expression.
URL_PATTERN_TYPE_REGEXP = 3;
};
но поле optional
: https://cs.chromium.org/chromium/src/components/url_pattern_index/proto/rules.proto?l=150:
optional UrlPatternType url_pattern_type = 6;
Почему бы просто не передать его вместо того, чтобы передать unspecified
значение?
1 ответ
Возможно, наиболее важной причиной является предоставление чистого пути, если вы когда-нибудь захотите перейти на proto3 в будущем, поскольку это единственный вариант, который будет напрямую совместим.
Однако это также упрощает использование на ряде платформ, поскольку перечисления сильно различаются в разных языках. Это также делает значение по умолчанию очень очевидно заметным как "вероятно, неправильное" - опять же: способ инициализации нового экземпляра по умолчанию может сильно различаться между платформами / языками, а уровень управления, на который вы надеетесь, может быть недоступен на некоторых платформах.