Projeto de software é uma atividade essencial no desenvolvimento de aplicações profissionais. Neste sentido, este artigo contribui com o entendimento sobre como modelar aspectos dinâmicos de um projeto baseado no paradigma orientado a objetos. Este artigo destaca a modelagem dinâmica em projetos de software. Para isso, apresenta conceitualmente os diagramas de interação da UML, apresenta alguns exemplos práticos e demonstra como eles podem ser mapeados para código utilizando a linguagem Java.
Neste artigo iremos analisar os diagramas de interação da UML. Diagramas de interação mostram um conjunto específico de interações entre um conjunto de objetos. Neste sentido, buscaremos responder à seguinte questão: "Com o que uma chamada de método se parece na UML?"
Para isso, usaremos um sistema simples de vendas e rastreamento de pagamentos parcialmente completo para ilustrar o uso dos diagramas de sequência e colaboração. Basicamente, o sistema consiste de seis classes Java com os seguintes métodos principais:
Sale
- calcPayments: calcula o total de todos os pagamentos feitos para a venda;
- calcTotal: totaliza o custo de todos os itens adquiridos como parte da venda;
- complete: marca a operação de venda como concluído.
A classe Sale apresentada na Listagem 1 é composta pelos atributos status, total e paymentsTotal, e pelos métodos calcPayments, calcTotal e complete. O construtor da classe é definido entre as linhas 5 e 15. Na sequência temos a implementação do método calcTotal entre as linhas 16 e 25. Entre as linhas 26 e 32 criamos um método de acesso para o atributo total. Já entre as linhas 33 e 42 definimos que o status da compra é igual a complete caso o valor do pagamento seja igual ao valor da compra. Feito isto, definimos entre as linhas 65 e 71 o relacionamento de agregação entre a classe Sale e a classe SaleItem. Já o relacionamento de associação entre as classes Sale e Payment é definido entre as linhas 72 e 79.
1. /**
2. One user transaction consisting of purchases of potentially many kinds of product
3. @stereotype moment-interval
4. */
5. public class Sale {
6. /**
7. calculates the total of the sale from the lineItem subtotals
8. @return total of the sale
9. */
10. public double calcPayments() {
11. paymentsTotal = 0.0;
12. Iterator i = payments.iterator();
13. while (i.hasNext()) paymentsTotal += ((Payment)i.next()).getAmount();
14. return total;
15. }
16. /**
17. calculates the total of the sale from the lineItem subtotals
18. @return total of the sale
19. */
20. public double calcTotal() {
21. total = 0.0;
22. Iterator i = lineItems.iterator();
23. while (i.hasNext()) total += ((LineItem)i.next()).calcTotal();
24. return total;
25. }
26. /**
27. retrieves the cached total of the sale
28. @return total of sale, 0.0 if calcTotal() has not yet been called
29. */
30. public double getTotal() {
31. return total;
32. }
33. /**
34. sets the status of the sale to complete if payments equal price
35. @exception Exce[tion thrown if payments do not equal price
36. */
37. public void complete() throws Exception {
38. if (calcTotal() != calcPayments()) {
39. throw new Exception("Payments do not equal total price");
40. }
41. status = "Complete";
42. }
43. /**
44. adds a line item for a quantity of a type of item
45. @param product the type of item being sold
46. @param qty the quantity of the item being sold
47. */
48. public void addLineItem(Product product, int qty) throws Exception {
49. if (status.equals("Incomplete")) {
50. lineItems.add(new LineItem(product, qty));
51. }
52. else {
53. throw new Exception("Cannot add items to a completed sale");
54. }
55. }
56. /** status of sale */
57. private String status = "Incomplete";
58. /**
59. the cost of this quantity of the item the Product is responsible for
60. handling quantity discounting or time based special deals, etc
61. */
62. private double total;
63. /** the total of all the payments made for this sale */
64. private double paymentsTotal;
65. /**
66. @link aggregation
67. @associates <{LineItem}>
68. @supplierCardinality 1..*
69. @clientCardinality 1
70. */
71. private Vector lineItems = new Vector();
72. /**
73. payments of various kinds
74. @associates <{Payment}>
75. @supplierCardinality 0..*
76. @clientCardinality 1
77. */
78. private Vector payments = new Vector();
79. }
...