10.15 1学期目 | 11.15 2学期目 | 12.15 3学期目 | |
---|---|---|---|
Level | 106 | 107 | 108 |
GPA | 3.3 | 2.9 | 3.2 |
10.15 1学期目 | 11.15 2学期目 | 12.15 3学期目 | |
---|---|---|---|
Level | 106 | 107 | 108 |
GPA | 3.3 | 2.9 | 3.2 |
Javaでメソッドを呼び出すときにはクラスからインスタンスを生成してインスタンスのメソッドを呼び出すのが普通です。一方、staticメソッドはインスタンスを生成しなくてもクラスから直接呼び出せます。このため、オブジェクト指向プログラミングを理解していない古いタイプのプログラマは、Javaでもstaticメソッドを多用します。これを揶揄して「staticおじさん」と呼ぶのです。これは、 インスタンスメソッドを使う→普通 staticメソッドを多用する→プログラマがオブジェクト指向を理解していない可能性あり と読み取れます。思わず普通ってなんやねん?と突っ込みたくなるのですが、 そろそろこのインスタンスメソッドを使うのが普通という誤謬を解きたいのですが、staticメソッドは場合によっては推奨されています。 期待するコードを期待するように書こうという本から引用させていただくと
クラスのメンバへのアクセスを制限するもう一つの方法は、メソッドを出来るだけstatic にすることだこのReadable codeという本は私は英語版を購入したのですがそこでも同様のことが書かれています。 また、英語が読める人は、static methodで検索をかければいろいろ議論を見ることができます。たとえば以下のQAたち https://www.quora.com/Why-is-using-statics-Static-method-block-variable-in-Java-programming-bad-programming http://programmers.stackexchange.com/questions/98083/cant-i-just-use-all-static-methods ここでは、インスタンスメソッドを使うのが普通とか訳のわからん理由ではなくきちんと事実に則って議論がされています。 事実(fact)に則って議論するということは客観的(objective)な議論ができているということになるでしょう。 ざっくりとまとめますと、staticメソッドを使うと 欠点:継承ができなくなる。ポリモーフィズムも使えなくなる。 利点:メンバー変数へのアクセスを制限できる。パフォーマンスが上がる。 ということです。他のものは自明として、利点のところで『パフォーマンスが上がる』かは検証の必要があるのですが、ポリモーフィズムはオーバヘッドを発生させるのでそれを使わなければパフォーマンスがあがる可能性はあります。 また欠点の中で、『ややこしくなる』という意見もあったのですが、これは主観的な意見でしょう。たとえばstaticメソッドを使いなれた人はむしろすっきりとすると考るかもしれません。 さて、継承もポリモーフィズムも使わないということであれば、staticメソッドを使ってもよいということになるのですが、この反論として、『オブジェクト指向でなくなる』というのがあります。もはや手段と目的が混同されているとしか言いようがない意見でいやはや疲れます。 まぁ一介の無名なエンジニアが何をいっても仕方がないのでもっと説得力のある例を出しましょう。 επιστημη さんという著名なライターさんがいらっしゃいますが、彼は思い切りstatic メソッドを使っておられます。 http://blogs.wankuma.com/episteme/archive/2012/12/28/310396.aspx のコードのrefereeクラスがそれに当たります。refereeクラスには3つのメソッドがありますが、すべてstaticメソッドになっています。 つまり、事実としてstaticメソッドは使うときは使うのです。ちなみにもちろんですが、επιστημη さんがオブジェクト指向を理解していないということはないでしょう。 という訳で、
ただ、現実に年齢を重ねると、どうしても守りに入りがちなのは事実です。「自分はstaticおじさんなのではないか」という問いは、常に忘れてはならないのでしょう。というヒマがあったら自身が思わぬ誤謬をしていないか記事の検証を行うことを勧めます。 2/4追記 コメント欄で文意を汲み取っていないという指摘を受けましたが、まぁ充分文意を汲み取って反論をしているのですがどうも分かりづらいかもしれないので、補足します。
ただ、現実に年齢を重ねると、どうしても守りに入りがちなのは事実です。「自分はstaticおじさんなのではないか」という問いは、常に忘れてはならないのでしょう。こういう教示的な文章は一見ごもっとなことのように受け取れますが、冷静に読めば分かりますとおり、ど素人でも同様のアドバイスができるでしょう(例を出すとサッカーや野球観戦をしているおっさんが野次っているさまと同じと言えば納得できるでしょうか?)。 社会人としては自分を律したり反省することは歳をとろうが若かろうが、技術者であろうがなかろうが、常に必要でいちいちアマチュアに指摘されることではないです。 そうはいっても100歩譲って、プログラミングに携わるプロが 『(引用先の記事に書かれてるニュアンスでの)自分はstaticおじさんではないか?』 と自問するということはどういうことでしょうか? つまり、『staticは使えるのか?使えないのか?』という正に私がここで行っている議論をすることです。 そしてまさに インスタンスメソッドを使う→普通 staticメソッドを多用する→プログラマがオブジェクト指向を理解していない可能性あり こういう意見が20年前はともかく今となっては偏見に基づく誤謬でしかないということを認識することが重要だと言いたいわけです。プロなら気づきましょうということと、素人なら知ったかぶりをするのはやめましょう、という話です。