Типы задач к коллоквиуму №1 по Java
1. Реализуйте класс Quantity/Money, инкапсулирующий количество товара с поддержкой различных типов единиц измерения. Реализуйте метод для сложения (или другой арифметической операции) двух объектов Quantity/Money.
Комментарии: Обратите внимание на использование BigDecimal для хранения чисел, установку точности (setScale(2)) , особенно при выполнения операций деления.
2. Релизуйте класс корзины интернет-магазина (другого объекта предметной области) по заданному интерфейсу:
public interface Basket { void addProduct(String product, int quantity); void removeProduct(String product); void updateProductQuantity(String product, int quantity); void clear(); List<String> getProducts(); int getProductQuantity(String product); }
Комментарии: стоит обратить внимание на использование наиболее удобной коллекции, (тогда будет меньше кода) и на исключительные ситуации (Exceptions).
3. Релизуйте Сервлет или JSP страницу со следующим поведением:
a) Если пользователь вошел первый раз – отобразить поле ввода с просьбой представиться и кнопкой “Вход”
b) При нажатии кнопки сохранять имя пользователя в Http-сессии на сервере.
c) Если пользователь пользователь уже представился, отображать приветствие и имя пользователя.
Комментарии: акцент на понимание времени жизни атрибутов и параметров request, атрибутов session. Красивые формы на HTML делать не надо.
4. Реализуйте контроллер Spring MVC, который отвечает на следующие HTTP запросы (состояние системы достаточно хранить в памяти):
a. /products/list – возвращает список объектов Product
b. /products/add?product.name=MILK&product.quantity=2 – добавляет в корзину покупателя 2 пакета молока
c. /product/remove?product.name=MILK - удаляет молоко из корзины.
Комментарии: Тут требуется написать только класс контроллера с простейшей реализацией. Акцент на привязку параметров запроса к параметрам (объекта) метода.
5. Напишите Unit-тест(ы) для следующего класса, не вызывая при этом код @Autowired зависимостей:
public class WebPurchaseService { @Autowired PurchaseDao purchaseDao; @Autowired PurchaseValidator purchaseValidator; public PurchaseConfirmation executePurchase(Purchase purchase) { if (!purchaseValidator.validate(purchase)) { throw new PurchaseException("Incorrect order", purchase); } purchaseDao.save(purchase); return new PurchaseConfirmation( purchase ); } }
Комментарии: обычно проще всего один сценарий (ветвь выполнения) покрывать отдельным тестом-методом. Например, в примере выше будет первый тест – на ошибку валидации. Второй тест на успешное сохранение и третий тест на ошибку при вызове метода save(). Чем больше тестов – тем выше оценка работы. Для заглушки/имитации поведения @Autowired зависимостей можно написать свои реализации классов, использовать Mockito или EasyMock. Второе и третье позволит писать меньше кода.
6. С помощью JDBC или других средств работы с базой данных в Java, выведите на консоль результаты выполнения следующего запроса (? – параметры, указанные пользователем):
select name, age from PERSON where name like ? and age between ? and ?
Комментарии: Требуется открыть соединение с базой (создать объект Connection). В случае JDBC – создать PreparedStatement, заполнить параметры, выполнить и пробежаться по результатам. В случае Spring JDBC Template – создать DataSource и JdbcTemplate. Значения параметров можно задать переменными в кода (вводить их с клавиатуры не надо).
7. С помощью JDBC или других средств работы с базой данных в Java, выполните следующую хранимую процедуру (p_id – параметр, возвращаемый из хранимой процедуры необходимо вывести на экран):
P_ADD_MOVIE(p_title VARCHAR2, p_director_id NUMBER, p_id OUT NUMBER)
Комментарии: то же что и для 6-го типа, но CallableStatement или JdbcTemplate/SimpleJdbcCall.
8.Выполните следующую последовательность операций с помощью JDBC или других средств работы с базой данных в Java в одной транзакции (? – параметры, подставляемые пользователем):
update PURCHASE set state=’Оплачен’ where PURCHASE_ID=? insert into PAYMENTS(id, customer_id, purchase_id, amount) values (?,?,?,?,?)
Комментарии: Не забудьте отключить autoCommit и корректно обработать исключения (откатить транзакцию). Значения параметров так же можно задать переменными в коде (не надо вводить с клавиатуры).
Общие комментарии:
- Критерием хорошей оценки будет код, который принципиально правильно работает
- мелкие синтаксические ошибки или неточные (но по смыслу правильные) названия методов учитываться не будут
- нерабочие SQL запросы (даже если они взяты в точности из задания), отсутствие обработки ошибок, забытые неустановленные параметры PreparedStatement и другие принципиальные ошибки будут снижать оценку
- Смесь из методов классов различных платформ (например, из ADO.NET и JDBC) тоже может считаться мелкой неточностью до тех пор, пока в обеих платформах эти методы работают принципиально одинаково
- По теоретическим вопросам – допустимо и приветствуется объяснение своими словами и на примерах