Типы задач к коллоквиуму №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) тоже может считаться мелкой неточностью до тех пор, пока в обеих платформах эти методы работают принципиально одинаково

-          По теоретическим вопросам – допустимо и приветствуется объяснение своими словами и на примерах