La utilidad de required
ha estado en el centro de muchos debates y guerras de fuego. Grandes campamentos han existido en ambos lados. A un campamento le gustaba garantizar que un valor estuviera presente y estaba dispuesto a vivir con sus limitaciones, pero el otro campamento se sentía required
peligroso o inútil, ya que no se puede agregar ni eliminar con seguridad.
Permítanme explicar más del razonamiento por el que los required
campos deben usarse con moderación. Si ya está utilizando un protocolo, no puede agregar un campo obligatorio porque las aplicaciones antiguas no proporcionarán ese campo y las aplicaciones en general no manejan bien el error. Puede asegurarse de que todas las aplicaciones antiguas se actualicen primero, pero puede ser fácil cometer un error y no ayuda si almacena los protos en cualquier almacén de datos (incluso de corta duración, como memcached). El mismo tipo de situación se aplica al eliminar un campo requerido.
Muchos campos obligatorios fueron "obviamente" requeridos hasta que ... no lo fueron. Digamos que tiene un id
campo para un Get
método. Eso es obviamente requerido. Excepto, más tarde puede que necesite cambiar id
de int a string, o int32 a int64. Eso requiere agregar un nuevo muchBetterId
campo, y ahora le queda el id
campo antiguo que debe especificarse, pero finalmente se ignora por completo.
Cuando se combinan esos dos problemas, la cantidad de required
campos beneficiosos se vuelve limitada y los campamentos discuten sobre si todavía tiene valor. Los oponentes de required
no estaban necesariamente en contra de la idea, sino de su forma actual. Algunos sugirieron desarrollar una biblioteca de validación más expresiva que pudiera verificarrequired
junto con algo más avanzado como name.length > 10
, al tiempo que se aseguraba de tener un mejor modelo de falla.
Proto3 en general parece favorecer la simplicidad, y la required
eliminación es más simple. Pero quizás sea más convincente, la eliminación required
tenía sentido para proto3 cuando se combina con otras características, como la eliminación de la presencia de campo para primitivas y la eliminación de valores predeterminados primordiales.
No soy un desarrollador de protobuf y no tengo ninguna autoridad en el tema, pero todavía espero que la explicación sea útil.