<name>John Doe</name>
vs
<name>John Doe</name>
<DOB/>
Осторожно! Эти два представления не совсем эквивалентны. <DOB/>
обозначает пустой элемент ; это эквивалентно <DOB></DOB>
. Пустые и нулевые не являются взаимозаменяемыми, поэтому у нас есть и 204 No Content
и 404 Not Found
, и -s
и -e
.
Какой правильный подход и почему?
Полагаю, вы хотите подумать об этом вопросе в более широком контексте сообщения . В идеальном мире у нас была бы схема, которая описывает каждое из полей в нашем сообщении - какова семантика полей, допустимый диапазон значений, какие поля являются обязательными и какие являются необязательными, и семантика по умолчанию, когда необязательные поля отсутствуют.
В распределенной системе, где клиенты и серверы развертываются с разной частотой, обычно расширяют схему с дополнительной семантикой в течение срока действия контракта. Но если клиенты и серверы развернуты независимо, у вас могут возникнуть ситуации, когда клиент и сервер понимают разные версии одной и той же схемы. Поэтому мы должны быть осторожны с прямой и обратной совместимостью, а также с ограничениями на наши изменения, необходимые для того, чтобы все работало.
(Конечно, в конечном итоге мы захотим внести несовместимые изменения. Поэтому нам нужно будет ввести новую схему сообщений, а это, в свою очередь, означает, что нам нужно думать о жизненных циклах ).
Это подразумевает, что, в общем, мы должны быть готовы к тому, чтобы пропустить любое необязательное поле - потому что сообщение могло быть создано процессом, который знает только о версиях схемы до введения нового поля .
Так что для дополнительного случая должен ли производитель, который знает о дополнительном поле, всегда включать его в сообщение? Я не знаю каких-либо опубликованных аргументов в пользу этого, за исключением общих советов, которые явно улучшают неявные.