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