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