2009-03-22 12 views
7

Estoy tratando de aprender Smalltalk haciendo, por lo que estoy teniendo un control sobre la sintaxis y el estilo construyendo una simple clase "Matrix".(Mis) Comprensión de Smalltalk y TDD

En primer lugar, agradecería que estuviera vinculado a un buen tutorial de Smalltak (aunque esto es totalmente opcional), preferentemente uno que no implique el uso de GUI (prefiero escribir mis .st que pescar el explorador de jerarquía para poner los métodos en su lugar).

Luego, en TDD: para este proyecto estoy llamando al gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests, y seguramente habrá una mejor manera de hacerlo. ¿Hay alguna?

Y, por último, el afirma: Estoy intentando escribir un método y poner dentro afirma, por ejemplo .:

Matrix>>multiplyBy: anotherMatrix [ 
    [ self isNotEmpty ] assert. 
    "Do Multiplication" 
    [ result dimensions = (self height)@(anotherMatrix width) ] assert. 
] 

¿Cómo puedo hacer ese tipo de afirma?

Editar: Preguntas marcadas explícitamente.

+0

¿Cuál es la pregunta? – Seb

Respuesta

11

Bien, varias piezas aquí.

En primer lugar, estoy de acuerdo con markusQ, aunque simpatizo completamente: Prefiero ser capaz de escribir mi código en EMACS directamente. Bt una de las cosas sobre Smalltalk es que realmente es muy implacable con las personas que no quieren hacer las cosas de la manera Smalltalk. En este caso, Smalltalk Way es usar los navegadores.

En segundo lugar, parte de la razón por la que Smalltalk Way es que Smalltalk es, de muchas maneras, no como como otros idiomas. Realmente, para todos los propósitos prácticos, no hay forma de hacer un ejecutable Smalltalk "separado": todo lo que puedes hacer es crear una imagen de Smalltalk con algunos fragmentos relativamente pequeños de tu propio código agregado. Cuando escribes código usando un editor externo , al igual que con la sintaxis que muestra, literalmente está escribiendo a mano un formato de importación/exportación que es algo más fácil de manejar que XML. Pero solo un poco

La moraleja es, hazlo de la manera Smalltalk, con los navegadores.

Hay algunos tutoriales bastante buenos para Smalltalk. Usualmente uso Squeak, por lo que los que he visto están usando Squeak, como here.

En TDD, estás de enhorabuena porque Smalltalk fue el primer lugar en obtener XUnit. Para Smalltalk, se llama SUnit, y hay un buen tutorial here.

Está utilizando aserciones allí en lo que parece ser básicamente un enfoque de "diseño por contrato". Se ha trabajado para agregar diseño por contrato a Smalltalk, como here. Para aserciones simples, puede agregar código como en this SO question.

assert: aBlock 
    "Throw an assertion error if aBlock does not evaluates to true." 
    aBlock value 
     ifFalse: [AssertionFailure signal: 'Assertion failed'] 
9

me gusta decirlo (porque usted se indica claramente que no quiere oírlo), pero entra en el IDE . Tratar de entender Smalltalk sin usar el IDE es como ir a París y comer en McDonalds. Seguro, estás en París, pero no estás realmente exponiéndote a lo que se trata.

La clave de smalltalk es que es todos los objetos. Hasta el final (los enteros y los caracteres son objetos) y todo el camino ascendente (clases, métodos, navegadores, IDE en sí) son todos los objetos. Si insistes en luchar contra él, tendrás tanta suerte como alguien que quiera aprender a escribir C arrastrando y soltando cosas.

+1

+1 para la cosa de París/McDonalds! :-) –

6

Si ha descargado Cincom Smalltalk Non-Commercial, hay una serie de tutoriales en línea. Haga clic aquí:

http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=tutorials

Si ha descargado Squeak, comience aquí:

http://wiki.squeak.org/squeak/792

Y sí, realmente es necesario utilizar el IDE para trabajar eficazmente con Smalltalk.

En las pruebas, cargue SUnit. En Cincom Smalltalk, es un componente cargable; Cubrí la carga (y el uso) en los videos tutoriales relacionados anteriormente. No estoy del todo seguro de cómo cargarlo para Squeak, o si es parte de la base allí, pero ciertamente está disponible para ello.

1

Así, afirma acerca, Squeak Smalltalk ya trae Objeto >> afirman: Por lo tanto, supongo que puede hacer:

self assert: self isNotEmpty. 
self assert: result dimensions equal: (self height)@(anotherMatrix width) 

Si está utilizando Smalltalk de GNU, esto podría responder cómo hacer afirmaciones allí: Smalltalk and Assertions

Niko

0

Smalltalk Primer es una introducción a Los Fundamentos de la programación orientado a mensajes con Smalltalk

1

En cuanto a las afirmaciones, consulte la otra pregunta recientemente publicada.

En cuanto a TDD, sí, llamar al gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests es la mejor manera. Todo lo demás se basa en que, por ejemplo, estos podrían ser de ti alternativas:

  • haz todas las subclases TestCase para su paquete de heredar de una subclase falsa de manera que se puede decir AllMatrixTests* en la línea de comandos de gst-Sunit (cuando se agrega más pruebas).
  • archivo en matrix.st desde matrix-test.st, eliminando así una opción -f.
  • crea un archivo Makefile y package.xml para crear un archivo .star para tu paquete, como se describe en here. Entonces puedes hacer solo gst-sunit -pMatrix.
1

Se ha sugerido arriba para añadir #assert: a Object, sino que me gustaría añadir a #assertBlockClosure (o lo que sea [] class está en GNU Smalltalk).

assert 
    this value ifFalse: [AssertionFailure signal: 'Assertion failed'] 

y por lo tanto su uso como en

[ value notNil ] assert. 
[ value > 0 ] assert. 
[ list isEmpty not ] assert. 

etcétera.

0

Prefiero escribo mis .STS de peces en todo el explorador de jerarquía para poner los métodos en su lugar).

Usted dice esto ahora y me sentí de la misma manera hasta que invertí algo de tiempo en aprender a usar estas herramientas.

Y lo digo como usuario actual de Vim y ex usuario de Emacs. Realmente me he vuelto bastante productivo usando el buscador de clases y otras herramientas en Pharo ahora que aprendí las cuerdas.

Dicho esto, si realmente quiere seguir su propio camino, GNU Smalltalk es la elección correcta para usted.

Me gustaría señalar en este punto que al menos Pharo tiene una clase Matrix que puede usar como inspiración. Squeak debería, también. Tal vez aprendas lo útil que el buscador de clases está examinando Matrix. ;)