Я хочу рассказать об одном случае, когда нам удалось придумать простой API, когда задача поначалу казалась сложной.
Недавно мы получили задание.
Нам нужно было регистрировать каждое действие, которое пользователь мог предпринять на нашем сайте.
Другими словами, нам нужно было создать некий класс (API), который можно было бы легко использовать практически во всех контроллерах нашей системы.
Сложности добавляло то, что в зависимости от действия приходилось регистрировать различные дополнительные параметры.
Вместе с этой задачей мы получили полуфабрикат решения, сделанный некоторыми разработчиками.
Первое решение
Мы не будем сейчас рассматривать, как происходит логирование внутри — нам интересно посмотреть, насколько удобно его использовать извне (то есть только API).Вот как выглядел типичный код контроллера, в котором нужно прописать действие пользователя:
Вероятно, очевидно, как работает LogUtil.getParamsWithFieldNames. Учитывая объект «пользователь» и список строк, он вызывает соответствующие методы получения: user.getPersonCode(), user.getUserName() и т. д.private void logUserAction(User user) throws Exception { UserActionModel model = new UserActionModel(); model.setAction("Buy a ticket"); List<String> values = new ArrayList<String>(); values.add("PersonCode"); values.add("UserName"); values.add("ContactInformation.EmailAddress"); values.add("ContactInformation.Language"); model.setParams(LogUtil.getParamsWithFieldNames(user, values)); LogUtil.log(model); }
Прекрасный
Ну как элегантно? Посмотрите, какое продуманное, универсальное решение! Это не зависит от конкретного класса, будь то Пользователь, Клиент, Заказчик или что-то еще.Просто скормите этот объект и список строк классу LogUtil, и он автоматически добавит все эти значения в журнал.
О да, это умный API!
Но
Но вы знаете, что? Вам нужен этот интеллект, как собаке пятая нога! Остановитесь на секунду и подумайте: нельзя ли сделать это проще? Конечно вы можете! Почему нам нужно использовать здесь отражение? Зачем терять то преимущество, которое дает компилятор — ведь он может сразу найти ошибку, если вы вдруг ошиблись в написании геттера? Зачем беспокоиться об обработке исключений? Почему бы просто не использовать геттеры?И все же да
В результате решение оказалось проще, короче и надежнее.
Вот как теперь выглядит типичный код контроллера: Action action = new Action("Buy a ticket")
.
add("PersonCode", user.getPersonCode()) .
add("PersonName", user.getPersonName()) .
add("EmailAddress", user.getContactInformation().
getEmailAddress()) .
add("Language", user.getContactInformation().
getLanguage());
LogUtil.log(action);
Так.
Настолько просто, насколько это возможно.
Как я завещал старик Эйнштейн .
Теги: #java #программирование #простота #простота #проектирование и рефакторинг
-
Что Не Так С Абстракцией Di Asp.net Core?
19 Oct, 24 -
Upd: Cisco И 2 Провайдера
19 Oct, 24 -
Богиня Луны Вернется С Землей
19 Oct, 24