(Mis) Comprensione Smalltalk e TDD
Domanda
Sto cercando di imparare Smalltalk facendo, quindi mi sto una presa sulla sintassi e lo stile da buiding una semplice classe "Matrix".
Prima di tutto, sarei grato se collegato a un buon tutorial Smalltalk (anche se questo è del tutto facoltativa), preferibilmente uno che non comporta utilizzando la GUI (preferirei digito i miei .st
s di pesce intorno l'esploratore gerarchia per mettere i metodi al loro posto).
Poi, il TDD: Per questo progetto che sto chiamando gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests
, e non v'è destinato ad essere un modo migliore di quello. C'è?
E, infine, il asserisce: Sto cercando di scrivere un metodo e mettere afferma all'interno, ad esempio:.
Matrix>>multiplyBy: anotherMatrix [
[ self isNotEmpty ] assert.
"Do Multiplication"
[ result dimensions = (self height)@(anotherMatrix width) ] assert.
]
Come faccio a fare questo tipo di afferma?
Modifica: Domande contrassegnati esplicitamente
.Soluzione
D'accordo, diversi pezzi qui.
In primo luogo, sono d'accordo con MarkusQ, anche se ho completamente simpatizzo: Preferisco essere in grado di scrivere il mio codice in Emacs direttamente. Bt una delle cose su Smalltalk è che è davvero molto spietato di persone che non vogliono fare le cose nel modo Smalltalk. In questo caso, la Via Smalltalk è quello di utilizzare i browser.
In secondo luogo, parte della ragione che questo è il modo Smalltalk Smalltalk è che è, in molti modi, non come altre lingue. C'è davvero, a tutti gli effetti, non c'è modo di fare un eseguibile Smalltalk "separato": tutto quello che puoi fare è rendere l'immagine di Smalltalk con alcuni relativamente piccoli frammenti del proprio codice aggiunto Quando si scrive codice usando un editor esterno. , come con la sintassi si mostra, si è letteralmente appena mano digitando un formato di importazione / esportazione che è un po 'più facile da mano tipo di XML. Ma solo un po '.
La morale è, farlo nel modo Smalltalk, con i browser.
Ci sono alcuni piuttosto buoni tutorial per Smalltalk circa. Io di solito uso Squeak, in modo da quelli che ho visto sta utilizzando Squeak, come qui .
In TDD, siete fortunati perché Smalltalk è stato il primo posto per ottenere xUnit. Per Smalltalk, si chiama Sunit, e c'è un buon tutorial qui .
Si sta utilizzando affermazioni c'è in quello che sembra essere fondamentalmente un approccio di "progettazione per contratto". C'è stato lavoro fatto sulla aggiungendo progettazione per contratto a Smalltalk, come qui . Per semplici asserzioni, è possibile aggiungere codice come in questa domanda SO .
assert: aBlock
"Throw an assertion error if aBlock does not evaluates to true."
aBlock value
ifFalse: [AssertionFailure signal: 'Assertion failed']
Altri suggerimenti
Odio dirlo (perche 'chiaramente indicato che non vuoi sentire), ma prende l'IDE. Cercando di ottenere la testa intorno Smalltalk senza usare l'IDE è come andare a Parigi e mangiare al McDonalds. Certo, siete a Parigi, ma non si è realmente esporsi a ciò che è tutta una questione.
La cosa fondamentale di Smalltalk è che E 'tutti gli oggetti . Per tutto il tragitto verso il basso (interi e personaggi sono gli oggetti) e tutta la strada fino (classi, metodi, i browser, l'IDE stesso) sono tutti gli oggetti . Se ti ostini a combatterla avrai circa tanto fortuna come qualcuno che vuole imparare a scrivere C trascinando e rilasciando le cose.
Se avete scaricato Cincom Smalltalk non-commerciale, ci sono una serie di tutorial online. Inizia da qui:
http://www.cincomsmalltalk.com/userblogs/cincom/blogView ? content = tutorial
Se avete scaricato Squeak, cominciare da qui:
http://wiki.squeak.org/squeak/792
E sì, è davvero necessario utilizzare l'IDE di lavorare efficacemente con Smalltalk.
Il test, caricare Sunit. In Cincom Smalltalk, è un componente caricabile; Ho coperto di carico (e l'uso) nelle video tutorial collegate sopra. Io non sono del tutto sicuro di come caricare per Squeak, o se è parte della base lì, ma è certamente disponibili per esso.
Oltre a una richiesta di un tutorial, non vedo una domanda qui. Potrebbe chiarire che cosa è che vuoi sapere?
Un buon elenco di risorse per un principiante può essere trovato in questa domanda: https://stackoverflow.com/questions/481976/is-there-a-dive-into-smalltalk-book
Quindi, afferma riguardo, Squeak Smalltalk porta già oggetto >> assert: Quindi, suppongo che si può fare:
self assert: self isNotEmpty.
self assert: result dimensions equal: (self height)@(anotherMatrix width)
Se si utilizza GNU Smalltalk, questo potrebbe rispondere come fare affermazioni c'è: Smalltalk e asserzioni
Niko
Per quanto riguarda afferma, si prega di guardare l'altra questione da poco pubblicato.
Per quanto riguarda TDD, sì, chiamando gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests
è una sorta di migliore dei modi. Tutto il resto si basa solo su quello, ad esempio, questi potrebbero essere Thee alternative:
- fanno tutte le sottoclassi TestCase per il pacchetto ereditano da una sottoclasse falso in modo che si può dire
AllMatrixTests*
sulla linea di comando di GST-sunit (quando si aggiungono altri esami). - file in matrix.st da matrix-test.st, eliminando così un'opzione -f.
- creare un file Makefile e package.xml per creare un file .star per il pacchetto, come descritto qui . Poi si può fare proprio
gst-sunit -pMatrix
.
E 'stato suggerito in precedenza per aggiungere #assert:
a Object
, ma mi piacerebbe aggiungere #assert
a BlockClosure
(o qualsiasi altra cosa [] class
è in GNU Smalltalk).
assert
this value ifFalse: [AssertionFailure signal: 'Assertion failed']
e quindi utilizzare come in
[ value notNil ] assert.
[ value > 0 ] assert.
[ list isEmpty not ] assert.
eccetera.
http://stores.lulu.com/store.php?fAcctID=2748699 (Inoltre troverete il link per scaricare il pdf)
preferirei digito i miei .sts di pesci intorno l'esploratore gerarchia per mettere i metodi al loro posto).
Lo dici adesso e mi sono sentito allo stesso modo fino a quando ho investito qualche tempo in imparare a usare questi strumenti.
E dico questo come un utente corrente di Vim ed ex utenti di Emacs. Ho davvero diventato abbastanza produttiva utilizzando il browser di classe e altri strumenti in Pharo ora che ho imparato le corde.
Detto questo, se si vuole veramente a seguire la propria strada, GNU Smalltalk è la scelta giusta per voi.
Vorrei far notare a questo punto però che almeno Pharo ha una classe Matrix, che è possibile utilizzare per l'ispirazione. Squeak dovrebbe, anche. Forse si impara quanto sia utile il browser di classe sta esaminando Matrix. ;)
Smalltalk Primer è un'introduzione al Elementi essenziali di programmazione orientati ai messaggi con Smalltalk