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.