Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925

А не попрограммировать ли нам вместе?

17.12.2015, 15:48. Показов 1853. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, я собираюсь сделать памятку по юзанию спринга, хибернейта для новичков (без особых деталей и тонкостей, а вот собрать это вместе и заставить работать думаю сделаем). Но она довольно объемная, и боюсь у меня не хватит времени и терпения ее сделать зараз. Поэтому предлагаю заняться этим вместе.
От того кто захочет поучавствовать в этом "безобразии" требуется как минимум знаниее ООП и базовые знания SE.
Задачу целиком сразу выкладывать не буду. Я разбил ее на несколько простых действий и в процессе ее будем усложнять.
Еще раз повторюсь что расчитано на новичков, которым нужен толчек для старта на покорение ЕЕ. Однако советы опытных коллег лишними тоже не окажутся =).

Итак.
Часть №1

Мы разрабатываем систему учета заказов.
У нас есть Заказчики (Customer), они, соответсвенно могут сделать один или несколько заказов (Order) разных товаров (Product).
Нам нужно вот под это дело создать классы.
Жду ваших вариантов, через какое время выложу свое видение этого. Дабы забивать тему листингами, прячьте решения под спойлеры. Если решать лень, но тема интересная, жмите +1 что бы я понимал, что эта памятка интересна, и у меня был бы стримул ее доделать

Часть 2 github
Часть 3 github
9
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2015, 15:48
Ответы с готовыми решениями:

Остались еще готовые попрограммировать на ASP + VB + MSSQL
Остались еще готовые попрограммировать на ASP + VB + MSSQL? Компания хорошая. Проект - один из лучших в отрасли. Перспективы роста есть....

Запуск ПК, а вместе с ним и google chrome вместе с вкладкой akisho
Сначала была стартовая страница time to read, и поиск go search, потом поисковик был майла. После нескольких манипуляций удалось избавиться...

