RESPONSABILIDADES

JABA 23/09/2012 14:24:30
#410281
Olá pessoal, boa tarde!!!

Gostaria da opnião dos senhores no seguinte caso:

Pedido tem uma lista de ItemPedido. Abaixo a implementação da class ItemPedido de duas formas diferentes:

Caso 1:

Public Class ItemPedido

Public Property Produto As Produto
Public Property Quantidade As Integer

Public Sub incrementarItemEDecrementarQuantidadeProduto(quantidade As Integer)
If quantidade < 1 Then Throw New Exception([Ô]O campo da quantidade não pode ser menor do que um[Ô])
Me.Quantidade = Me.Quantidade + quantidade
Produto.decrementarQuantidade(quantidade)
End Sub

End Class

Caso 2:

Public Class ItemPedido

Public Event itemAdicionado(ByVal sender As Object, ByVal e As EventArgsItemAdicionado)
Public Property Produto As Produto
Public Property Quantidade As Integer

Public Sub incrementarItem(quantidade As Integer)
If quantidade < 1 Then Throw New Exception([Ô]O campo da quantidade não pode ser menor do que um[Ô])
Me.Quantidade = Me.Quantidade + quantidade
OnItemAdicionado(quantidade)
End Sub

Protected Overridable Sub OnItemAdicionado(quantidade As Integer)
RaiseEvent itemAdicionado(Me, New EventArgsItemAdicionado(Me, quantidade))
End Sub

End Class

Como vocês podem ver, as duas classes são a mesma, só que elas foram implementadas de forma diferente para exemplificar. No caso 1, incrementa-se a quantidade do itemPedido e decrementa-se a quantidade no produto para abater no estoque. Tudo no mesmo metodo. No segundo caso, incrementa-se a quantidade do ItemPedido e lança um evento de ItemAdicionado para injetar essa responsabilidade. Desta forma, esse evento poderá ser capturado na classe do Pedido (que é a classe responsavel por adicionar o item), podendo-se decrementar o produto no estoque pelo evento capturado.

No caso1, as coisas ficam mais simples, porém, com responsabilidades a mais dentro do metodo.
No caso2, as coisas ficam mais complexas e o entendimento ficará mais dificil, porém, o ganho vem por colocar as coisas no seu devido lugar.

Gostaria da opnião de vocês e também saber qual é implementação mais indicada, o caso 1 ou o caso 2?

vlw
LLAIA 26/09/2012 15:08:19
#410566
Resposta escolhida
Caso 2 é melhor.

Um método deve ter apenas uma responsabilidade, e de preferência sem Ifs ou Select Cases que venham a definir múltiplos comportamentos também. Tem que ser coeso.
E por consequência, a sua classe vai também adquirindo tais qualidades.
LLAIA 26/09/2012 15:16:26
#410569
JABA 26/09/2012 17:03:51
#410587
LLAIA, agradeço sua atenção.

Com relação ao método incrementarItem abaixo, eu estou verificando se existe o item pelo codigo de barras na lista de itens do pedido (existeItemCom(codbarras)), pois se ele existir, só será preciso incrementar a quantidade dele. Diante dessa situação, é correto fazer essa busca dentro desse método ou o ideal é verificar se o item existe fora do método, e caso exista, passa-lo como parâmetro para o metodo incrementarItem?

Public Class Pedido

Public Sub incrementarItem(codbarras As String, quantidade As Integer)
If existeItemCom(codbarras) Then
Dim item = getItem(codbarras)
item.incrementar(quantidade)
OnItemAdicionado(item, quantidade)
End If
End Sub

Protected Overridable Sub OnItemAdicionado(quantidade As Integer)
RaiseEvent itemAdicionado(Me, New EventArgsItemAdicionado(Me, quantidade))
End Sub

End Class

vlw
Tópico encerrado , respostas não são mais permitidas