5

Est-ce que Smalltalk (en particulier Squeak/Pharo) a une certaine forme de fonctions variadiques? Je lisais juste sur le pouvoir de concevoir vos propres déclarations de contrôle dans smalltalk et pendant que je suis un grand fan de ifTrue: ifFalse: J'avais du mal à trouver un bon moyen de mettre en œuvre arbitrairement si, si else, if else, ..., else déclarations pensant à quel point les fonctions Variadic seraient pour la mise en œuvre des déclarations de cas. Quelque chose commeSmalltalk Fonctions variadiques

fausse classe

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

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

Répondre

1

Vous pouvez utiliser le message #caseOf:otherwise:. Recherchez un expéditeur de ce message pour un exemple.

Mais de toute façon, si vous voulez utiliser l'instruction case, vous ne suivez pas la méthode smalltalk-way-of-doing. Dites-nous ce que vous voulez accomplir avec votre déclaration de cas afin que nous puissions vous montrer une façon plus simple de le faire.

+0

En principe, je suis d'accord. Il m'est difficile de voir comment on pourrait s'améliorer, en termes de lisibilité, sur l'utilisation de #caseOf par Andreas Raab: sinon: dans DnsClient (sur SqueakSource). –

3

de syntaxe comme mot-clé de Smalltalk pour les appels de méthode définit intrinsèquement l'arité de la méthode. Il n'y a pas de motif &rest comme dans Common Lisp.

Vous pouvez bien sûr avoir une méthode prendre une liste, comme BlockClosure>>valueWithArguments: mais c'est à peu près la même chose.

Vous pouvez modifier Compiler pour prendre en charge les appels de méthode variadique. Peut-être que l'appel aurait simplement with: entre chacune des variables:

(condition) ifTrue: unBloc ELSEIF: aBoolean avec: aSecondBlock avec: anotherBoolean avec: aThirdBlock

+0

Vous ne pouvez pas modifier uniquement le compilateur pour cela. Vous devez également modifier la machine virtuelle. Parce que le nombre d'arguments est à l'intérieur du BlockClosure qui indique la taille (qui inclut le nombre d'args) du contexte à créer. – mathk

1

Une des choses que j'ai apprises en programmation n'est pas que vous n'avez pas besoin d'instructions de cas, vous ne voulez pas d'instructions de cas.

Les instructions de cas sont le moyen de gonfler un objet. Quand vous l'utilisez, vous dégradez la maintenance. Vous aurez toutes les possibilités que vous voulez à ce moment-là, mais le jour où vous voulez ajouter quelque chose, vous devrez passer en revue un code méchant quand vous ne vous souvenez plus des subtilités de la responsabilité de cet objet, donc vous le flouerez encore plus. À très court terme, ils ont l'air amical, mais les déclarations de cas ne sont pas vos amis. Ils vont vous mordre à long terme.

De plus, ils rendent votre code moins flexible. Par exemple, vous ne pouvez pas ajouter un cas avec confiance au code précédent. Vous êtes obligé de revoir l'ancien code quand vous ne vous en souvenez plus pourquoi il a été codé comme ça.

Les instructions de cas sont des ennemis du bon code.

Si vous avez quelque chose qui va au-delà ifTrue: ifFalse: alors la bonne chose à faire est de faire des états pour cela. Donc, ce que vous faites est de mettre en œuvre trois classes qui sont très simples et ils comprennent tous un verbe.

Dites, #doTheNextThing. Ainsi, lorsque l'objet reçoit le message, il délègue à l'état (quel que soit l'un de ces 3 (ou 30, donc notez bien la complexité de ces échelles)) et l'état sait comment faire réagir correctement le récepteur original. Cela laissera votre code léger, évident et hautement maintenable.Vous serez en mesure d'oublier cela parce que vous savez que lorsque vous le regardez à nouveau, tout est si évident que vous n'avez pas besoin de penser au passé de votre code autant qu'à l'avenir de votre code. C'est important parce que votre mémoire est la mémoire la plus chère que vous ayez et AFAIK n'est pas évolutive. Donc, cette technique vous permet de faire des choses plus puissantes. En outre, faire 3 classes peut sembler plus de travail pour certains mais ne l'est pas. Tout noob peut ajouter 3 classes vides en un clin d'œil mais seul le bon expert se rappellera comment une déclaration de cas dans l'ancien code a été faite comme elle a été faite. Et si vous êtes extrêmement optimiste, il faudra quelques minutes pour le rappeler afin que vous sachiez quoi faire ensuite. Pensez-y.

Questions connexes