質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

5回答

3758閲覧

インスタンスの存在意義について

AGadget

総合スコア60

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/05/23 10:05

VB.NETに限らず、プログラミング全般において用いられているインスタンスについて質問させてください。
お聞きしたいのは「インスタンスの存在意義とは何か(インスタンスのメリットは何か)」です。

最近、VB.NETの勉強を始めたのですが、勉強のため購入した入門書で疑似乱数を発生させる処理を試していたところで問題が発生しました。
入門書には「疑似乱数を発生させるにはRandomクラスのNext()メソッドを使います」という説明がありました。
そこでサンプルコードを見ずに以下のように記述してみました。

VB

1Console.Write(Random.Next(0,10))

これでいけると思ったのですがVisual Studioからは「非共有メンバーを参照するには、オブジェクト参照が必要です。」と警告を受けてしまいました。
何が悪かったのだろうと思い、サンプルコードを参考にして以下のように修正すると正しく動作しました。

VB

1Dim rnd As Random = New Random() 2Dim num As Integer = rnd.Next(0, 10) 3Console.Write(num)

teratailに挙がっている他の質問を見させて頂いたところ、変数rndは「インスタンスを参照している変数」で、変数numは「変数rndを参照することで、ひいてはインスタンスを参照している」ということになるのかと解釈しております。
そこで(この解釈が間違っている場合、質問の前提が崩れますが)思ったのですがオブジェクト指向では何故インスタンスを利用しているのでしょうか?

後者のコードの場合、たった3行なのでパッと見ただけで処理の流れが追えますが、これが何百行にもなったり、別のファイルから変数rndを参照するとき、インスタンスを利用しなければならないと困らないのでしょうか?
Random.Next()が疑似乱数を発生させる、ということはVB.NETを勉強すれば多くの人で共有することができます。
しかし、これを変数に入れなければならないとなると変数rndを作成した人と、変数rndを作成した人から「疑似乱数を発生させたいときは変数rndを参照してね」と聞いた人にしか分からなくなりませんか?

もちろん、処理の流れを追ったり、また新たに別の変数にNew Random()したら良いのでしょうが、うーん……なんだかスマートじゃないなぁ、という気がしてなりません。
特に「変数rndに入れなくても使えるよ。けど変数に入れたほうが色々メリットがあるよ」ならわかるのですが「変数にNewして入れないと使えないよ」というのは不便だなぁと思ってしまいます。

改めて質問ですが「インスタンスの存在意義」を教えてください。
より言えば「インスタンスのメリット」をご教示頂ければ幸いです。

長くなりましたが、よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2019/05/23 10:15 編集

VB詳しくないので、なんとも言えませんが、VBにはインスタンス化が必要ない、スタティックなクラスとかはないのでしょうか? また、インスタンスのメリットは、どの言語においても、開発が大規模になればなるほど、有用性がわかると思いますよ。
AGadget

2019/05/23 21:24

//VB詳しくないので...はないのでしょうか? 申し訳ありません。 まだまだ勉強を始めたばかりですのでインスタンス化不要のクラスというものについては分かりません。 //また、インスタンスの...と思いますよ。 なるほど……引き続き勉強のほうを進めていこうと思います。
ku__ra__ge

2019/05/24 07:25 編集

> 変数numは「変数rndを参照することで、ひいてはインスタンスを参照している」 別に質問の主な内容とは関係ないのでこちらで指摘させてもらいます。 変数numには「インスタンスのNextメソッドを実行した結果の戻り値」の数値が格納されています。 numという変数に格納されているのは単なる数値なので、変数numは変数rndを参照していません。
AGadget

2019/05/25 01:42

//別に質問の主な内容とは...を参照していません。 そうなんですね。 ありがとうございました!
guest

回答5

0

インスタンスの有用性を説明するのにRandomクラスはあまり向いていない気もしますが

RandomのコンストラクタにRandom(int32)というものがあります。
これは、乱数のSeed値を指定して、Randomクラスを生成するものです。

