5

Does Smalltalk (specialmente Squeak/Pharo) ha qualche forma di funzioni variadiche?Smalltalk Variadic functions

Stavo solo leggendo sul potere di progettare le proprie statistiche di controllo in smalltalk e mentre sono un grande fan di ifTrue: ifFalse: stavo avendo difficoltà a trovare un buon modo per implementare arbitrario se, se altrimenti, se no, ..., altre affermazioni che pensano a quanto utile funzioni di Variadic per implementare le dichiarazioni dei casi. Qualcosa di simile

falsa classe

ifTrue: aBlock (... elseIf: aBoolean then: aSecondBlock ...) else: aLastBlock 

vArgList pairsDo: [:x :y| x ifTrue:[^ (y value)] ]. 
^ aLastBlock 

risposta

1

È possibile utilizzare il messaggio #caseOf:otherwise:. Cerca qualche mittente di questo messaggio per qualche esempio.

Tuttavia, se si desidera utilizzare la distinzione tra maiuscole e minuscole, non si sta seguendo la piccola maniera di fare le cose. Dicci cosa vuoi ottenere con la tua dichiarazione del caso in modo che possiamo mostrarti un modo più semplice per farlo.

+0

Come principio generale, sono d'accordo. È difficile per me vedere come si possa migliorare, in termini di leggibilità, l'uso di #caseOf di Andreas Raab: altrimenti: in DnsClient (su SqueakSource). –

3

di Smalltalk sintassi per parole chiave come ad metodo chiama intrinsecamente definisce l'arietà del metodo. Non esiste uno schema &rest come in Common Lisp.

Ovviamente è possibile che un metodo esegua un elenco, ad esempio BlockClosure>>valueWithArguments: ma non è quasi la stessa cosa.

È possibile modificare Compiler per supportare le chiamate al metodo variadic. Forse la chiamata sarebbe semplicemente avere with: tra ciascuna delle variabili:

(condizione) ifTrue: ablock elseif: aBoolean con: aSecondBlock con: anotherBoolean con: aThirdBlock

+0

Non è possibile modificare solo il compilatore per quello. È inoltre necessario modificare la VM. Poiché il numero di argomenti è all'interno di BlockClosure che indica la dimensione (che include il numero di argomenti) del contesto da creare. – mathk

1

Una delle cose che ho imparato nella programmazione non è che non hai bisogno di istruzioni case, si non si vuole istruzioni case.

Le affermazioni di casi sono il modo per gonfiare un oggetto. Quando lo usi, stai degradando la manutenzione. Avrai tutte le possibilità che vuoi in quel momento, ma il giorno in cui vuoi aggiungere qualcosa dovrai rivedere codice sgradevole quando non ricordi più le sottigliezze nella responsabilità di quell'oggetto, quindi lo gonfierai ancora di più.

A brevissimo termine, sembrano amichevoli, ma le dichiarazioni del caso non sono i tuoi amici. Ti morderanno a lungo termine.

Inoltre rendono il codice meno flessibile. Ad esempio, non è possibile aggiungere un caso con sicurezza al codice precedente. Sei costretto a rivedere il vecchio codice quando non lo ricordi più perché è stato codificato in quel modo.

Le affermazioni di casi sono nemici di un buon codice.

Se si dispone di qualcosa che va oltre ifTrue: ifFalse: quindi la cosa giusta da fare è creare stati per quello. Quindi quello che fai è implementare tre classi che sono molto semplici e tutti comprendono alcuni verbi.

Dire, #doTheNextThing. Quindi, quando l'oggetto riceve il messaggio, delega allo stato (a prescindere da quale di questi 3 (o 30, così si noti che questo ridimensiona la complessità in modo piacevole)) e lo stato sa come far reagire correttamente il ricevitore originale.

Ciò lascerà il codice chiaro, ovvio e altamente mantenibile.Sarai in grado di dimenticarlo perché sai che quando lo guardi di nuovo, tutto è così ovvio che non devi pensare nel passato del tuo codice tanto quanto nel futuro del tuo codice.

Questo è importante perché la memoria è la memoria più costosa che hai e AFAIK non è aggiornabile. Quindi questa tecnica ti permette di fare cose più potenti.

Accanto, fare 3 classi può sembrare più lavoro per alcuni ma non lo è. Ogni noob può aggiungere 3 classi vuote in un battito di ciglia, ma solo l'esperto giusto ricorderà come è stata fatta un'istruzione case nel vecchio codice nel modo in cui è stata creata. E se sei estremamente ottimista, ci vorranno alcuni minuti per ricordarlo, quindi tutti voi sapete cosa fare dopo. Pensaci.