読者です 読者をやめる 読者になる 読者になる

Javaのソースは長いからいい

続き。

Javaで書いたソースコードが長くなるのは、それだけ情報量が多いからじゃないのかな。結局は静的型付けか動的型付けかという話になるんだろうけど。

人間がソースコードから得られる情報量が多いことはもちろんだけど、IDEがソースコードから多くの情報を得られるからこそ、人間に対して様々なサポートを提供することできる。

例えば@Overrideアノテーションなんかは、ソースコードを書くことによってバグを防いでるよね。だからソースが長いからバグが発生するというのとはちょっと違うと思う。

僕はそんなにJavaをガリガリ使っているわけじゃないけど、Javaでコードを書く時って案外楽な気持で書くことができる。適当に書いても後から直すのが楽だからだ。適当な変数名はメソッド名を付けても後から一括修正できるし、メソッドの切り出しみたいなリファクタリングもIDEがサポートしてくれる。こういうことができるのは、結局ソースコードの情報量が多いからなんじゃないかな。

だから、Javaの人は、「Javaってソース長いよね」って言われた時に「そんなに長くないよ」とか「タイプ数はそんなに多くない」とか言うよりも、「長いからこそいいんだよ」っていってみるのはどうでしょう。

突然だけどPythonの話。Pythonのどこが好きかというとhelp()とdir()、あとinspect。help()はただのオンラインマニュアルって話じゃなくて、インスタンスからdocstringにアクセスできるというのが好きだ。

# listクラスのhelp
>>> help(list)
Help on class list in module __builtin__:

class list(object)
 |  list() -> new list
 |  list(sequence) -> new list initialized from sequence's items
 |
...
# helpにインスタンスを渡す
>>> help([1,2,3])
Help on list object:

class list(object)
 |  list() -> new list
 |  list(sequence) -> new list initialized from sequence's items
...

動的型付けだとソースコードを見ただけでは型を判断できない。かわりにPythonでは実行時にインスタンスからさまざまな情報を得ることができる。たとえば昔に書いたものだけど、

このサーバーがいつまで生きてるかわからないので転載しておくと、色々クラスを継承したクラスCのオブジェクトobjがあって、obj.method()はどのクラスで定義されたものかをこんなコードで得られますよという話。

import inspect

def definedat(method):
    attname = method.func_name
    cls = method.im_class
    for c in inspect.getmro(cls):
        if attname in c.__dict__:
            return c
>>> class A():
...     def a(): pass
...
>>> class B(A): pass
...
>>> class C(B): pass
...
>>> obj = C()
>>> definedat(obj.a)
<class __main__.A at 0x00D1DF30>

こういう機能に比べれば、構文がどうとかこうとかなんてどうでもいい気がする。

参照