5

Smalltalk(特にSqueak / Pharo)には、何らかの形の可変個引数機能がありますか?

私はsmalltalkで独自の制御ステートメントを設計する力について読んでいて、ifTrueの大ファンです:ifFalse:任意のif、if、else、ifを実装するための良い方法を思い付くのに苦労していました、...、elseステートメントは、ケースステートメントを実装するために可変個引数関数がどれほど役立つかを考えています。何かのようなもの

偽のクラス

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

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

3 に答える 3

3

メソッド呼び出しのためのSmalltalkのキーワードのような構文は、本質的にメソッドのアリティを定義します。&restCommonLispのようなパターンはありません。

もちろん、メソッドにリストを取得させることもできますが、BlockClosure>>valueWithArguments:それはほとんど同じではありません。

Compiler可変個引数メソッド呼び出しをサポートするように変更できます。たぶん、呼び出しは単にwith:各変数の間にあるでしょう:

(条件)ifTrue:aBlock elseIf:aBoolean with:aSecondBlock with:anotherBoolean with:aThirdBlock

于 2010-10-06T19:02:35.870 に答える
1

メッセージをご利用いただけ#caseOf:otherwise:ます。いくつかの例については、このメッセージの送信者を探してください。

しかし、とにかく、caseステートメントを使用したい場合は、smalltalk-way-of-doing-thingsに従っていません。ケースステートメントで何を達成したいのかを教えてください。そうすれば、よりクリーンな方法を紹介できます。

于 2010-10-11T21:26:39.300 に答える
1

プログラミングで私が学んだことの1つは、caseステートメントは必要ないということではなく、caseステートメントは必要ないということです

ケースステートメントは、オブジェクトを肥大化させる方法です。それを使用すると、メンテナンスが低下します。その時点で必要なすべての可能性がありますが、何かを追加したい日は、そのオブジェクトの責任の微妙さをもう覚えていないときに厄介なコードを確認する必要があるので、それを膨らませますさらに。

非常に短期的には、彼らは友好的に見えますが、ケースステートメントはあなたの友達ではありません。彼らは長期的にあなたを噛むでしょう。

また、コードの柔軟性が低下します。たとえば、前のコードについて自信を持ってケースを追加することはできません。なぜそのようにコーディングされたのかを思い出せなくなった場合、古いコードを確認する必要があります。

ケースステートメントは、優れたコードの敵です。

ifTrue:ifFalse:を超える何かがある場合、正しいことはそのための状態を作成することです。つまり、非常に単純で、すべて動詞を理解する3つのクラスを実装する必要があります。

言ってやるが、#doTheNextThing。したがって、オブジェクトはメッセージを受信すると、状態(3つ(または30)のいずれかであるため、複雑さを適切にスケーリングすることに注意してください)に委任し、状態は元の受信者を正しく反応させる方法を知っています。

これにより、コードが軽く、明白で、保守性が高くなります。それをもう一度見ると、すべてが非常に明白であるため、コードの将来ほど過去のコードについて考える必要がないことを知っているので、それを忘れることができます。

あなたのメモリはあなたが持っている最も高価なメモリであり、AFAIKはアップグレードできないので、それは重要です。したがって、この手法を使用すると、より強力な処理を実行できます。

その上、3つのクラスを作成することは、一部の人にとってはより多くの作業のように聞こえるかもしれませんが、そうではありません。どの初心者も一瞬で3つの空のクラスを追加できますが、古いコードのcaseステートメントがどのように作成されたかを覚えているのは適切な専門家だけです。そして、あなたが非常に楽観的であるならば、それを思い出すのに数分かかるでしょう、それであなたは皆次に何をすべきかを知っています。それについて考えてください。

于 2010-10-24T12:02:02.583 に答える