これは或るメンバに対するGetterとSetterの実装コードです
書いた人曰く、「一年間かけてリファクタリングしていたが、冗長性を上げたが故にメモリが足りなくなってきており、これからはパフォーマンス・チューニングをかける必要がある」と主張しておられました.
// なんか20000行くらいあるクラス // ... // 6000行目あたりに宣言されてたGetter public FooBarDrawerBazOption getFooBarDrawerBazOption() { if (this.fooBarDrawerBazOption != null) { this.fooBarDrawerBazOption = new FooBarDrawer( this.hogehugaOptionHColor, // String this.hogehugaOptionVColor, // String this.hogehugaOptionHLength, // float this.hogehugaOptionVLength, // float this.hogehugaOptionHOffset, // float this.hogehugaOptionVOffset, // float new FooBarLineType[] { FooBarLineType.PLAIN, // 悪名高い "interface 定数" っていうヤツ FooBarLineType.PLAIN }, new FooBarLineWidth[] { FooBarLineWidth.NORMAL, // 悪名高い "interface 定数" っていうヤツ FooBarLineWidth.NORMAL }, this.isFooBarHDraw, this.isFooBarVDraw); } return this.fooBarDrawerBazOption; } // ... // 17000行目あたりに宣言されてたSetter public void setFooBarOptionHOffset(float newHogehugaOptionHOffset) { this.hogehugaOptionHOffset = newHogehugaOptionHOffset; this.hogehugaBazOptionHOffset = newHogehugaOptionHOffset; this.fooBarDrawerBazOption = null; // Drawerの内部メンバが変更されたので初期化 }
使い方ヒント: 「これは臭う」という行を見付けたら、各行のをクリックしてマーキングしておきましょう(要Twitter OAuth認証)
FooBarDrawerをどうしてもimmutableにしたいのかなぁ…そもそもfooBarDrawerBazOptionとhogehugaOptionHColorなどの個別メンバとで2重管理するのも意味不明だ。
あーあ、javaなんか使ってるから。Common Lisp, javaが必要ならclojureでマクロ書けばいいのに。 こういうテクをマクロに落とし込めば、そしたらあとは全アクセサを自動生成すればいいだけ。 抽象度の低い言語のつまらない仕様にがんじがらめにされるのはいやだね。
百歩譲ってメモリ不足解消は理解するとしても、コード量から察するに処理速度は物凄く低下しそうな気が……。
コメント投稿には、twitter認証が必要です。
Twitter認証
パフォーマンス以前に動くんかこれ。。。
出来立てインスタンスor null しか返ってこない気が。。。