生き様121. クラスとオブジェクトとインスタンスで混乱した話
先月の技術コラムについてのお詫び
先月は「仮想環境をふんわり考える」ということで、仮想環境について取り上げました。
その文の中で、「ハイパーバイザ型」と「ホスト型」の仮想環境を混同して紹介してしまいました。
僕が取り上げたかったのは「ホスト型」なのですが、「ハイパーバイザ型」として解説していました。
コメント欄でのご指摘を頂き、誤りに気付くことができました。
ありがとうございました。
正しくない情報を記載していた事を、深くお詫び致します。
該当箇所について、可能な限り修正を行いましたが、一部修正に至っていない箇所もあります。
間違いに至った原因も、修正に至らない原因も、全ては白栁の勉強不足です。
今後も、文中に間違いがありましたら、ご指摘を頂きたくお願い致します。
もう一つの技術的な間違いを発表した話
実は、先月はもう一つ、技術に関する内容で根本的な間違いをしたままの発表を行ってしまいました。
この内容のどこがおかしいか、わかりますでしょうか?
そうです。
「オブジェクト」と「インスタンス」が結ばれるべき相手が逆なのです。
今回は、何故そんな勘違いをしてしまったのか?ということを解説します。
混乱する人が多い用語だけに、白栁と同じ間違いをする人が居なくなるように願って。
クラスとオブジェクトとインスタンスの整理
まずは、簡単にクラスとオブジェクトとインスタンスを整理していきましょう。
白栁の理解をベースにしていますので、お気づきの点があれば、コメント等でご指摘頂けると嬉しいです。
オブジェクトとは、【物】です。
ですが、コンピューターのシステム上で直接【物】を扱うことはできません。
より正確に言うならば、【物】を扱う為に【抽象化された概念】です。
その内容として【データ】と【処理】を持ちます。
そのオブジェクトの定義、設計図といえる、振る舞いを纏めたものがクラスです。
纏める為には、同然のごとく抽象化が必要になります。
「同一オブジェクト=同一クラスから作成された」となります。
オブジェクトを使う際に定義されたものをインスタンスと呼びます。
つまり、インスタンスはオブジェクトの【実体】です。
ですので「同一オブジェクトで別インスタンス」という言葉が成り立ちます。
間違えた理由
最近、白栁が大きく関心を寄せている理論があります。
「コーディングは設計工程」という考え方です。
僕の感覚として、「設計は概念」なのです。
「設計段階で書いている、オブジェクトに対する概念があるのでは?」と考えました。
そこで、インスタンスという言葉に飛びついてしまったわけです。
僕の考えや知識が浅すぎたということを反省しています。
クラスやインスタンスという言葉は必要か?
混乱しやすい上に、オブエジェクトとほぼ同義のインスタンス。
そして、JavaScript等のゆるいオブジェクト言語では使われないクラス。
この2つの言葉は不要ではないか?という主張があるそうです。
僕はそうは思いません!
まず、オブジェクトを纏めた概念を示すクラスは必要です。
特定の言語で使用しないからと言って、全て消してしまえというのは極端過ぎます。
インスタンスについては、ほぼオブジェクト同義であったり、紛らわしいから区別する必要がない、という意見に同意する人も多いでしょう。
「分かる(理解する)」=「分ける(区分する)」という考え方があります。
つまりこれらは、意味や歴史的な経緯があり、別れる必要があった言葉です。
それを理解せずに「一緒だから分ける必要はない」という意見は、乱暴に聞こえます。
少なくとも僕は、個々のオブジェクトを表す言葉として、オブジェクトより小さい集合の単位を表現する言葉が必要だと、僕は感じています。
「オブジェクト指向はプログラマの数だけある」
オブジェクト指向という考え方が生まれて、そろそろ50年が経とうかとしています。
アラン・ケイの唱えたオブジェクト指向と、現代のプログラミング言語が表現しているオブジェクト指向は、必ずしも同一ではないでしょう。
メッセージを重視したり、値を重視したり、DDDだったり、色々な考え方がされています。
今回、僕が示した様な、インスタンスという言葉を明らかに誤用するケースを除いては、厳密で正しい「オブジェクト指向」は存在しないのではないか?そう考えています。
ある人が言っていました。
「オブジェクト指向はプログラマの数だけある」と。
オブジェクト指向とは、既に宗教や哲学の一部なのかも知れませんね。
以上!
主催イベント宣伝
2022年1月23日(金)に恒例のオンラインイベントを主催致します。
その名も『【超ショート】90秒LT会【2022Winter】』です。
季節ごとに行っているこのイベントも、なんとか5回目。1年を回りました。
初心に返って、今回のテーマは「今年の抱負」です。
新しい年の目標を、発表してみませんか?
現在、登壇参加者・視聴参加者を募集しております。
上記のイベント名が、イベントのConnpassページへのリンクとなっております。
そのページから、参加登録をお願いします。
また、このイベントは3ヶ月ごとの開催を予定しています。
今回ご都合が悪い方は、是非次回、2022年4月のイベントへの参加をご検討下さい。
宜しくお願い致します。
ミニコーナー:帰ってきた!!白栁の2ヶ月だけ(ちょっと)ホンキダイエット!
今回は体重の計測を忘れていた為、お休みです。
2週間ジムに通わないことで、完全に気が抜けてしまっていますね。
ITエンジニアの視点で、時事ニュースを5分間で紹介する動画を平日ほぼ毎日公開してます。
「日々の生活の中にエンジニアリングがある」からこそ、
身近な時事ニュースから学ぶことが重要です。
取り上げたいニュースはあるのですが、動画の編集をしている余裕がない状態です。
少し違う形での公開を準備しています。
お待ち下さい。
コメント
おたみ
私個人の感覚として、「オブジェクト」という言葉は文脈によって
・クラスの同意語
・インスタンスの同意語
どちらの意味でも使われている気がします。
「コーディングは設計工程」
こういう記事があったんですね知りませんでした。
昔一度、社内の勉強会で同じような問いかけをしたことがあります。
その時のリーダー/マネージャ層はこの記事のような認識を持った方はいませんでした。
よく使われる建築業界との比較だと記事の内容からは
・プログラマ:建築士さん
・コンパイラなど:現場の大工さん
かな?と感じましたが、皆さんの認識は
・プログラマ:現場の大工さん
・コンパイラなど:カンナ/のこぎりなど
だったようです。
ちゃとらん
ものすごく難しい所に踏み込みましたね。
オブジェクトという単語ではなく、オブジェクト指向言語で使われる場合、オブジェクトとインスタンスは『同じ』と考えています。(これも正しいかどうか疑わしい…)
> インスタンスはオブジェクトの【実体】です。 ですので「同一オブジェクトで別インスタンス」という言葉が成り立ちます。
Javaで言うと、 class A implements X,Y,Z に対して、
A a = new A();
X x = a;
Y y = a;
Z z = a;
の場合、a をオブジェクトと呼んで、x,y,z をインスタンスと区別するなら、先の言葉が成り立ちますが、たぶん、そんな言葉の使い分けはしていないと思います。
さらに、同一オブジェクトの同一が、
A a1 = new A();
A a2 = new A();
の場合に、a1 と a2 は、同一と言っているのか、異なると言っているのかにもよります。
# もちろん、equals や、hashCode もオーバーライドして a1.equals(a2) == true; になるという前提です。
難しいですね。
エンジニアカウンセラー白栁隆司
To:おたみ さん
コメントありがとうございます。
文脈によって広く使われる様になっているのが、果たして良いことなのか?悪いことなのか?
これらを一概には言えないと思います。
ですが、曖昧なままで理解したつもりになっているのであれば、それは別です。
それがオブジェクト混乱させる要因の一つだと、感じています。
「コーディングは設計工程」も最近人から聞いて、納得した言葉です。
僕も、現在ではおたみさんと同じ認識でコンパイラなどを考えています。
それは、現場で手を動かしている人間ではないと、解りにくい感覚なのかもしれません。
それ以外にも、リーダーやマネージャーが持っているバイアスが関わっていそうな気もします。
この話はまた改めて纏めたいと考えています。
エンジニアカウンセラー白栁隆司
To:ちゃとらん さん
幾多の先人が踏み込んで、出てこれない闇の迷宮に踏み込んだ気がしています。
教科書や入門書では説明されている「オブジェクト」と「インスタンス」が、実務の現場だとその通りに使われていない、ということは初学者の混乱の種ではないか?と言うのが発端です。
それを「ニュアンスでわかれよ」というのは、かなり乱暴だと考えてのことです。