Не работают вместе 2 скрипта вместе
Добрый день! подскажите как заставить работать эти 2 скрипта вместе? Работают только по отдельности $(document).ready(function(){ ...

23
http://1248.site
131 / 119 / 20
Регистрация: 15.05.2012
Сообщений: 346
Записей в блоге: 10
17.12.2015, 22:17
reisal78, я тут ответ писал в аналогичную тему , возможно ли проект сделать в виде github репозитория, лично для меня было бы крайне интересно работать с Saros плагином к эклипсу. Но я не привередлив, так что я в теме.
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
17.12.2015, 22:39  [ТС]
RinatV, увы, моя душа продана IntelliJ IDEA =)

Цитата Сообщение от RinatV Посмотреть сообщение
возможно ли проект сделать в виде github репозитория
Можно, и даже нужно, но продублировать на форуме все равно придется, дабы не нарушать правила
Тем более для того что я задумал кода не так уж и много будет...
1
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485
18.12.2015, 13:39
Хм, начну, что ли. Если я правильно понял, то, допустим, класс Customer выглядит как-то так?
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import java.util.ArrayList;
 
public class Customer {
   private int id;
   private String name;
   private String last_name;
   private String address;
   private long CreditCard;
   private ArrayList<Order> customerOrder;
 
    public Customer(int id, String name, String last_name, ArrayList<Order> customerOrder) {
        this.id = id;
        this.name = name;
        this.last_name = last_name;
        this.customerOrder = customerOrder;
    }
 
    public Customer(int id, String name, String last_name, String address, long CreditCard) {
        this.id = id;
        this.name = name;
        this.last_name = last_name;
        this.address = address;
        this.CreditCard = CreditCard;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getLast_name() {
        return last_name;
    }
 
    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    public long getCreditCard() {
        return CreditCard;
    }
 
    public void setCreditCard(long CreditCard) {
        this.CreditCard = CreditCard;
    }
   
   
    public ArrayList<Order> getCustomerOrder() {
        return customerOrder;
    }
 
    public void setCustomerOrder(ArrayList<Order> customerOrder) {
        this.customerOrder = customerOrder;
    }
}
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
18.12.2015, 13:45  [ТС]
Я понимаю что данная часть совсем для новичков и скучна, но давайте все же вместе подумаем...
С классом Customer вроде все понятно.

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
public class Customer {
 
    private Long customerId;
    private String title;
    private Address legalAddress; //Я создал этот класс, для того что бы в будущем продемострировать как его сохранить в БД
    private Set<Order> orders = new HashSet<>();
 
    //constructors, getters and setters
}



А вот как быть с классом Order? в нем нужно хранить продукты и их количество, в заказе. Как хранить будем?
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.12.2015, 13:48
Цитата Сообщение от reisal78 Посмотреть сообщение
Как хранить будем?
Тут можно Map'ом воспользоваться.
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
18.12.2015, 13:58  [ТС]
Alradalion, вы меня немного опередили.
По вашему варианту:
Java
1
private ArrayList<Order> customerOrder;
Почему вы выбрали именно эту коллекцию?
И если уж использовать List, то лучше объявить ее как List<Order> , это в будущем позволит там использовать разные реализации листа, если будет в этом необходимость.

Добавлено через 5 минут
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Тут можно Map'ом воспользоваться.
Вас не затруднит пару строк кода набросать? =)
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.12.2015, 14:33
reisal78, у заказа помимо продуктов и их количества должен быть уникальный номер.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Order
{
    Customer customer;
    Map<Product, Integer> products = new HashMap<>();
    long number;
 
    public Order(Customer customer, Product product, int amount)
    {
        this.customer = customer;
        products.put(product, amount);
        // будем считать, что timestamp - уникальный номер
        // для каждого заказа
        number = System.currentTimeMillis();
    }
 
    // getters, setters, etc.
}
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
18.12.2015, 14:44  [ТС]
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
у заказа помимо продуктов и их количества должен быть уникальный номер.
Согласен. Забегая вперед... нужен будет уникальный id для хранения в БД, но это уже ближе к делу добавим.

Я вот что подумал то... Но ведь в заказе помимо товара, количества есть же еще цена. А ее где сохраним?
0
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485
18.12.2015, 15:17
Цитата Сообщение от reisal78 Посмотреть сообщение
Почему вы выбрали именно эту коллекцию?
И если уж использовать List, то лучше объявить ее как List<Order> , это в будущем позволит там использовать разные реализации листа, если будет в этом необходимость.
Ну, с учетом того, что я новичок и использую то, с чем лучше знаком, отсюда и выбор) По сути, реальных доводов за его использование я вам не приведу.

Цитата Сообщение от reisal78 Посмотреть сообщение
Я вот что подумал то... Но ведь в заказе помимо товара, количества есть же еще цена. А ее где сохраним?
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Map<Product, Integer> products = new HashMap<>();
Возможно предложу несколько неверное решение, но тапками не кидайтесь)
Что если использовать в Map'е не products, а еще один класс - "Подробности заказа", в котором и хранить количество товара, стоимость, допустим, скидку и так далее
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.12.2015, 17:16
reisal78, Alradalion, блин в голове сейчас куча идей, которые нужно привести в порядок. Как справлюсь, попробую выложить код для этих трех классов.

Добавлено через 1 час 11 минут
Цитата Сообщение от Alradalion Посмотреть сообщение
Что если использовать в Map'е
Тогда уже не в Map'е, а в List'е.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
18.12.2015, 17:20
Я бы на вашем месте изменил подход к задаче. Вы бросились писать код без понимания того, какую проблему вы хотите решить. Вам нужно определится с функионалом системы и требованиями. Затем написать дизайн и UML и только потом писать код. Сейчас в ваших релизациях уже есть некоторые проблемы и недостатки. Если будите кидать кусаи кода, качественно вряд ли выдет
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
18.12.2015, 19:49  [ТС]
KEKCoGEN, Да я на самом деле планировал все несколько проще, набросать несколько сущностей, создать дао, сервисы продемонстрировать внедрение зависимостей сконфигурировать все это безобразие без xml да показать Jpа репозиторий.

