report_lab4
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет Инфокоммуникационных сетей и систем
Кафедра Защищенных систем связи
Дисциплина Разработка защищенного программного обеспечения
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №4
Работа с классами
(тема отчета)
Направление/специальность подготовки
10.03.01 Информационная безопасность
(код и наименование направления/специальности)
Студент:
(Ф.И.О., № группы) (подпись)
Преподаватель:
Цветков А.Ю.
(Ф.И.О) (подпись)
Цель лабораторной работы
Освоить работу с классами Java
Используемое программное обеспечение
JDK 1.5 и выше.
Интегрированная среда разработки на Java.
Задание на лабораторную работу
Написать реализацию для интерфейса основной задачи, rzp.oop.transaction.TransactionController
Написать реализацию для интерфейса дополнительной задачи, rzp.oop.transaction.TransactionControllerExtra
Собрать исполняемый jar и отправить на проверку.
Основное задание:
package rzp.oop.transaction;
import java.util.List;
import java.util.Random;
public interface TransactionController {
/**
* Проверяет выполнение всех условий транзакции:
* <ul>
* <li>Клиент имеет достаточное количество денег, чтобы купить все продукты</li>
* <li>Customer.time меньше, чем Transaction.expireTo на момент подтверждения транзакции</li>
* <li>У каждого продукта цена не отрицательна и не равна 0</li>
* </ul>
* Обязательно откатывает деньги клиента при ошибке транзакции
*
* @param transaction информация о транзакции
* @param customer клиент, запросивший транзакцию
* @return успех транзакции
*/
boolean accept(Transaction transaction, Customer customer);
/**
* Предсказывает максимально возможное время клиента после проведения
* транзакции<br>
* Максимальное время покупки клиентом одного предмета - 99
* @param customer клиент
* @param products список продуктов
* @return максимально возможное время клиента после покупки всех продуктов
*/
long predictMaxCustomerTime(Customer customer, List<Product> products);
final class Transaction {
public final List<Product> products;
public final long expireTo;
public Transaction(List<Product> products, long expireTo) {
this.products = products;
this.expireTo = expireTo;
}
}
final class Product {
public final long price;
public Product(long price) {
this.price = price;
}
}
final class Customer {
private MoneyHolder money;
private long time;
public Customer(MoneyHolder money, long time) {
this.money = money;
this.time = time;
}
public void saveState() {
this.money.saveState();
}
public void restoreState() {
this.money.restoreState();
}
public long getTime() {
return this.time;
}
public boolean buy(Product product) {
money.setMoney(money.getMoney() - product.price);
Random random = new Random();
this.time += random.nextInt(50) + 50;
return money.getMoney() >= 0;
}
}
class MoneyHolder {
private long money;
private long savedMoney;
public MoneyHolder(long money) {
this.money = money;
}
public long getMoney() {
return money;
}
public void setMoney(long money) {
this.money = money;
}
public void saveState() {
savedMoney = money;
}
public void restoreState() {
money = savedMoney;
}
}
}
Листинг программного кода основного задания
import java.util.List;
import java.util.Random;
public class Main implements rzp.oop.transaction.TransactionController{
public static void main(String[] args){}
public boolean accept(Transaction transaction, Customer customer){
boolean pricecorr = true;
boolean buycorr = true;
boolean buysucc;
customer.saveState();
for (int i = 0; i < transaction.products.size(); i++){
buysucc = customer.buy(transaction.products.get(i));
if (transaction.products.get(i).price <= 0 && buysucc){
pricecorr = false;
buysucc = false;
break;
}
}
if (buycorr && customer.getTime() < transaction.expireTo && pricecorr){
return true;
}else{
customer.restoreState();
return false;
}
}
public long predictMaxCustomerTime(Customer customer, List<Product> products){
long maxtime = 0;
long arrsize = products.size();
maxtime += customer.getTime() + arrsize * 99;
return maxtime;
}
}
Вариант дополнительного задания
package rzp.oop.transaction;
import java.util.List;
public interface TransactionControllerExtra extends TransactionController {
/**
* Проверяет выполнение всех условий хотя бы одной транзакции и выполняет её<br>
* Обязательно откатывает состояние денег клиента при неудачах транзакций
*
* @param transactions список транзакций
* @param customer клиент, запросивший транзакцию
* @return успех хотя бы одной транзакции
*/
boolean accept(List<Transaction> transactions, Customer customer);
}
Листинг программного кода дополнительного задания
import java.util.List;
import java.util.Random;
public class Dop extends Main implements rzp.oop.transaction.TransactionControllerExtra{
public static void main(String[] args) {}
/**
* Проверяет выполнение всех условий хотя бы одной транзакции и выполняет её<br>
* Обязательно откатывает состояние денег клиента при неудачах транзакций
*
* @param transactions список транзакций
* @param customer клиент, запросивший транзакцию
* @return успех хотя бы одной транзакции
*/
public boolean accept(List<Transaction> transactions, Customer customer){
boolean succtrans = false;
for (int i = 0; i < transactions.size(); i++){
boolean pricecorr = true;
boolean buycorr = true;
boolean buysucc;
customer.saveState();
for (int j = 0; j < transactions.get(i).products.size(); j++){
buysucc = customer.buy(transactions.get(i).products.get(j));
if (transactions.get(i).products.get(j).price <= 0 && buysucc){
pricecorr = false;
buysucc = false;
break;
}
}
if (buycorr && customer.getTime() < transactions.get(i).expireTo && pricecorr){
customer.saveState();
succtrans = true;
}else{
customer.restoreState();
}
}
if (succtrans){return true;}else{return false;}
}
}
Вывод
Были получены навыки работы с классами и интерфейсами Java.
Санкт-Петербург
2021