Java

オブジェクト指向は失敗だった

オブジェクト指向プログラミングは失敗だった――以前から思っていました。 okuranagaimo.blogspot.com オブジェクト指向プログラミング (OOP) が人類にとって早すぎたか、人類には OOP が向いていなかった。世の中の Java で作られたプログラムのほとんどは、…

static メソッドでよいのでは?

static おじさんと呼ばれる人がいたそうだ、あるいはいるそうです。インスタンスの生成を嫌がって、何でも static メソッド にしてしまう人のことです。static メソッドと呼ぶよりも関数と呼んだ方がよいかもしれません。 インスタンスの生成を嫌がるのは、…

クラスの依存関係グラフ 3

1回 クラスの依存関係グラフ - 超ウィザード級ハッカーのたのしみ 2回 クラスの依存関係グラフ 2 - 超ウィザード級ハッカーのたのしみ Java および Scala のクラスの依存関係のグラフについて調べている。 驚くべきことに(まあ予想はしていたけれども)…

クラスの依存関係グラフ 2

前回: クラスの依存関係グラフ - 超ウィザード級ハッカーのたのしみ クラスの依存関係のグラフについて調べています。 今回は前回よりも大きな系について調べました。 対象は、Spark 2.0.1 です。前回は、Hadoop 由来のクラスだけ調べたが、今回は Spark の…

クラスの依存関係グラフ

Java のクラスの依存関係を調べてみた。 規模が大きいアプリケーションの方が統計が取りやすいので、Apache Hadoop の 3.0.0-alpha バージョンを対象に調べる。テストとアノテーションを除いた、Hadoop 由良のパッケージに含まれるクラスに依存関係のグラフ…

コード型ログ(4) Initialization-on-demand Holder

前回: コード型ログ(3) privateなメソッドのテスト - 超ウィザード級ハッカーのたのしみ 必要なときにインスタンスを作ったら、メモリ効率がよくないかと思って変なことをしてしまう悪い例。 class BadSingleton1 { private static BadSingleton1 instance;…

コード型ログ(3) privateなメソッドのテスト

前回: コード型ログ(2) staticな変数の排他にはsynchronized(*.class) { } を使う - 超ウィザード級ハッカーのたのしみ privateなメソッドは、ユニットテストがしにくい。 対処法は2つで、 テストしないか、 Reflectionで頑張るか、 スコープをpackage pri…

コード型ログ(2) staticな変数の排他にはsynchronized(*.class) { } を使う

他の人が書いていたら読めるけれども、知らなきゃ書けない定型文をあつめたコード型ログを作っている。今回は2回目。 前回: コード型ログ(1) スレッドを止めるにはinterruptを使う - 超ウィザード級ハッカーのたのしみ いい設計とは言えないかもしれないが…

コード型ログ(1) スレッドを止めるにはinterruptを使う

他の人が書いていたら読めるけれども、知らなければ書けない定型的なソースコードの型を集めているので気が向いたら書いていく。ダジャレが好きなので、コード型ログと呼ぶ。今回は1回目。 無限ループを持つスレッドはinterrupt()で止められるようにする。 …

FlyweightパターンとMemoizationとメモリリーク

デザインパターンの1つFlyweightパターンは要するにMemoization (メモ化) のことです。Flyweightパターンというと何のことか良くわからないので、Memoizationパターンと読んだ方が適当なように思います。 メモ化とは、関数が返した値を覚えておいて、再度同…

抽象クラスとは

今日は抽象クラスについて考えてみる。 前々回: クラスとは 前回: インターフェイスとは 抽象クラスとは、必ず継承して使わなければならないクラスのことである。ある抽象クラスAに属していて、Aのサブクラスに属していないようなオブジェクトはいない。 …

インターフェイスとは

前回(クラスとは)はclassとは何かを考えてみたので、今日はinterfaceについて考えてみる。 インターフェイスとは、オブジェクトのに付与される性質の1つである。 クラスとは、同じ性質を持ったオブジェクトを分類 (classification) したものです。同じメソ…

リスコフの置換原則は呼び出し側にも責任が伴う

以前にオブジェクト指向になっているならば、あるクラスを継承したクラスは継承元のクラスと置き換えても動かなければならないという気付きについて書きました。名前がついていて、それはリスコフの置換原則と呼ばれるらしいです。 fj.hatenablog.jp このリ…

ClassクラスのClassオブジェクト

具体についてのクラスはインスタンスと同じもの? - 超ウィザード級ハッカーのたのしみ クラスって何なのだろうと疑問に思い始めた。 さて、Javaにはjava.lang.Classクラスという変なクラスがある。Classクラスのオブジェクトはクラスそのものではないみたい…

具体についてのクラスはインスタンスと同じもの?

特定の具体を示しているクラスがあったとして、それはインスタンスと同じものと言えるのか? ぼんやりとした疑問で答えはまだ出ていない。 例えば、DogクラスとPetDogクラスがあったとする。PetDogクラスは、Dogクラスを継承していて、Dogクラスの中でも人に…

オブジェクト間の関係

UMLについて調べています。思考の整理ツールとしての表記法(diagramming)には興味があります。 UMLは書きにくいし、曖昧さも強いし、目的が良くわからない絵が多いので、あまり好きにはなれないです。規格としては不完全なように思うので、独自に改変した…

Spockを試す

JavaでBehavior Driven Developmentをするためのフレームワーク、つまり、機械に読める仕様書を書くためのフレームワークの1つであるSpockをeclipse上で試す。ついでにGradleも試す。 github.com Eclipseの設定 SpockはGroovyを使うので、EclipseでGroovyを…

ユニットテストの綺麗な書き方

テストばっかり書いている。テストコードなんかの綺麗さを追求しても仕方ないかなと思っていたのだけれど、適当に書いていると重複が多くて大変で、シンプルに楽に書くコツみたいなのを掴んできたのでメモしておく。JUnitを対象にする。 テストクラスの単位 …

巨大なtry-catchが許せない

他の人が書いたコードに関しては誰しも許せないと思うようなことがあるだろう。私が最もイライラするのは巨大なtry-catch構文である。 try { foo(); bar(); ... ... spam(); egg(); } catch (Throwable t) { LOG.warn("error message", t) } というようなも…

深いネストは忌むべき

Zen of PythonはPython以外の言語であっても私がコードを書くときの指針である。 その一つに、 Flat is better than nested. という文句がある。深いネストはコードの可読性を著しく落とす。スクリーンの右のほうに文字が寄っているコードは大変読みづらい。…

メソッドの主語を統一したい

Javaでプログラムを書いていて気持ち悪いなと思うところは主語が一貫していないところです。Javaの文法でなくて慣例の問題です。 object.getValue(); というメソッドがあったとしてこの"get"の主語は何ですか?valueを得るのはこのメソッドの呼び出し元のク…

Javaの3種類のクラス

Java等のクラスには以下の3種類がある: 文法に組み込まれたクラス 型としてのクラス サーバーとしてのクラス Javaはこれらが区別されていないのが,不満だ. 文法に組み込まれたクラス IntegerクラスとかThreadクラスとかSystemクラスとか,java.langパッ…

CやJavaのどこが静的なの?

結構最近までメインフレームにスタックがなかったと聞いて、CやJavaだって動的じゃね?と気づいた。 メインフレームLinuxの実装(後編)(1/3) − @IT もちろんCやJavaを静的言語と呼んで、RubyやPythonを動的言語と呼ぶ場合には、それは動的型付け言語、静…