RESPONSABILIDADES
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
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
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.
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.
Acho esse texto muito bom:
http://viniciusquaiato.com/blog/responsabilidade-unica-uma-historia-bem-contada/
http://viniciusquaiato.com/blog/responsabilidade-unica-uma-historia-bem-contada/
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
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