У вас есть ... параметры.
Опциональные методы удобны для человека, пишущего класс, для соответствия протоколу, что раздражает человека, использующего протокол.Так что это зависит от того, кого вы пытаетесь угодить.
Дополнительные методы не так плохи, как проверка типа.Представьте, как будет выглядеть код при доступе к объекту контактной сущности.Когда вы используете необязательный метод, у вас должен быть случай if и else.Это не так удобно, как просто пойти дальше и предположить, что вы можете вызвать метод.Но это намного удобнее, чем проверка типа.Это будет один случай, если для каждого другого типа объекта (и еще случай, который может быть утверждением).Кроме того, если вы используете дополнительные методы, информация о сущности инкапсулируется в ее класс.Если вы проверите тип перед вызовом метода, то информация о том, какой тип контактной информации предоставляет объект, находится вне класса в вызывающем коде.Если вы модернизируете объект, чтобы предоставить дополнительный тип контакта, это улучшение будет недоступно до тех пор, пока вы не обновите вызывающий код.
Вариант B состоит в том, чтобы сделать все необходимые методы, но дать им возможность возврата значенияэто означает, что информация недоступна, например, ноль.Конечно, это все еще означает, что в случае, если для проверки нулевого результата, это просто менее многословно.Еще лучшим решением этой проблемы является использование методов, возвращающих коллекции из нескольких контактов.В конце концов, люди могут иметь более одного номера телефона.Затем, чтобы указать, что тип контакта неприменим, вы просто вернете пустую коллекцию.
Недостатком является то, что любой, кто пишет класс, соответствующий протоколу, должен добавить простой метод-заглушку, который говорит return nil
или что-то.