Przydatność required
była podstawą wielu debat i wojny z płomieniami. Po obu stronach istniały duże obozy. Jeden obóz lubił gwarantować, że wartość była obecna i był gotów żyć z jej ograniczeniami, ale drugi obóz czuł się required
niebezpiecznie lub nieprzydatny, ponieważ nie można go bezpiecznie dodać ani usunąć.
Pozwól, że wyjaśnię ci więcej, dlaczego tak się dzieje required
pola powinny być używane oszczędnie. Jeśli używasz już prototypu, nie możesz dodać wymaganego pola, ponieważ stare aplikacje nie będą go udostępniały, a aplikacje ogólnie nie radzą sobie z awarią. Możesz upewnić się, że wszystkie stare aplikacje są najpierw uaktualnione, ale może być łatwo popełnić błąd i nie pomaga, jeśli przechowujesz prototypy w dowolnym magazynie danych (nawet krótkotrwałym, takim jak memcached). Ten sam rodzaj sytuacji dotyczy usuwania wymaganego pola.
Wiele wymaganych pól było „oczywiście” wymaganych, dopóki… nie były. Powiedzmy, że masz id
pole dla Get
metody. Jest to oczywiście wymagane. Poza tym później może być konieczna zmiana id
z int na string lub z int32 na int64. To wymaga dodania nowego muchBetterId
pola, a teraz pozostało ci już stare id
pole musi zostać określone, ale ostatecznie jest całkowicie ignorowane.
Po połączeniu tych dwóch problemów liczba korzystnych required
pól staje się ograniczona, a obozy kłócą się o to, czy nadal ma ona wartość. Przeciwnicy required
niekoniecznie byli przeciwni temu pomysłowi, ale jego obecnej formie. Niektórzy sugerowali opracowanie bardziej ekspresyjnej biblioteki sprawdzania poprawności, która mogłaby sprawdzić required
wraz z czymś bardziej zaawansowanym, takim jakname.length > 10
, na przykład zapewniając lepszy model awarii.
Proto3 ogólnie wydaje się faworyzować prostotę, a required
usuwanie jest prostsze. Ale może bardziej przekonujący, usuwającyrequired
miało sens dla proto3 w połączeniu z innymi funkcjami, takimi jak usunięcie obecności pola dla prymitywów i usunięcie nadrzędnych wartości domyślnych.
Nie jestem deweloperem protobufów i nie jestem w żaden sposób autorytatywny w tym temacie, ale nadal mam nadzieję, że wyjaśnienie będzie przydatne.
StringValue
. Ponieważ są to wiadomości, pole has_ jest dostępne. Jest to skutecznie „boks”, który jest powszechny w wielu językach.Wyjaśnienie znajdziesz w tym numerze Github z protobufem :
źródło
oneof { MessageV1, MessageV2, etc. }
.