参照型変数-5

参照型変数-3で、次回参照のメリットを挙げると書きましたが、ご覧とおり、参照型変数-4の記事で、演算子のオーバーロードが意外と使えることに気がつき、急遽内容を変更させていただきました。今回は、参照型変数-3の続きで、参照の演算子のオーバーロード以外のメリットについて考えていこうと思います。特に、言語仕様以外の視点からです。

例えば、参照型変数を導入せず、オブジェクトは基本的にポインタで扱うことにしましょう。なぜこうするのかと言えば、Collectionと値型は相性が悪いので、値型でCollectionを扱う訳にはいきません。そういう場合に局所的にポインタを使ってオブジェクトを扱うのなら、最初から全てポインタでオブジェクトを扱うことを前提に作ってしまうということです。そちらの方がいろいろ高速ですし、詳しいことは参照型変数-1で既に書いています。

しかし、「オブジェクトは全てポインタにしなさい」ということに、どれほどの人がついて来れるでしょうか?プログラミングの経験が浅い人がポインタを敬遠しがちなことは、想像に難くありません。せっかくのオブジェクト指向の、オブジェクト的考えを、ポインタと同時に考えてしまうことにより、なんだかよくわからなくなってしまうかもしれません。

また、値型も使えることは使えるので、みながみな原則的にポインタというデザインパターンに則ってくれるとも限りません。たびたびデザインパターンを無視したようなコードが出回れば、結局あまりよろしくない状況に陥りそうです。

これらの側面を考えても、参照型変数を導入するメリットはあります。ポインタではなく、自然な形で扱うことができますし、何よりコーディング規則的なものを設ける必要もありません。あまりプログラミングに慣れていない人でも、簡単に扱える言語になります。

前例として、Objective-CはNeXTSTEPとMac OS Xという非常に少ないプラットフォームでしか使われていないせいもあると思いますが、人気があまりなく、さらに、プログラミングをはじめるのに明らかに適さなそうな状況になっているのを見ると、ポインタを基本として扱う言語は難しいということかもしれません。そこをしっかりわかっていると、非常に気持ちよいコードを書くことのできる言語だと思うのですけどね…

さて、さすがに5回目の連載となるとダレてきたような気がしますが、もう少しで結論に達する予定です。こうもしているうちに参照型変数に仕様変更したActiveBasicが出来つつあるので、結論が出た頃にはβ版がリリースされているかもしれませんね。取りかかり早いですね、山本さん。おつかれさまです!

コメント

  1. tak より:

    OverTakerさんのブログはコメントがつけやすいなって思う。それはともかく。
    少し疑問に感じたところを1つだけ。

    > Collectionと値型は相性が悪いので、値型でCollectionを扱う訳にはいきません。

    相性が悪いと結論付けられる根拠が書かれていないので、ちょっと?です。
    Collection がオブジェクト(実体)を直接内包してもなんら問題はないと思いますし、実際に僕はそういうデータ構造を多用しています。
    理由は、スコープなどの関係でオブジェクトが破棄され、そのせいでポインタが無効になってしまうといったありがちなバグを未然に防げるからです。

    まぁ、オブジェクトの寿命をスコープではなく GC で管理するようにすればこんな初歩的なバグは一掃されそうですが。

    > 乗っ取って

    ついでながら、たぶん「則って」の誤りですよね。

  2. OverTaker より:

    誤字のほうは修正しておきました。ありがとうございます。

    >相性が悪いと結論付けられる根拠が書かれていないので、ちょっと?です。
    Collection がオブジェクト(実体)を直接内包してもなんら問題はないと思いますし、実際に僕はそういうデータ構造を多用しています。

    うっかりしてましたね。しかし、実体をコピーするのは少々コストがかかり過ぎるのではないでしょうか?Arrayなど、どんなオブジェクトも格納されるクラスで、そのような実装をしてしまうと、コピーにコストのかかるオブジェクトを入れたくなくなってしまうのではないでしょうか?

  3. tak より:

    > しかし、実体をコピーするのは少々コストがかかり過ぎるのではないでしょうか?

    はい。特に規模の大きなオブジェクトでその傾向がより顕著に現れますよね。
    それがオブジェクト指向では避けられないことなのだと開き直ればそれまでなのですが、その問題をJavaやC#が克服できているのは見事です。
    ActiveBasicはC/C++からJava/C#への路線変更を目指しているのでしょうね。やや強引ですけど。

  4. イグトランス より:

    C++でも巨大なオブジェクトをコレクションに入れるときには、例えばstd::vector >のように、スマートポインタを要素にしろと言われることが多いです。(Boostにはポインタ専門のコンテナ(コレクション)まで用意される始末)
    ただし、これには要素をポインタにしないとコンテナの要素を多態的(ポリモーフィック)に扱えないという理由もあります。この点でも値型コレクションはオブジェクト指向と相性が悪いといえるかもしれません。

  5. イグトランス より:

    あれ?消えてしまいましたね、std::vector<boost::shared_ptr<Piyo> >(文字実体参照を使用)でどうでしょうか。

コメント投稿