処理にAの配列にはSeed値が1の乱数の値をセット、Bの配列にはSeed値が2の乱数をセットしなさい
という処理があった場合、もしRandomがインスタンスを使わないものであった場合

VB.NET

1Random.Seed = 1 2For i=0 To 10 3 A(i) = Random.Next(0,10) 4Next 5Random.Seed = 2 6For i=0 To 10 7 B(i) = Random.Next(0,10) 8Next

という処理になります。(例ですのでコンパイルエラーとなります)
インスタンスを使用する場合

VB.NET

1Dim rndA As Random = New Random(1) 2Dim rndB As Random = New Random(2) 3For i=0 To 10 4 A(i) = rndA.Next(0,10) 5 B(i) = rndB.Next(0,10) 6Next

このようになります。

例えば、フォームにボタンを2個置いたらどう識別しますか?

VB.NET

1Button1.Text = "ボタン1" 2Button2.Text = "ボタン2"

という感じで書きますよね?
このButton1Button2もインスタンスを格納する変数です。

また、VBですとForm2を表示したい場合、いきなり

VB.NET

1Form2.Show()

と書けますが、これは内部で

VB.NET

1Public Form2 As Form2 = New Form2()

と行われていたりします。
はっきり言って、VBでプログラムする以上、ありとあらゆる場所でインスタンスは利用されています。

>しかし、これを変数に入れなければならないとなると変数rndを作成した人と、
>変数rndを作成した人から「疑似乱数を発生させたいときは変数rndを参照してね」と聞いた人にしか分からなくなりませんか?

これは、別にインスタンスを格納する変数だからではないですよね?
Dim A As Integer = 1
とあって、Aには1が入っていますというのは書いた人しか分かりませんよね?

投稿2019/05/23 11:40

編集2019/05/23 11:47
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2019/05/23 21:00

ご回答ありがとうございます! //インスタンスの有用性を説明するのに...ありとあらゆる場所でインスタンスは利用されています。 VB.NET、もといオブジェクト指向言語ではインスタンスは基本中の基本となる概念なのですね。 ただ、そうですね、申し訳ありません。 サンプルコードを使ってまで丁寧にご説明頂いたのですが、やはり現時点ではインスタンスの必要性が理解できませんでした。 何と言いますか、それは別に関数のようなかたちで処理すれば良いのではないのかなぁ、と。 インスタンスという概念、および処理に絞る必要はあったのかと思っています。 // >しかし、これを...しか分かりませんよね? まったく仰る通りです。 自分でも、質問させて頂いたあとで「あれ、それっておかしくないか?」と気付きました。 ただ、このコメントを書いているときに思ったのですが、やっぱり、関数と言いますか、何らかの処理を担う文は特定の文字で表現するように絞ったほうが良いのではと考えてしまいます。 Random.Next()は「Random.Next()」と表記されることを基本としたうえで、時には変数に突っ込んでも良いよねっ!...という形がベターではないのかなぁ、と。 まぁ、そんなことを言ってもしょうがないわけですが……。 ご回答ありがとうございました!
YAmaGNZ

2019/05/23 22:00

では、Form1を2つ表示したい場合はどうしますか? Form1と同じ画面をForm2として作成しますか? では、Form1を100個表示したい場合、Form1~Form100をデザイナーで作成しますか? For i = 1 To 100 f(i) = New Form1 Next とすれば簡単ですよね
AGadget

2019/05/25 01:04

//では、Form1...とすれば簡単ですよね おぉ! なるほど、そういうこともできるんですね。 便利ですね、インスタンス。 ただ……すみません。 やっぱりインスタンスであるべき理由がよく分からなかったです。 いや、インスタンスが便利なものなんだということは分かったのですが、インスタンス1本に絞る必要は無かったのではないかと。 オブジェクト指向で書かれたコードを見るなどして、オブジェクト指向型の処理について理解を深めたいと思います。
guest

0

ベストアンサー

  • インスタンスという概念の必要性
  • インスタンスが必要なケースが有ったとして、乱数発生器はそうなのか?

