Hallo,решение Конструкция: расширение интерфейса против нового интерфейса
У меня есть небольшое дизайнерское решение сегодня: Существует существующий интерфейс, называемый «TargetSystem», который только один метод «GetName()». Других распространенных данных об этих целевых системах нет. Теперь у меня есть новый тип целевых систем, которым нужна аутентификация.
Я должен знать, нужна ли целевая система для проверки подлинности или нет (интерфейс должен показать диалог пароля для них). Если ему нужна аутентификация, я должен установить имя пользователя и пароль.
Мое решение: должен ли я расширить существующий интерфейс с помощью методов «needsAuthentication» и «setUsernameAndPassword» или создать новый интерфейс, расширяющий старый, только с помощью метода «setUsernameAndPassword», получив проверку подлинности instanceof.
Важно: Не нужно быть совместимым нисходящим или любой другой причиной, чтобы не касаться старого интерфейса! Я просто обсуждаю с коллегой, что, как правило, является хорошим: создание интерфейсов с такими именами, как «ObjectWithFeatureX», «ObjectWithFeatureY» или создание таких методов, как «hasFeatureX», «hasFeatureY».
Использование одного или двух методов для имени пользователя и пароля не является точкой, на самом деле я использую setPasswordAuthentication (PasswordAuthentication). Но метод «instanceof» и «needAuthentication» кажется уродливым. Я не мог просто вызвать метод, потому что интерфейс должен знать, показывать ли диалоговое окно пароля или нет - в зависимости от целевой системы. – cornz
В этом случае я бы посоветовал вам нуждаться в проверке подлинности. Другой подход заключается в том, чтобы сбой аутентификации (если ничего не задано), которая вызывает диалоговое окно. (Вам нужно каким-то образом подать назад, что пароль нужно снова попробовать, и вы можете использовать этот прослушиватель) –
Я также уже думал о методе проверки правильности входа. Фактически я мог бы использовать вызов этого метода, прежде чем запускать диалог в первый раз - если системе не требуется аутентификация, можно вернуть true без какого-либо имени пользователя и пароля. спасибо – cornz