Добавлено через 17 секунд
а ну и как мапить разные связи.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
19.12.2015, 23:05
Обычно, связанность классов стараются уменьшить, вынося связи в другие места.

Например, так:
Domain

Customer
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package domain;
 
/**
 *
 */
public final class Customer {
    private final long id;
    private final String name;
 
    public static class Builder {
 
        private String name;
 
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
 
        public String getName() {
            return name;
        }
 
        public Customer build(long id) {
            return new Customer(id, name);
        }
    }
 
    public Customer(long id, String name) {
        this.id = id;
        this.name = name;
    }
 
    public long getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Customer customer = (Customer) o;
        return id == customer.id;
 
    }
 
    @Override
    public int hashCode() {
        return (int) (id ^ (id >>> 32));
    }
 
    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Order
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package domain;
 
/**
 *
 */
public final class Order {
    private final long id;
    private final long customerId;
    private final long productId;
    private final long amount;
    private final long price;
 
    public static class Builder {
        private long customerId;
        private long productId;
        private long amount;
        private long price;
 
        public Builder setCustomerId(long customerId) {
            this.customerId = customerId;
            return this;
        }
 
        public Builder setProductId(long productId) {
            this.productId = productId;
            return this;
        }
 
        public Builder setAmount(long amount) {
            this.amount = amount;
            return this;
        }
 
        public Builder setPrice(long price) {
            this.price = price;
            return this;
        }
 
        public long getCustomerId() {
            return customerId;
        }
 
        public long getProductId() {
            return productId;
        }
 
        public long getAmount() {
            return amount;
        }
 
        public long getPrice() {
            return price;
        }
 
        public Order build(long id) {
            return new Order(id, customerId, productId, amount, price);
        }
    }
 
    public Order(long id, long customerId, long productId, long amount, long price) {
        this.id = id;
        this.customerId = customerId;
        this.productId = productId;
        this.amount = amount;
        this.price = price;
    }
 
    public long getId() {
        return id;
    }
 
    public long getCustomerId() {
        return customerId;
    }
 
    public long getProductId() {
        return productId;
    }
 
    public long getAmount() {
        return amount;
    }
 
    public long getPrice() {
        return price;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Order order = (Order) o;
        return id == order.id;
    }
 
    @Override
    public int hashCode() {
        return (int) (id ^ (id >>> 32));
    }
 
    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", customerId=" + customerId +
                ", productId=" + productId +
                ", price=" + price +
                '}';
    }
}

Product
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package domain;
 
/**
 *
 */
public final class Product {
    private final long id;
    private final String name;
    private final String description;
 
    public static class Builder {
        private String name = "";
        private String description = "";
 
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
 
        public Builder setDescription(String description) {
            this.description = description;
            return this;
        }
 
        public String getName() {
            return name;
        }
 
        public String getDescription() {
            return description;
        }
 
        public Product build(long id) {
            return new Product(id, name, description);
        }
    }
 
    public Product(long id, String name, String description) {
        this.id = id;
        this.name = name;
        this.description = description;
    }
 
    public long getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
    public String getDescription() {
        return description;
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Product product = (Product) o;
        return id == product.id;
    }
 
    @Override
    public int hashCode() {
        return (int) (id ^ (id >>> 32));
    }
 
    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}


Как можете заметить, классы не зависят друг от друга на прямую, только через id. Ни агрегации, ни наследования.

Почему? Сложный ответ -- потому что это уменьшает связанность. Простой ответ -- потом со столь сложными классами будет затруднительно работать. Избыточность чтения данных и т.д. и т.п.

Соответственно, связь происходит на других уровнях. Например, дао:
Dao

Customer
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package dao;
 
import domain.Customer;
 
import java.util.Optional;
import java.util.Set;
 
/**
 *
 */
public interface CustomerSource {
 
    Optional<Customer> find(long id);
 
    Set<Customer> findAll();
 
    Set<Customer> findByName(String name);
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package dao;
 
import domain.Customer;
 
/**
 *
 */
public interface CustomerDao extends CustomerSource {
 
