Корисність required
лежить в основі багатьох дебатів і вогненних воєн. Великі табори існували з обох сторін. Один табір любив гарантувати наявність цінності і був готовий жити з його обмеженнями, але інший табір відчувавrequired
небезпечно чи не допомагає, оскільки його не можна безпечно додавати і не знімати.
Дозвольте мені пояснити більше міркувань, чому required
поля повинні використовуватися сумлінно. Якщо ви вже використовуєте протокол, ви не можете додати обов'язкове поле, оскільки стара програма не надасть це поле, а програми, як правило, не справляються з відмовою. Ви можете переконатися, що спочатку оновлено всі старі програми, але помилка може бути легко, і це не допоможе, якщо ви зберігаєте протоколи в будь-якій сховищі даних (навіть короткочасній, як запам’ятовується). Така ж ситуація застосовується і при видаленні необхідного поля.
Багато обов'язкових полів були "очевидно" обов'язковими, поки ... вони не були. Скажімо, у вас є id
поле для Get
методу. Це, очевидно, потрібно. Крім того, пізніше вам може знадобитися змінити id
з int на рядок або int32 на int64. Для цього потрібно додати нове muchBetterId
поле, і тепер вам залишається старе id
поле, яке потрібно вказати, але з часом воно повністю ігнорується.
Коли ці дві проблеми поєднуються, кількість вигідних required
полів стає обмеженою, і табори сперечаються щодо того, чи має вона ще значення. Противники required
не були обов'язково проти ідеї, а її теперішньої форми. Деякі запропонували розробити більш виразну бібліотеку перевірки, яка могла б перевірити required
разом із чимось більш досконалим, як name.length > 10
, наприклад , при цьому переконавшись, що є краща модель відмов.
Схоже, Proto3 загалом сприяє простоті, а required
видалення простіше. Але, можливо, більш переконливо, видалення має required
сенс для proto3 у поєднанні з іншими функціями, такими як видалення присутності поля для примітивів та видалення переважаючих значень за замовчуванням.
Я не розробник протобуфа і жодним чином не авторитетний з цього приводу, але все ж сподіваюся, що пояснення корисне.