В мой последний пост я говорил немного об одном из моих любимых функций Java, которые являются exceptions . Там я говорил немного о том, как исключения, они помогают нам думать контрактов , но теперь я хотел бы пойти немного дальше. Сейчас я покажу, как сделать их Api намного богаче с помощью исключения.
Но что такое API?
Я не буду сластить пилюлю, таким образом, я буду определять способ весьма прямой:
Обратите внимание, что не использовал слово “система” здесь”, но программа”. Когда вы разрабатываете класс, который наследует методы отеля, как думали, что другие программисты будут использовать, вы создаете API (то же, что вы-это другой программист).
Есть ли программа, которая не создавать API Kico? Yeap: думаю, в сценарии, который вы пишете для автоматизации своих задач. Это тот тип программы, которые вы только хотите, что работает. Сделано программное обеспечение непосредственно , как правило, не предоставляют API.
Ах, но там, если другая программа вызова, я могу сказать, что там-это API-интерфейс? Здесь вы relativizou вещь, и этот пост не выходит.:)
Мы поговорим здесь не об Api REST, но, скорее, то, что проявляется в виде исполняемого кода, или есть открытые методы, которые вы заявляете в своих классах или абстрактного в их интерфейсы.
Что такое хороший API?
Хороший API-это то, что говорит нам точно, что будет сделано. Все начинается с имен выбранного программистом, чтобы тот метод, который следует выставить таким образом, очевидно, намерение этого кода.
Хорошее имя уже дал нам большую часть того, что нам нужно, второй компонент-это параметры, что API ожидает. В идеале должно быть мало, и с подходящего размера. Давайте начнем с простого примера, который мы будем идти улучшается во время поста (да, это реальный код):
int cadastrarPessoa(int id, String nome, String sobrenome, Date dataNascimento)
Замечали, как степень детализации, является неправильным? Почему бы не просто передать объект типа Человека, сохранялось, такие, как улучшенная версия, который я покажу ниже? Все же это не API идеальное, но, бесспорно, более простой (и программист страдает меньше в тот момент, когда ввести его код):
class Pessoa {
int cadastrarPessoa(Pessoa pessoa) (...)
}
Есть еще один аспект, в API, которые должны быть приняты во внимание: тип возвращаемого значения. Наша версия предыдущей возвращает целочисленное значение, которое представляет идентификатор записи в базе данных. Если есть ошибка, она может просто возвращает отрицательное значение: “-1: нет идентификатор, -2: без имени, -3: без фамилии”, ну и так далее. Возвращаемое значение будет иметь то двойной смысл: очевидно (вернуть дескриптор), и определить ошибку (нарушение договора).
Клиент API, так что написать код, подобный тому, вышесказанное для обработки ошибок:
switch (cadastrarPessoa(pessoa) {
case -1:
System.out.println("Opa! Sem o ID que deve ser preenchido antes!");
break;
case -2:
(...)
}
Вечные страдания, которые могли бы быть немного успокоился, в том числе некоторые константы, но это будет по-прежнему вечные страдания. Мы видели несколько хороших моментов в определении API:
- Хорошее имя
- Хорошее определение параметров
- Возвращаемое значение что имеет смысл (и есть единственная функция)
Чего-то не хватает: в пределах от API, или есть, условий для нормальной работы . E muito difficil разорвал аристо, объяснив, что такое API REST, массовый доступ к кодиго-исполнителю, особенно для лингвистов, которые могут использовать рекурсивно, поскольку исключения делают Java, нет. Как бы третья версия нашего API?
class PessoaNegocio {
void cadastrar(Pessoa pessoa) throws Validação (...)
}
Больше не надо возвращать целочисленное значение: если сохранение прошло успешно, сам метод уже будет заполнить атрибут “идентификатор” объекта, который я провел в качестве параметра. И если что-то пойдет не так? Исключение вызова Проверки (избегайте специальных символов в вашем коде), то будет выброшено, и этом если найдут сведения о том, что пошло не так.
Исключением является частью договора: она говорит нам то, как:
Наш API-интерфейс теперь имеет ограничение, так и значение: вы читаете подпись метода и знаете, что только объекты, допустимые, то есть тех, чье внутреннее состояние не согласуется с тем, что, как ожидается, будет сохранялось в базе данных.
Программист теперь может писать код еще более интересным:
try {
// o fluxo principal fica BEM isolado
negocio.cadastrar(pessoa);
} catch (Validação erroValidacao) {
// eu sei que meu problema é de validação
// talvez eu possa projetar algum comportamento
// de retentativa, ou mesmo informar melhor o
// usuário final a respeito da bobagem que está
// tentando fazer
}
И здесь вступает еще один момент, который необходимо принять во внимание, когда будет писать свои API: ошибки, которые, возможно, ваши клиенты не смогут снять. Ошибка в вашей СУБД. Будет, что было бы здорово попытаться улучшить, немного больше нашего API, как показано в примере ниже?
void cadastrar(Pessoa pessoa) throws Validação, JDBCException
Прежде чем я знал, что недопустимые объекты не будут сохранены: теперь я знаю, что сбой в базе данных может возникнуть. Больше, чем это, я знаю, что это реляционная база данных (JDBCException). Здесь вступает в контексте.
Вы хотите, чтобы пользователи вашего API знать что за тряпки находится реляционную СУБД? Если да, то ок. Если не лечить внутренне эти проблемы и вызывающее исключение типа RuntimeException или производными. Вы будете здесь, подвергая детали нижнего слоя не нуждается, и еще сложнее в жизни пользователей вашего API.
Теперь, если вы хотите выставить этот аспект системы, идеально подходит: здесь есть делегирование ответственности. Потребитель вашего API будет иметь дело явно с ошибками, поступающих с нижнего уровня системы.
Быстрый упоминания о Groovy
Groovy-это язык, который направлен на desburocratizar работу разработчика. Один из способов, который делает это через то, как мы имеем дело с исключениями, типа checked.
В то время как в Java код, который будет вызывать метод, который вызывает исключение в обязательном порядке должна включать в вызов метода в блок catch или заявление содержит исключения в метод, который вызывает, в Groovy это не это так. Итак, Java-код, подобный подвергается ниже:
try {
negocio.cadastrar(pessoa);
} catch (Validação ex) {
// trato aqui
}
или
void executaAlgo() throws Validação {
(...)
negocio.cadastra(pessoa);
(...)
}
В Groovy я просто вызываю метод, и я включаю в try… catch или я добавляю объявление типа бросает, если я хочу. Ок, игнорирую то исключения? Не.
Если вы будете проектировать API, все, что сказал в отношении Java также относится к Groovy, так как exceptions помогают нам явные границы же.
Завершать
Моя цель в этом посте был выйти за рамки использования по умолчанию исключения, как инструмент, который позволяет нам писать код более надежным. Как они могли видеть, они также помогают нам в реализации лучших Api: договора лучше указать, проще использовать, и которые, следовательно, в конечном итоге создания систем, а также более надежные.
Оригинал: “https://dev.to/loboweissmann/projete-boas-apis-com-java-exceptions-4nan”