Где я должен поставить следующий метод? - PullRequest
0 голосов
/ 20 октября 2011

У меня есть 2 таблицы с соотношением:

Purchase 1:m Payment
  • У каждой покупки есть первичный ключ «идентификатор-покупки».
  • Каждый платеж имеет первичный ключ «идентификатор-транзакции» ивнешний ключ "purchaseId";

У меня есть класс DAO для каждой таблицы.Теперь я хочу реализовать функцию

List<Payment> findPaymentsByPurchaseId(int purchaseId)

Чтобы API стал более интуитивно понятным, я должен поместить эту функцию в

  1. PurchaseDAO, чтобы указать "хочу ли я найти что-либо на основев разделе Информация о покупке я просто вызываю функцию в PurchaseDAO "
  2. PaymentDAO, чтобы указать" если я хочу найти информацию о платеже, я просто вызываю функцию в PaymentDAO "

Какую функциюВы чувствуете себя более интуитивным?

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

Я бы положил его в PaymentDAO, поскольку он возвращает платежи, но я бы также сделал его более общим

List<Payment> findByPurchase(Purchase purchase)
1 голос
/ 20 октября 2011

Это может быть несколько мест.

При покупке DAO вы бы хотели:

List<Payment> getPaymentsFor(Purchase) // or find..., or findByPurchase, or...

В платежном DAO вы хотите:

Purchase getPurchaseFor(Payment)

(Является ли идентификатор или объект более философским, чем техническим; используйте то, что работает для вас. Предоставление идентификатора может считаться дырявой абстракцией, хотя это скорее когнитивная, поскольку наличие PK не означает это должен быть ПК БД, это может быть просто GUID.)

0 голосов
/ 20 октября 2011

Покупка "знает" о своих платежах - так что спросите.ака «не звони мне, я позвоню тебе»

Лично я создаю иерархию классов, подобную

Purchases
Purchase 
PurchaseDAO

Payments 
Payment
PaymentDAO


Purchases purchases = Purchases.find(criteria); 
// user selects one of the purchases (say)
Purchase = purchase.load(purchaseId);
// calls 
PurchaseDAO.load(purchaseId);
// which calls
Payments payment = Purchase.findPayments(); 
// calls 
Payments.find(purchaseId);
// calls 
PaymentDAO.find(purchaseId);

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

Это выглядит как дополнительная работа (и есть), но она позволяет четко разделить логику бизнеса и постоянства, и я нахожу выплатыподдержать небольшие инвестиции в создание дополнительных классов.

...