の2つですね。


VB

1Dim i As Integer = 1

何気なく書くであろうこれ、何をしているかと言うと、System.Int32構造体のインスタンスを生成して代入しています。

インスタンスがなければ1とか2とかいう値すらプログラムで扱えません。


じゃあなんで乱数生成器についてはをインスタンス化する必要があるのか、関数でいいんじゃないか?
となりますね。例えば正弦波を計算するMath.Sin()はインスタンス化の必要ないですからね。

確かに乱数生成を1つの関数で済ませている言語はあります。Cとか。
C言語ではsrand(seed)関数で乱数生成器のシードを設定してrand()で乱数を計算します。(プログラムのどこかにseedを保持する変数があって、srand()で代入してrand()でそれを利用して計算している)
言い方を変えればC言語の乱数発生器はプログラム中で1つしか存在できない、シングルインスタンスです。(自分で作れば別です。)

乱数生成器が1つしか無いと困る例がマルチスレッドプログラミングです。
あるスレッドが乱数生成機を使っているときに別のスレッドが同じ乱数生成機を使おうとすると、乱数生成機の状態更新計算がダブっておかしくなってしまうので、1つしかない場合は「俺が使っているからお前らちょっと待ってて」(排他制御)という制御をしなくてはなりません。

排他制御を組むよりスレッドごとに異なる乱数生成器をもたせたほうが楽です。
なので言語によっては乱数生成機がマルチインスタンスになってます。

投稿2019/05/24 00:43

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2019/05/25 01:37

ご回答ありがとうございます! //何気なく書くであろうこれ...で扱えません。 気づかぬうちにインスタンスのお世話になっていたわけですね。 //じゃあなんで...マルチインスタンスになっています。 自信が無いのですが――オブジェクト指向言語というのは複数の処理を同時……というより並行して(?)動かすことを前提にしているようですね。 だとすると、私は根本的にオブジェクト指向プログラミングというものを全く理解できていなかったようです。 大変勉強になりました。 ご回答ありがとうございました!
Q71

2019/05/28 07:33

無印 C でも複数の処理を同時に/並行して実行できます。 日本語の「オブジェクト指向」ではなく、英語の object oriented から考えてみてください。
guest

0

「変数にNewして入れないと使えないよ」というのは不便だなぁと思ってしまいます。

いえ、そんな事はありません。rndを二度と使わないなら、変数代入の必要はありません。

vb

1Dim num As Integer = (New Random()).Next(0, 10)

投稿2019/05/23 10:09

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2019/05/23 20:41

ご回答ありがとうございます! //いえ、そんな事は... なるほど、こういう書き方もできるのですね。 まだまだ勉強が足りておりませんので、ご提示頂いたコードで、どうして変数rndを2度と使えないのか分かりませんが今後使うときがありそうな気がします。 ご回答ありがとうございました!
guest

0

こんにちは。

インスタンス=変数と考えて良いですよ。変数を使わないとプログラムは事実上作れないです。だから、インスタンスは必要です。(メリット云々の話ではないです。)

因みに疑似乱数は、一般に「疑似乱数列」を生成するものです。
同じSeedを元に生成すると同じ乱数列が生成されるという特性があります。これはプログラムをデバッグする際に、かなり重要な特性です。
そのような「数列」を生成するためには何らかの記憶領域が必要です。だから、Randomクラスは一度インスタンスを生成してその「記憶領域」を確保した上で疑似乱数列を発生させるのです。

しかし、同じ乱数列を生成する必要がないような場合は、maisumakunさんが書かれているような式を関数として提供すれば、外から見るとインスタンスは不要となります。(ローカル変数として使ってますが、関数から返ってくると破棄される一時変数ですので気にする必要がありません。)

投稿2019/05/23 14:06

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AGadget

2019/05/23 21:20

