On 2 avr. 2014, at 18:45, nacho <[email protected]> wrote:
>
> Hi Nacho,
>
> I wouldn't throw an error because otherwise one must know beforehand that an
> equation is non-resolvable or must use #on:do: everywhere.
> Since that when you ask to resolve an equation you get back a collection of
> solutions, a non-resolvable equation could just return an empty collection,
> couldn't it?.
> If you really want to consider that asking to resolve a non-resolvable
> equation is an error, another solution would be to provide a #rootsIfNone:
> method. That's a common pattern in Smalltalk.
> I would also rename 'checkNegative' to 'discriminant', because it's not
> obvious to see what that variable represents at first glance.
>
> Very good points. I came up with a third draft. This is evolving good!
> Thanks
> Nacho
In fact, what I meant is that the function that compute the roots should be
called #calculateRootIfNone: and take a block as parameter:
QuadraticEquation>>calculateRootsIfNone: aBlock
| discriminant |
discriminant := linearCoefficient squared - ( 4 *
quadraticCoefficient * constant).
discriminant >= 0
ifFalse: aBlock
ifTrue: [ ^ self solveRoots: discriminant]
Like this, you can provide a #calcultaeRoots method like this:
QuadraticEquation>>calculateRoots
^ self calculateRootsIfNone: [ self error: 'No real solution for the
equation' ]
And you could even provide a #calculateRootsSafely that just return an empty
array.
QuadraticEquation>>calculateRootsSafely
^ self calculateRootsIfNone: [ { } ]
This is a common pattern in Smalltalk. Look at collection methods like
#detect:ifNone: #at:ifPresent: #at:ifAbsent: ,etc ...
BTW, is it expected that when the discriminant equals 0, the same root is
returned twice?
>
> "The idea is to have a class to calculate quadratic equations.
> This second third still only calculates real roots (leaving aside imaginary
> roots).
> But thanks to Damien Cassou, and Camille Teruel has a better style.
>
> A QuadraticEquation is a class used to solve Quadratic Equations of the
> form: ax^2 + bx + c = 0, where a is not 0.
>
> You can set the coefficients using the following method
> setQuadraticCoefficient: linearCoefficient: constant:"
>
> Object subclass: #QuadraticEquation
> instanceVariableNames: 'quadraticCoefficient linearCoefficient constant
> roots'
> classVariableNames: ''
> category: 'IS-Math'
>
> "I create accessors (only getters for each term) and then the following
> method to set the terms"
> setQuadraticCoefficient: aNumber1 linearCoefficient: aNumber2 constant:
> aNumber3
> quadraticCoefficient := aNumber1.
> linearCoefficient := aNumber2.
> constant := aNumber3
>
>
>
> QuadraticEquation>>calculateRoots
> | discriminant |
> discriminant := linearCoefficient squared - ( 4 *
> quadraticCoefficient *
> constant).
>
> discriminant >= 0
> ifFalse: [ ^ self rootsIfNone ]
> ifTrue: [ ^ self solveRoots: discriminant]
>
>
> QuadraticEquation>>solveRoots: aTerm
> | rootA rootB |
> roots := OrderedCollection new.
> rootA := (linearCoefficient negated + aTerm sqrt) / (2 *
> quadraticCoefficient).
> rootB := (linearCoefficient negated - aTerm sqrt) / (2 *
> quadraticCoefficient).
> roots add: rootA; add: rootB.
> ^ roots
>
>
> QuadraticEquation>>rootsIfNone
> ^ 'No real solution for the equation'
>
>
> " Example: -3x^2+2x+2=0
> an OrderedCollection(-0.5485837703548636 1.2152504370215302)
>
> print(it)
>
> | anEquation |
> anEquation := QuadraticEquation new.
> anEquation setQuadraticCoefficient: -3 linearCoefficient: 2 constant:
> 2.
> anEquation calculateRoots."
>
>
>
>
>
>
> -----
> Nacho
> Smalltalker apprentice.
> Buenos Aires, Argentina.
> --
> View this message in context:
> http://forum.world.st/Question-on-style-tp4752165p4752369.html
> Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
>