    Customer create(Customer.Builder builder);
 
    Customer update(Customer customer);
 
    boolean delete(long id);
}

Order
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package dao;
 
import domain.Order;
 
import java.util.Optional;
import java.util.Set;
 
/**
 *
 */
public interface OrderSource {
 
    Optional<Order> find(long id);
 
    Set<Order> findAll();
 
    Set<Order> findByCustomer(long customerId);
 
    Set<Order> findByProduct(long productId);
 
    Set<Order> findByCustomerAndProduct(long customerId, long productId);
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package dao;
 
import domain.Order;
 
/**
 *
 */
public interface OrderDao extends OrderSource {
 
    Order create(Order.Builder builder);
 
    Order update(Order order);
 
    boolean delete(long id);
}

Product
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package dao;
 
import domain.Product;
 
import java.util.Optional;
import java.util.Set;
 
/**
 *
 */
public interface ProductSource {
 
    Optional<Product> find(long id);
 
    Set<Product> findAll();
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package dao;
 
import domain.Product;
 
/**
 *
 */
public interface ProductDao extends ProductSource {
 
    Product create(Product.Builder builder);
 
    Product update(Product product);
 
    boolean delete(long id);
}


Разбивка на Source и Dao сделана обычно для того, чтобы избежать избыточной связанности, плюс таким образом можно удобно показать, что данные не будут модифицироваться. Скорее всего в вашей задаче не обязательно так делать.

Добавлено через 6 минут
В дальнейшем, если нужна какая-либо информация, создаётся фасад, собирающий данные воедино. Например:

CustomerOrders
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package service;
 
import dao.CustomerDao;
import dao.CustomerSource;
import dao.OrderDao;
import dao.OrderSource;
import domain.Customer;
import domain.Order;
 
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
 
/**
 *
 */
public class CustomerOrders {
    private final OrderSource orderDao;
    private final CustomerSource customerDao;
 
    public CustomerOrders(OrderDao orderDao, CustomerDao customerDao) {
        this.orderDao = orderDao;
        this.customerDao = customerDao;
    }
 
