2016-04-14 3 views
0

Например, у меня есть два класса: книга и клиент. У Клиента есть Список, который содержит все приобретенные Книги. Этот проект можно легко найти в истории покупок Клиента.Должен ли объект знать, какие у него есть другие объекты?

Однако, если я хочу знать, сколько Клиентов купило определенную книгу, я бы, как правило, искал всю историю покупок Клиентов и получил тех, кто купил эту книгу. Это может быть трудоемким процессом поиска. Интересно, будет ли это лучший подход для добавления списка в класс Book и добавьте всех Клиентов, которые купили эту книгу в этом списке.

Интересно, будет ли мой подход лучше/хуже с точки зрения дизайна. Это, безусловно, делает Book-Client тесно связанным, но я не уверен, есть ли другие способы реализовать такой метод.

+3

Список книг, которые приобрели то, что принадлежит книжному магазину, а не книге. –

+0

Можно ли установить счетчик для каждой книги, то есть 5 копий книги А, и для каждого клиента, который вынимает бонус, вы вычитаете счет? Таким образом, вы знаете, что всего 5 книг, и 3 выведенных, что осталось 2. Это также поможет с «отсутствием проблем с выпуском» – XaolingBao

ответ

1

В идеале, чтобы быть чистым, ни книга, ни заказчик не должны знать друг о друге. Вместо этого я создал бы третий класс «Покупка», содержащий ссылки на клиента и книгу, дату заказа, дату отправления, цену и т. Д.

Тогда у меня был бы Map<Customer, List<Purchase>> и, необязательно, Map<Book, List<Purchase>>.

+0

Не будет ли он использовать больше памяти/места для хранения? Я имею в виду, что у меня уже есть объекты Customer и Book, и добавление большего количества объектов, по-видимому, является потребляемой памятью. Может ли память/пространство для хранения быть полностью вытеснено сегодня? –

+0

@hybpro это добавило бы лишь небольшое количество дополнительного использования памяти. Само определение класса использует незначительный объем памяти. Это объекты (экземпляры), которые используют большую часть памяти, и добавление класса Purchase добавит лишь небольшое количество дополнительных требований к памяти на один экземпляр, поскольку большинство полей в классе «Покупка» в противном случае присутствовало бы в клиенте или книге классы. Таким образом, вы перемещаете поля, а не добавляете новые. Гибкость, которую это добавляет, обычно стоит того, если вы не находитесь на жестком диске с ограниченным объемом памяти, например очень старый смартфон. –

0

Даже класс Customer со ссылкой на список книг не так уж хорош.

Храните как классы клиентов, так и книги, не знающие друг друга. Вместо этого сохраните карты для быстрой справки. например -

Map<Customer, List<Book>> customerToBooks; 
Map<Book, List<Customer>> bookToCustomers; 

И манипулируют эти карты через assignBook(Customer c, Book b) и returnBook(Customer c, Book b) методы

0

Одна вещь, которую вы можете сделать, это проверить список внутри класса клиента, проверка истории покупки книги, как так:

Customer.java

public class Customer{ 
    public Set<Book> purchases = new HashSet<Book>(); 

    public void purchaseBook(Book b){ 
     purchases.add(b); 
    } 
} 

Оригинальный класс:

public Set<Customer> customers = new HashSet<Customer>(); 

public Set<Customer> getCustomersFromBook(Book b){ 
    Set<Customer> ret = new HashSet<Customer>(); 
    for(Customer c : customers){ 
     if(c.purchases.contains(b)){ 
      ret.add(c); 
     } 
    } 
    return ret; 
} 

Или вы можете сделать то же самое, но с клиентами внутри Set в классе Book.

Смежные вопросы