SmallTalk에서 메시지 전달
-
22-08-2019 - |
문제
그래서 나는 하나의 객체에 메시지를 전달하는 대의원 객체가 많은 응용 프로그램을 작성하고 있습니다. 아이디어는 내가 말할 수 있다는 것입니다
someObject sendMessage:aMessage
그리고 Amessage는 일부 Object의 대의원들에게 전송됩니다 (Amessage의 가치에 대해). 내가 이것을 할 수 있었던 유일한 방법은 다음과 같습니다.
sendMessage:aMessage
| sel chunks kwords arglist msg |
chunks := aMessage findTokens:' '.
kwords := Array new:(chunks size).
arglist := Array new:(chunks size).
1 to: (chunks size) do: [:i |
kwords at:i put:((chunks at:i) findTokens:':') at:1.
arglist at:i put:((chunks at:i) findTokens:':') at:2].
sel := ''.
kwords do:[:word | sel := sel,word,':'].
msg := Message selector:sel arguments:arglist.
delegates do:[:del | del perform:msg selector with:msg arguments].
작동하지만 더 나은 방법이 있어야합니다. 이 솔루션은 논증을 현으로 제한하며, 단순히 추악합니다. 누구든지 더 깨끗하고 더 나은 메시지를 전달하는 방법을 알고 있습니까?
BTW, 나는 squeak를 사용하고 있지만 구현 독립적 솔루션이 선호 될 것입니다.)
편집하다: 대의원이 객체와 동일한 클래스에 있다고 덧붙여 야한다.
해결책
As Arguments의 객체를 전달하려면 다음과 같은 메시지 패턴을 사용하는 별도의 목록으로 객체를 전달해야합니다.
sendmessage : aselector witharguments : argumentlist
그런 다음 #sendmessage : witharguments : as :
SendMessage : Aselector witharguments : Argumentlist
대의원 : [: 델 | 델 퍼포먼스 : Aselector witharguments : : ArgumentList].
그리고 실제 객체를 Args로 사용하여 임의로 복잡한 메시지를 전달할 수 있습니다.
| 인수 |
인수 : = 배열이있는 : : 1234.5 with : ( 'key'-> 'value').
sendebject sendmessage : #foo : bar : baz : witharguments : arguments
나는 이것이 대부분의 방언에도 휴대 할 수 있다고 생각합니다 ...
다른 팁
이것을 구현해보십시오 (객체가 이해하지 못하는 메시지 만 전달합니다. 가지다 대의원) :
doesNotUnderstand: aMessage
delegates
do: [:delegate | aMessage sendTo: delegate]
메시지 개체가 명시 적으로 좋아하는 것을 구성 할 수 있습니다.
msg := Message selector: #foo arguments: #(bar baz)
"then use them like:"
anObject perform: msg selector with: msg arguments
Squeak에서는 클래스 객체 트레이서를 참조하십시오. 이를 사용하여 모든 메시지를 객체에 인터셉트 할 수 있습니다.
글쎄, Amessage가 무엇인지 알지 못하고, 모든 대표 객체가 같은 클래스라고 언급 했으므로 다음과 같은 일을 할 것입니다.
MyobjectClass>>SendMessage: aMessage
self doSomethingUsefulOnThisInstanceIfApplicable: aMessage.
self dependents do: [:ea | ea SendMessage: aMessage ] .
다음 메시지를 사용하는 것이 당신에게 효과가 있는지 확인하고 싶을 수도 있습니다.
update:
update:with:
update:with:from:
왜 단순히 다형성을 사용하지 말고, 즉, 당신이 호출하는 각 객체의 클래스 에서이 방법을 구현하지 않습니까? 그런 다음 동일한 이름으로 객체 메소드를 구현하여 모든 하위 객체에 대한 호출을 위임합니다. 같은 것 :
MyObjectClass>>someMethod
subobjects do: [:each | each someMethod]