    public Map<Customer, Set<Order>> getOrdersByCustomerName(String customerName) {
        return customerDao
                .findByName(customerName)
                .stream()
                .collect(Collectors.toMap(Function.<Customer>identity(), c-> orderDao.findByCustomer(c.getId())));
    }
}

(Названо сервисом исключительно в силу привычки.)
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
20.12.2015, 08:47  [ТС]
lemegeton, а в чем преимущества .Builder builder?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
20.12.2015, 12:33
Использование Builder'ов является явным указанием отличия сохранённого в базе объекта от ещё не созданного. (Ну и когда проекту десяток лет, наличие билдеров при создании чего-нибудь закостыленного -- как глоток свежего воздуха.)

Когда нужно вызывать OrderDao#create(Order) по сигнатуре не слишком понятно, как создать объект Order и какого поведения ожидать от вызова. Какой ключ назначить передаваемой сущности? Не превратится ли create в update если я передам Order с уже готовым ключом?

На тёмной стороне такого решения -- его многословность и несовместимость с JPA.


В принципе, использование билдера не обязательно, а в случае работы с JPA еще и не желательное.
1
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
20.12.2015, 14:50  [ТС]
lemegeton, с этой стороны я об этом не размышлял.

Цитата Сообщение от lemegeton Посмотреть сообщение
Не превратится ли create в update если я передам Order с уже готовым ключом?
А разве для dao нужно разделять эти вещи? В моем понимании DAO - сохранить - получить объекты из хранилища. А уж разруливать что там должно апдейтиться или создаваться должны или сервисный слой или бизнес логика приложения.

@ALL к следующему шагу перейдем в понедельник.
1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
20.12.2015, 21:55
Цитата Сообщение от reisal78 Посмотреть сообщение
А разве для dao нужно разделять эти вещи?
Желательно разделять create и update. Иначе, при изменении реализации может встретится ситуация когда их использование перепутано.

JPA реализации вроде hibernate элегантно обходят эту проблему предоставляя только save, который по-сути createIfExistsUpdate. Однако подобная элегантность оборачивается низкой производительностью и усложнённой поддержкой.

Цитата Сообщение от reisal78 Посмотреть сообщение
В моем понимании DAO - сохранить - получить объекты из хранилища. А уж разруливать что там должно апдейтиться или создаваться должны или сервисный слой или бизнес логика приложения.
Да, это именно так.
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
22.12.2015, 14:08  [ТС]
Ну ладно, раз не хотите принимать активного участия, то я тоже немного упрощу задачу... =)

Забываем про заказчиков заказы и тд. Пример будет проще.

Фильмотека.

Определим сущности:

Режиссер (Producer) - у режиссера может быть несколько фильмов
Фильм (Film) - в фильме могут сниматься несколько актеров.
Актер (Actor) - один актер может сниматься в нескольких фильмах.
Персональная информация (PersonalInformation) - у актеров и режиссеров есть Имя, Фамилия и дата рождения. Можно было это вынести это вещи в супер класс от которого унаследовались бы актеры и режиссеры, но я сделаю так, что показать как это все будет ложиться в базу данных.
Подробная информация (FilmDetails) - у каждого фильма есть подробная информация.

Функционал:
Создать фильм, режиссера, актера.
Отредактировать фильм, режиссера, актера.
Удалить фильм, режиссера, актера.
Поиск всех фильмов режиссера.
Поиск всех фильмов с актером.

Код:

Cущности
Java
1
2
3
4
5
6
public class PersonalInformation {
    private String firstName;
    private String lastName;
    private Date birthday;
    //constructors, getters and setters
}
Java
1
2
3
4
5
public class Produсer {
    private Long id;
    private PersonalInformation personalInformation;
    //constructors, getters and setters
}
Java
1
2
3
4
5
6
7
public class Film {
    private Long id;
    private String title;
    private Produсer produсer;
    private Set<Actor> actors = new HashSet<>();
    //constructors, getters and setters
}
Java
1
2
3
4
5
6
public class Actor {
    private Long id;
    private PersonalInformation personalInformation;
    private Set<Film> films = new HashSet<>();
    //constructors, getters and setters
}
Java
1
2
3
4
5
6
public class FilmDetails {
    private Long id;
    private String description;
    private Date date;
    //constructors, getters and setters
}

Ну и сама программа:
Java
1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        //Сначала посоздаем объекты, которые могут быть использованы несколькими сущностями.
        Produсer produсer1 = new Produсer(1L, new PersonalInformation("Леонид", "Гайдай",
                new GregorianCalendar(1923, 0, 30).getTime()));
 
        Actor actor1 = new Actor(1L, new PersonalInformation("Александр", "Демьяненко",
                new GregorianCalendar(1937, 04, 30).getTime()));
    }
Чувствуете уже хрень пошла? Ведь перед пользователь который будет заполнять фильмотеку понятия не имеет ни о каких объектах и прочей чертовщины. Ведь он, к примеру, жмет кнопку "добавить режиссера", вводит в текст боксы информацию жмет сохранить. Ему безразлично какой id присвоится этому режиссеру, и совсем не обязательно знать что грегориан календарь месяц-1 происит вводить. Да мы еще и понятия не имеем какой интерфес будет у нашей програмы. Сможет он сам создать объект или он сможет передавать только строковые параметры.
Поэтому мы наше приложение разделим на несколько слоев. Один слой это будет слой DAO, который будет обеспечивать сохранение объектов.
Другой слой будет слой сервисов, который будет от интерфейса принимать данные, собирать их в нужные объекты, и используя слой DAO получать или сохранять их.
Итак создадим сервис, и дао класс (что бы не тратить время на реализацию дао, я сделаю заглушку которая будет сохранять объекты в колекции в память(На следующем шаге подменим реализацию на сохранение в БД))
Я сделаю сейчас только маленькую часть, остальные реализации жду от вас. (ниже будет ссылка на гитхаб, форкайте,реализуйте и пульте). Для каждой сущности должен быть свой отдельный dao и service классы. И соответсвенно все это безобразие делается через интерфейсы. Почему.

Пример для сущности режиссер:
DAO
Java
1
2
3
4
5
6
7
8
9
10
11
public interface ProducerDao {
    Produсer create(Produсer produсer);
 
