Sintaks 3 protobuf membuat semua bidang opsional menjatuhkan kata kunci required
dan optional
dari sintaks proto2 sebelumnya. Membaca beberapa komentar dari pengembang tampaknya itu dilakukan untuk meningkatkan kompatibilitas biner maju / mundur.
Tetapi bagi saya, itu bisa ditegakkan dengan hanya versi nama paket, katakan com.example.messages.v1
dan kemudian biarkan klien untuk menerapkan deserializer yang mereka mengerti. Pada saat yang sama menghapus beberapa kontrak yang dinyatakan sebagai jenis yang berguna dari sudut pandang rekayasa perangkat lunak. Misalnya kalau sudah
message Location {
double latitude = 1;
double longitude = 2;
}
Dalam proto3 dimungkinkan untuk membuat setengah didukung tetapi valid sempurna Location
dengan tidak memberikan salah satu bidang yang diperlukan.
Bukankah itu kelemahan besar ketika membuat format serialisasi berbasis skema untuk bertukar data antara klien? Bukankah lebih buruk untuk memindahkan kode validasi tambahan ke setiap klien memeriksa bahwa semua bidang yang diperlukan memiliki nilai yang valid?
sumber
Jawaban:
proto3 membuat sejumlah perubahan yang ditujukan (seperti yang saya mengerti) untuk membuatnya jauh lebih berguna dalam skenario lintas platform. Pelacakan eksplisit "ditugaskan" vs "tidak ditugaskan tetapi melaporkan nilai default" bisa sangat sulit untuk diterapkan pada beberapa platform target, dan juga bisa membingungkan untuk digunakan. Dengan demikian, proto3 mengadopsi pendekatan yang lebih sederhana:
Nilai lainnya adalah: nol. Fakta bahwa Anda tidak secara eksplisit menetapkannya ke nol adalah moot. Apakah ini diinginkan atau tidak tergantung pada Anda, tetapi masuk akal bagi saya dan bagaimana banyak "menginisialisasi objek / struct baru" bekerja pada berbagai platform.
Tidak ada yang bisa divalidasi! Tata letak persis seperti apa jadinya jika nilai nol ditetapkan secara eksplisit. Jika itu legal, itu legal. Jika itu ilegal (karena nol tidak masuk akal bagi Anda), itu ilegal; tetapi akan ilegal apakah itu eksplisit atau implisit. Jumlah validasi yang terlibat tidak berubah.
Tidak biasanya, tidak ... terutama karena versi skema eksplisit. Jika Anda ingin menggunakan proto2: gunakan proto2. Tidak ada yang berubah secara otomatis.
sumber