Refactorizacion

15 views
Skip to first unread message

miguel agustin cardamone

unread,
Oct 9, 2019, 8:20:59 AM10/9/19
to Aida/Web Smalltalk Web Framework
Hola

tengo estos dos metodos de clase 

priceBeforeTax
| com p p2 |
com := self isBestSeller
ifTrue: [ price / 50 ]
ifFalse: [ price / 100 ].
p := self isBestSeller
ifTrue: [ price * 1.1 ]
ifFalse: [ price ].
p2 := p + com.
^ p2

-----------------------------------------------------------

price
| com p p2 p3 |
self isBestSeller
ifTrue: [ p := price * 1.1.
com := price / 50 ]
ifFalse: [ p := price.
com := price / 100 ].
p2 := p + (p * 21 / 100).
p3 := p2 + com.
^ p3

como se ve hay codigo repetido quiero si pueden me ayuden a refactorizar estos dos metodos 

gracias 

Elvio Fernandez

unread,
Jul 23, 2023, 11:11:38 PM7/23/23
to Aida/Web Smalltalk Web Framework
Miguel,
seguramente después de 4 años habrás encontrado una factorización que te satisfaga.
Voy a dar una sugerencia para otros que se hayan topado con algo parecido y de paso, para saber si este grupo aun esta activo.
La lógica de #price y #priceBeforeTax podrian quedar en la clase Book (asumo que estos mensajes son de Book). La lógica de como calcular el precio dependiendo si #isBestSeller podría ponerse en otra clase como asi tambien el Tax

Book>>priceBeforeTax
| com cost |
com := self type marketPriceFor: price.
cost := self type wholesalePriceFor: price.
^ commercial + cost.

Book>>price
| com cost tax |
com := self type marketPriceFor:  price.
cost := self type wholesalePriceFor:  price.
        tax :=  self type applyTax: (Tax new) on: com.
^ com + tax + cost.

Object subclass: #SaleType 
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Book-Model'

SaleType >> marketPriceFor: aBook
^ self implementedBySubclass.

SaleType >> wholesalePriceFor: aBook
^ self implementedBySubclass.

SaleType >> applyTax: aTax on: amount
       ^ self implementedBySubclass.

SaleType subclass: #CommonSeller
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Book-Model'

CommonSeller >> marketPriceFor: aBook       
       ^ book price / 100.

CommonSeller >>  wholesalePriceFor: aBook       
       ^ book price / 50.

CommonSeller >>   applyTax: aTax on: amount
       ^ aTax applyIVA10: amount .

SaleType subclass: #BestSeller
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Book-Model'

BestSeller >> marketPriceFor: aBook       
       ^ book price * 1.1.

BestSeller >>  wholesalePriceFor: aBook       
       ^ book price.

BestSeller >> applyTax: aTax on: amount
       ^ aTax applyIVA21: amount .


Object subclass: #Tax
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Book-Model'

Tax >> applyIVA21: amount
       ^ (amount  price * 21 / 100).

Tax >> applyIVA10: amount
       ^ (amount  price * 10.5 / 100).


En palabras:  se definieron dos subclasses de SaleType representando la catalogacion BestSeller o CommonSeller. La lógica del precio comercial y el precio de costo se delegan al tipo de venta del Book. Además se delega también la aplicación del impuesto al SaleType. De esta manera si es best seller se aplica el IVA del 21, de otra manera se aplica IVA de 10,5.
En las subclases de SaleType se redefine que tipo de impuesto corresponde, despachando con un mensaje distintas logicas de aplicacion de impuesto.

Saludos
Reply all
Reply to author
Forward
0 new messages