-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathREADME
More file actions
142 lines (87 loc) · 3.81 KB
/
README
File metadata and controls
142 lines (87 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
README
★What is this? : これはなに?
Java/Scalaから使用できる、アクターモデルをつかったメッセージ・パッシングを行うライブラリです。
http://ja.wikipedia.org/wiki/アクターモデル
滅び行くScalaのActors(~2.9.2)をベースにしています。
ブランチakkanized にAkka版を用意中です。
このライブラリは試作です。メンテとかはあまり期待しないでください。
★Motivation : モチベーション
メッセージ・パッシングをJava/Scalaでもやりたかった、
ポインタ所持以外での伝達法を使って処理を纏めたかった、
意味論的な名付けを行いたかった。
★How to use : どうやって使うの
サンプルを用意しました。
sample/sampleJava/~
sample/sampleScala/~
を参考にしてください。
両方とも同じ構造をしており、
Mainを起動すると、下記のポインタ所持関係を作ります。
<Object-owning>
Main -> Parent parent, named "parent"
|-> Child child1, named "child"
|
|-> Child child2, named "child"
|
|-> Cousin cousin, named "cousin"
対して、メッセージパッシングのルートは下記の関係を作ります。
<Message-passing>
parent
|<--> child1
| |<-->cousin
|
|<--> child2
直接接続している間柄のみ、メッセージパッシングでのオブジェクト送付が可能です。
○ parent <-> child1,child2
× parent <-> cousin
○ child1 <-> cousin
★How to build : ビルドし方 (ONLY SCALA)
In Terminal,
:gradlew jar
->
build/libs/ScalaMessengerPrototype.jar
you can run it.
★Why ruled : なんで制限あるの
自由にオブジェクト間でメッセージが送れると混乱するので、コードで記述可能な制限を設けています。
messenger = new Messenger(this, "child")
messenger.inputParent("parent")
とした場合、”parent"と名付けられたMessengerを持つオブジェクトが「親」になります。
親に該当するMessengerがJVM内にいるかどうか、childが探しにいき、
親が見つかればその時点で親子関係を結びます。
複数の親候補が見つかった場合、生成順で優先度が決まり、必ずただ一人の親を持ちます。
親は、同一の名前の子を複数持つことが出来ます。
子は、一人だけ親を持つことが出来ます。
親は、複数の同名の子に向けてブロードキャストを行うことが出来ます。
messenger.call("child", "execution", null)
子は、親に対してメッセージを投げることが出来ます。
messenger.callParent("execution", null)
自分自身にメッセージを投げることが出来ます。
messenger.callMyself("execution", null)
メッセージは相手のreceiverメソッドに到達します。
def receiver(exec:String, tagValues:Array[TagValue]) = {
//reach here
}
メッセージには、タイトル文字列:exec と、
オブジェクトのHashMapである tag & value の配列:tagValues を渡すことが出来ます。
messenger.callMyself("execution", messenger.tagValues(new TagValue("tag","value")))
可変長です。
messenger.callMyself("execution",
messenger.tagValues( new TagValue("tag1","value1"),
new TagValue("tag2","value2")
)
)
受け取り側で、値を受け取ることが出来ます。
参照渡しも可能(Javaの場合キャストが必要)
<send: from class "Something">
messenger.callMyself("execution",
messenger.tagValues(new TagValue("tag", this )
)
)
<receive:in class "Else">
receiver {
(case Java)
Something something = (Something)messenger.get("tag", tagValues);
(case Scala)
val something = messenger.get("tag", tagValues)
}
★ライセンス:License
ライセンスはMIT Licenseです。