Question

Est-ce que Smalltalk (en particulier Squeak / Pharo) ont une certaine forme de fonctions variadique?

Je viens de lire sur le pouvoir de concevoir vos propres statments de contrôle en Smalltalk et pendant que je suis un grand fan de ifTrue: ifFalse: J'avais du mal à venir avec une bonne façon de mettre en œuvre arbitraire si, si d'autre , si d'autre, ..., d'autre penser comment les déclarations des fonctions utiles VARIADIC celles-ci seraient pour la mise en œuvre des déclarations de cas. Quelque chose comme

false classe

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

vArgList pairsDo: [:x :y| x ifTrue:[^ (y value)] ].
^ aLastBlock
Était-ce utile?

La solution

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

Mais de toute façon si vous voulez utiliser la déclaration de cas, vous ne suivez pas les Smalltalk-way-of doing choses. Dites-nous ce que vous voulez atteindre avec votre déclaration de cas afin que nous puissions vous montrer une façon plus propre de le faire.

Autres conseils

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

Vous pouvez avoir des cours d'une méthode prendre une liste, comme BlockClosure>>valueWithArguments: mais c'est presque la même chose.

Vous pourriez modifier Compiler pour soutenir 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

L'une des choses que j'ai appris dans la programmation n'est pas que vous ne les déclarations de cas pas besoin, vous ne veulent pas déclarations de cas.

déclarations de cas sont le moyen de gonfler un objet. Lorsque vous l'utilisez, vous êtes d'entretien dégradant. Vous aurez toutes les possibilités que vous voulez à ce moment-là, mais le jour où vous voulez ajouter quelque chose que vous devrez examiner le code méchant quand vous ne me souviens plus les subtilités de la responsabilité de cet objet, de sorte que vous météorisation il encore plus.

Dans le très court terme, ils regardent des déclarations amicale mais cas ne sont pas vos amis. Ils vous mordre à long terme.

En outre, ils font votre code moins souple. Par exemple, vous ne pouvez pas ajouter un cas en toute confiance sur le code précédent. Vous êtes obligé de revoir l'ancien code lorsque vous ne vous en souvenez plus pourquoi il a été codé comme ça.

déclarations 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 les États pour cela. Alors ce que vous faites est de mettre en œuvre trois classes qui sont très simples et ils comprennent tous un certain verbe.

Dis, #doTheNextThing. Ainsi, lorsque l'objet reçoit le message délègue à l'État (selon la valeur d'une de ces 3 (ou 30, notez donc cette échelle complexité bien)) et l'état sait comment faire le récepteur d'origine de réagir correctement.

Cela laissera votre lumière de code, évident et très maintenable. Vous serez en mesure d'oublier parce que vous savez que lorsque vous regardez à nouveau, tout est si évident que vous n'avez pas besoin de penser dans le passé de votre code, autant que dans l'avenir de votre code.

C'est important parce que votre mémoire est la plus chère mémoire que vous avez et n'est pas autant que je sache upgradable. Ainsi, cette technique vous permet de faire des choses plus puissant.

En plus, faire 3 classes peut sembler plus de travail pour certains, mais ce n'est pas. Tout Noob peut ajouter 3 classes vides en un clin mais seulement le bon expert se souviendra comment une déclaration de cas dans l'ancien code a été la façon dont il a été fait. Et si vous êtes follement optimiste, il faudra minutes de rappeler que si vous savez tous quoi faire. Pensez à ce sujet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top