    void update(Produсer produсer);
 
    void delete(Produсer produсer);
 
    void deleteById(Long id);
 
    List<Produсer> getAll();
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class ProducerDaoImpl implements ProducerDao {
 
    private List<Produсer> produсers = new ArrayList<>();
 
 
    @Override
    public Produсer create(Produсer produсer) {
        produсers.add(produсer);
        return produсer;
    }
 
    @Override
    public void update(Produсer produсer) {
        Long id = produсer.getId();
        for (int i = 0; i < produсers.size(); i++) {
            if (produсers.get(i).getId().equals(id)) {
                produсers.set(i, produсer);
            }
        }
    }
 
    @Override
    public void delete(Produсer produсer) {
        if (produсers.contains(produсer)) {
            produсers.remove(produсer);
        }
    }
 
    @Override
    public void deleteById(Long id) {
        for (int i = 0; i < produсers.size(); i++) {
            if (produсers.get(i).getId().equals(id)) {
                produсers.remove(i);
            }
        }
 
    }
 
    @Override
    public List<Produсer> getAll() {
        return produсers;
    }
}

Service

Java
1
2
3
4
public interface ProducerService {
    Produсer create(String firstName, String lastName, String year, String month, String day);
    //Other methods
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ProducerServiceImp implements ProducerService {
 
    private static Long producerCount = 0L;
    private ProducerDao dao;
 
 
    public ProducerServiceImp(ProducerDao dao) {
        this.dao = dao;
    }
 
    @Override
    public Produсer create(String firstName, String lastName, String year, String month, String day) {
        //Проверки валидности параметров
        Date d = new GregorianCalendar(
                Integer.valueOf(year), Integer.valueOf(month) - 1, Integer.valueOf(day)).getTime();
        Produсer produсer = new Produсer(producerCount++, new PersonalInformation(firstName, lastName, d));
        return dao.create(produсer);
    }
}


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public static void main(String[] args) {
        if (args.length < 5) {
            System.err.println("Задайте параметратрах Имя Фамилию Год Месяц День, разделяя пробелом");
            System.exit(-1);
        }
 
        //Создавать через new это безобразие не стоит, в следующей части воспользуемся для этого спригом.
 
        ProducerDao dao = new ProducerDaoImpl();
        ProducerService service = new ProducerServiceImp(dao);
 
        Produсer p = service.create(args[0], args[1], args[2], args[3], args[4]);
 
        System.out.println(p);  //Для выполнения команды
                                // нужно переопрелить toString() класса Producer
 
    }
как избаваться от new в следующей части.
От вас доделать дао и сервисы. (Для повторяющихся методов дао можно прикрутить суперкласс с женериками)
Проект на гитхабе github
0
23.12.2015, 17:44

Не по теме:

ждем Часть 3 :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.12.2015, 17:44
Помогаю со студенческими работами здесь

Задачи по НАМ
Есть 2 задачи: 1.Задано алфавит A = {а, b, c}. В Непустое словир P удвоить первый символ, то есть приписать этот символ слева в P. ...

Задачи по НАМ
Есть 2 задачи 1.Aлфавит (a,b)- В непустом слове P переставить первый и последний символы. 2.Aлфавит (a,b,с)- из всех вхождение символа...

К нам пришла проверка?
http://sb.yandex.ru/ http://sb.cloudkill.yandex.ru/ и другими вариациями адресов сегодня засыпали заходами - это проверка? - а...

вики нам поможет
Собственно по теме: нашел большую брешь в вики, куда очень много можно понаписать полезной и нужной информации. В ответ на свои действия...

Машина Тьюринга и НАМ
Здравствуйте! Каким образом решить данные задачи? Пытался разобраться сам, но ничего не получается... Заранее спасибо. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru