public A(int i, double d){
this.i = i;
this.d = d;
}
//...
public void inc(){
++i
} } //... A a = new A(1, 2); //... a.inc();
ストロングなスタティック指向スタイル:
public class StaticA{
private static final int MAX_OBJECTS = 65536;
private static int[] I = new int[MAX_OBJECTS];
private static int[] D = new double[MAX_OBJECTS];
private static allocates = 0;
public static newObjectId(int i, double d){
int newId = allocates++;
I[newId} = i;
D[newId] = d;
return newId;
} //...
public static inc(int objectId){
++I[objectID];
} } //... int a = StaticA::newObjectId(1, 2); //... StaticA::inc(a);
MLのモジュールが真のスタティック(このコードはOCaml) module A = struct
type t = int * float
let make i d = i, d
let inc (i, d) = i + 1, d end;; let a = A.make 1 2 in A.inc a
私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson
staticにして、データ構造はどうしてんのよ。 (スコア:1)
全部パブリックにして直接代入するとか、staticにして関数を使うとかは勝手にすれば、と思うけど、
Cでいうところの構造体の操作にあたることは、どうしてるんだろう。
Foo foo(hoge);
Foo::func(&foo);
とかわざわざやってるとしたら、無駄な苦労してるだけとしか。
# ちなみにPythonだとメンバーは全部パブリックで、foo.func(arg)はFoo.func(foo, arg)と同等だったかと。
1を聞いて0を知れ!
真のスタティック指向プログラミング (スコア:1)
いやいや、その想定はまだまだ甘いな。
真のスタティック指向プログラミングではこうなるッ!!
オブジェクト指向スタイル:
class A{
private int i;
private double d;
public A(int i, double d){
this.i = i;
this.d = d;
}
//...
public void inc(){
++i
}
}
//...
A a = new A(1, 2);
//...
a.inc();
ストロングなスタティック指向スタイル:
public class StaticA{
private static final int MAX_OBJECTS = 65536;
private static int[] I = new int[MAX_OBJECTS];
private static int[] D = new double[MAX_OBJECTS];
private static allocates = 0;
public static newObjectId(int i, double d){
int newId = allocates++;
I[newId} = i;
D[newId] = d;
return newId;
}
//...
public static inc(int objectId){
++I[objectID];
}
}
//...
int a = StaticA::newObjectId(1, 2);
//...
StaticA::inc(a);
ってまぁ元ネタは「オブジェクト指向方法論OMT - モデル化と設計」 [amazon.co.jp](1991年)の16章で、
FORTRAN77のようなオブジェクト指向でない上に普通の構造体すらないクラシックな言語でムリヤリに
オブジェクト指向プログラミングをする技法として載っていたものですが。
(ちなみに原典では長さの違う配列でちゃんと継承もやりますw)
Re: (スコア:0)
> 共有変数も、pubulic static宣言していまう。
って書いてるだろ
ちゃんと読めよ
Re:真のスタティック指向プログラミング (スコア:1)
ぐわ。まだストロング分が足りなかったw
つい習慣でprivateと書いてしまった私はまだまだ弱い…。
Re: (スコア:0)
Re:真のスタティック指向プログラミング (スコア:1)
objectIDがただのintになって型チェックもされないし、算術演算も通っちゃうからデバッグとメンテナンスはしんどいと思う。
あと複数種類のクラスがあるときオブジェクトの最大数も予想する必要がある。
placement newとあるのでC++の話だから関係ないけど、JavaやC#の場合この手の「模倣オブジェクト」はGC対象からはもちろん外れる。
Re:真のスタティック指向プログラミング (スコア:1)
あ、あと参照局所性がボロボロになるので今時のマシンだと多分かなり遅くなる。
Re: (スコア:0)
module A = struct
type t = int * float
let make i d = i, d
let inc (i, d) = i + 1, d
end;;
let a = A.make 1 2 in
A.inc a