On 2 avr. 2014, at 18:45, nacho <0800nacho@gmail.com> 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.