著作一覧 |
アクター → ユースケース
って場合、→に乗っかるメッセージの容量は小さいというのが前提?
クライアント コントローラ モデル
object → object → object → データ
の→についてもメッセージの容量は小さいのが前提。
これが、
システム → システム
データ ← サービス サービス → データ
となると考えると、このメッセージ呼び出し側システムのコンテキストを運ぶ必要が場合によっては出てくるだろうから、とてつもなくでかくなるのではないか?
仮にそうだとしたら、その呼び出しのメソッドシグネチャーは
void foo(String a0, String a1 ...);
ではおそらくだめで、
void foo(String[] a0, String[] a1, ...);
でもおそらくだめで、
void foo(String theDocument);
とか。
これをXML Webサービスでやると、XML over XML。
それは無意味なので、Document形式でのメッセージ交換。
するとアンマーシャリングは、一段上のレイヤー。
DTOの話題が目に付くので、以前からの疑問を。
シナリオ:リモートからデータ群を読み込む
当然のごとく、この場合はDTOを使う。しかし、COMの時はMBV(マーシャルバイバリュー)って書いてたが、すっかりJavaな人になってるな。
このとき、このDTOは次のように書かなければならない(と思う。エラーになるし)
public class DTO implements Serializable {
public void DTO() {
}
public int getInt() {
return intVal;
}
public void setInt(int i) {
intVal = i;
}
private int intVal;
}
何がいやかって、どう考えたって、こいつはイミュータブルなんだからsetInt
はいらんだろう。
確かに、Class#getMethodsにしてもClass#getFieldsにしても、public縛りがあるから、これがイヤなら、
public int intVal;
とするしか方法がないというのはわかる。
どっちにしても、原理的に不変性は失われる。
っていうか、hashCodeの実装に、安心してiValの値を利用するってのは難しい。紳士協定しかないからだ。
#ここではRMIの動作を前提としているから、コンストラクタの引数というのは無し。
いっぽう、.NET FrameworkのType#GetMethods(BindingFlags)はどうかといえば、BindingFlags.NonPublicを指定することで、ぞろぞろ抜き出せる。したがって、イミュータブルオブジェクトであっても一般的な機構だけ利用してマーシャル/アンマーシャル可能。逆に言えば、一見イミュータブルであってもリフレクションを利用すると裏から変更できる。
さて、クラスのインターフェイスに紳士協定を求めるのと、タイプシステムがアクセス権を無視して介入できるのと、どっちが好き?
難しい。
#僕は後者なんだけど、こういういろいろな危うさがあるのが、いいところ。
#でもこれって、アプリケーションプログラマを舐めてるとも言えるんじゃないかな?
using System; using System.Reflection; public class A { class B { private int a; internal B(int c) { a = c; } public int getA() { return a; } } public static void Main() { B b = new B(100); Type t = typeof(B); FieldInfo f = t.GetField("a", BindingFlags.NonPublic | BindingFlags.Instance); f.SetValue(b, 500); System.Console.WriteLine(b.getA()); } }実行結果
C:\Home\arton\test>csc test.cs Microsoft(R) Visual C# .NET Compiler version 7.10.3052.4 for Microsoft(R) .NET Framework version 1.1.4322 Copyright (C) Microsoft Corporation 2001-2002. All rights reserved. C:\Home\arton\test>test 500注:JavaとC#ではインナークラスのアクセス修飾子の意味が異なるので、Mainから、直接、b.aとした参照はできない。privateフィールドにさわるにはリフレクションが必要。
ジェズイットを見習え |