Estoy creando una aplicación .net usando nhibernate para mapear datos a entidades. Todavía soy un novato en programación orientada a objetos y ahora tengo esta pregunta:
Tengo entidades como Cliente, Pedido, Producto.Puedo recuperar objetos nhibernate de los datos de la base de datos y enumerar a los clientes, etc. ¿Pero qué sucede si deseo enumerar a los clientes con sus totales de pedidos? Estos no son datos para entidad cliente, ni entidad de orden. ¿Cómo obtener y listar esos datos combinados? ¿Deberían tener su propio objeto de transferencia de datos o hay una mejor manera de hacerlo?
Respuestas
0 para la respuesta № 1Tener una entidad adicional, CustomerList
, que lo hará sostener el Customer
objeto.
los CustomerList
contará con un método para ordenar la lista de acuerdo con los totales de orden, que se realizará accediendo a los totales de orden de cada miembro del miembro y comparándolos.
En PHP, haría algo como eso (Eso es solo un ejemplo, en código real puede haber otras cosas que deberás tener en cuenta).
<?php
/**
* Describe a single customer object
*/
class Customer {
/** @var Order[] List of orders */
private $orders = array();
/**
* Add an order to the order list.
*
* @param Order $order
*/
public function addOrder(Order $order) {
if (!in_array($order, $this->orders, true)) {
$this->orders[] = $order;
}
}
/**
* Get an order by numeric index.
*
* @param int $index
*
* @return Order
*/
public function getOrder($index) {
return $this->orders[$index];
}
/**
* Get total number of orders for customer.
*
* @return int
*/
public function getOrdersTotal() {
return count($this->orders);
}
}
/**
* Describe a single order.
* I didn"t include any information here because it"s not relevant.
*/
class Order {
}
/**
* Describe a list of customers.
*/
class CustomerList {
/** @var Customer[] List of customers */
private $customers;
/**
* Add a customer to the list
*
* @param Customer $customer
*/
public function addCustomer(Customer $customer) {
$this->customers[] = $customer;
}
/**
* The sorting function.
* Compare the orders total and return 1/0/-1 accordingly.
*
* @param Customer $a
* @param Customer $b
*
* @return int
*/
public function sort($a, $b) {
if ($a->getOrdersTotal() === $b->getOrdersTotal()) {
return 0;
}
return ($a->getOrdersTotal() > $b->getOrdersTotal()) ? 1 : -1;
}
/**
* Call the sorting function on the customer list
*/
public function sortCustomers() {
usort($this->customers, array($this, "sort"));
}
/**
* Return the full customer array.
*
* @return Customer[]
*/
public function getCustomers() {
return $this->customers;
}
}
//Instantiation
$cList = new CustomerList();
$customer1 = new Customer();
$customer2 = new Customer();
$customer3 = new Customer();
$order1 = new Order();
$order2 = new Order();
$order3 = new Order();
$order4 = new Order();
$order5 = new Order();
$order6 = new Order();
$customer1->addOrder($order1);
$customer1->addOrder($order2);
$customer2->addOrder($order3);
$customer3->addOrder($order4);
$customer3->addOrder($order5);
$customer3->addOrder($order6);
$cList->addCustomer($customer1);
$cList->addCustomer($customer2);
$cList->addCustomer($customer3);
//List customers before sorting
var_dump($cList->getCustomers());
$cList->sortCustomers();
//List customers after sorting
var_dump($cList->getCustomers());