ご回答ありがとうございます! //インスタンス=変数と考えて良いですよ。 なるほど……なるほど? 確かに仰る通り、変数宣言とインスタンス化(?)の書き方は近いですね。 当面この考え方を念頭に置いて勉強を進めていこうと思います。 //変数を使わないと...ではないです。) 変数のお話は分かるのですが、やはりインスタンスの必要性はよく分かりませんでした。 これから勉強していくなかで理解できるだろう、というより絶対に理解しなければとちょっと不安になってきました。 //因みに疑似乱数は...を発生させるのです。 いくつかの自動生成オープンワールド系ゲームで採用されている「シード値」というやつのことですね。 確かに、いや具体的にどう重要な特性かは説明できないのですが、何となく重要なのだろうなぁ、とは理解できました。 ただ、その「『数列』を生成するためには何らかの記憶領域が必要」というところがよく分かりません。 他の言語には疑似乱数を発生させる関数があるわけで、どうしてVB.NET(とオブジェクト指向言語)ではインスタンス化「させなくてはならないのか」。 これがインスタンス化させても、させなくても良いというなら分かるのですが……。 ご回答ありがとうございました!
maisumakun

2019/05/24 00:27

いろんな乱数を作り分ける状況でなければ、乱数ジェネレーターが複数必要になることはなかなかないですからね…
Chironian

2019/05/24 03:00

> その「『数列』を生成するためには何らかの記憶領域が必要」というところがよく分かりません。 ↓は非常に簡単な乱数列生成方法の解説です。 https://ja.wikipedia.org/wiki/%E7%B7%9A%E5%BD%A2%E5%90%88%E5%90%8C%E6%B3%95 もっと高度なものはいくらでもありますが、どのような方法にせよ、1つの乱数列毎にXnに当たる記憶領域が必要になります。 複数の乱数列を生成する必要がほぼありえない分野にのみ使われるような言語も存在します。そのような場合、アプリ全体でインスタンスを1つだけ持ち、そのインスタンスを影で自動生成するでしょう。「他の言語には疑似乱数を発生させる関数がある」はこれに該当すると思います。 複数の乱数列を必要とするケースが稀なのでその必要性を想像しづらく、インスタンスを理解するためには乱数はあまり適切ではなさそうです。 例えば、ファイルを開いて読み出して閉じるという処理を複数同時に行うケースも良くあると思います。 その「ファイルを開いた」時、そのファイルがどれなのか? どこまで読み出したのか?などなどの情報を記録します。オブジェクト指向言語では、ファイルAとファイルBを同時に開いた場合、それぞれファイルA用のインスタンスとファイルB用のインスタンスを確保することで、それぞれ用の記憶領域を確保するのです。 これにより、ファイルAの読み出し処理とファイルBの読み出し処理がごっちゃになることなく、適切にファイルの内容を読み出せるわけです。
AGadget

2019/05/25 01:13

//複数の乱数列を生成...ファイルの内容を読み出せるわけです 漠然とですがインスタンスの使い方が視えてきたような気がします。 インスタンス、ひいてはオブジェクト指向言語であれば並行して処理を動作させるのが容易になるということですね。 ありがとうございました!
guest

0

こういう質問を目にして思うのですが、「instanceの意味を知っていますか」。
民主党がマニフェストを言い出した頃から急にカタカタ語が増えましたが、日本語での当てはまる言葉を理解して使っているでしょうか。
classは「種類」とか「性質が似たものの集まり」です。ここには個別の体がありません。
instanceは「事例」「実例」です。似たものを集めたところから、「これ」と取り出したもの、何か1つが確定します。
1つを確定させずに、どうやってデータ操作を行うのですか?

投稿2019/05/24 00:21

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/05/24 00:26

今回の「乱数」のような場合、(質問者自身が他の回答にコメントしていますが)「乱数を生成するのになぜインスタンスが必要なのか」というところが納得できていないように思われます。
YAmaGNZ

2019/05/24 00:40

そうですね、他の方へのコメントを読む限り、全体としての「インスタンスとは?」というよりは、Randomクラスのようなあまり複数のインスタンスを使用しないようなものをインスタンス生成して使用するのは無駄なのでは?という感じがします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問