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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

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

オブジェクト指向

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

Q&A

解決済

7回答

2871閲覧

フィールドの値がプログラムが動作する間に刻々と変化していく理由は?

mr0237

総合スコア164

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

オブジェクト

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

オブジェクト指向

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

0グッド

0クリップ

投稿2017/05/06 10:07

JAVAのオブジェクト指向を勉強・練習している者です。説明が下手で、さらにすっきりしない質問ですいませんが、
「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P397)「メソッドでフィールドを保護する」のところを復習を兼ねて読み直しているのですが、

メソッドの処理内容は、プログラミング段階で決定し、一度コンパイルされれば、**プログラム実行中に変化することは
ありません。一方、フィールドの値は、プログラムが動作する間に刻々と変化していきます。**そのため、動作中に
異常な値になる危険性もありえます。結果的に、不具合の多くは「フィールドに予期しない値が入る」という形で発現します。

と書かれていたのですが、ここで疑問が湧いてきたのですが、

1.なぜ、メソッドの処理内容は(プログラム)実行中に変化しないのですか?

2.フィールドの値が(プログラム)実行中に変化するのはなぜですか?
人間が(属性)値の入力ミスを防止するためのものだと思いますが、メモリ上においてどう変化するのですか?

例えばフィールドに「int zaiko = 100;」と書くところを「int zaiko =-100;」と書いてしまい、それが要因で思わぬ不具合
が起きるなどの、つまり**人間のエラーを防止するためだけの役割ではないのですか?**ということです。

3.「不具合の多くは「フィールドに予期しない値が入る」という形で発現します」
と書かれているのですが、グラフィックソフトや音声編集ソフト等の市販ソフトやロボット制御などのシステム等の不具合も多くはフィールドに関する不具合なのでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答7

0

こんにちは。

「メソッドの処理内容」はプログラムそのものです。プログラム起動後にプログラムが変わるケースはかなりレアです。
「フィールド」はある種の変数です。当然ですが、変数に値を設定する度に変化することがほとんどでしょう。(同じ値を設定しない限り変化しますから。)

「不具合の多くは「フィールドに予期しない値が入る」という形で発現します」

経験的にはその通りです。NULL参照で落ちるのも本来NULLになっては行けない変数がNULLになったことによります。全ての不具合において「フィールドに予期しない値が入る」わけではないですが、比較的多いと思います。(統計を取ったわけではないので経験的にですが。)


たぶん本ばかり読んでないで、プログラムを開発した方がよいと思いますよ。
プログラミング・スキルは、ある程度 本を読んで基本を把握したら、次はプログラムを作ってその意味を体感することで身につきます。

「フィールドの値が(プログラム)実行中に変化するのはなぜですか? 」なんて疑問が発生するのは、本で読んだ知識が身についてないからですよ。

投稿2017/05/06 10:21

Chironian

総合スコア23272

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

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

0

おそらくすべての混乱を引き起こしている原因は

一方、フィールドの値は、プログラムが動作する間に刻々と変化していきます。

ここにあると思われます。まるで勝手に変化するような表現になっていたので、「え、フィールドの値は変わっていくのか?」「じゃあなんでメソッドは変化しないのか?」などという思考になったのではないでしょうか。
takasima20さんのおっしゃるとおり、「変化させることができる」ものであり、KSwordOfHasteさんのご指摘通り、「入力や結果として用いるもの」で、むしろ変化させて使うものです。

RPGにおけるキャラクターのHPをイメージしてください。ゲームの進行に伴って、敵からダメージを受けて減ったり、薬を使って回復することで増えたりしますよね?そういう状態を記憶するのがフィールドの役目であるわけです。

RPGのゲーム進行だとプレイヤーの操作に合わせてその時々に変化が生じますが、実際のプログラムの処理だとプレイヤーの操作なんてありません。ただの処理をするだけならコンピュータが高速で処理します。
そのさなか、HP変化のような「フィールドの値の変化」がRPGとは比べ物にならない頻度で起こるので、「プログラムが動作する間に刻々と変化していきます。」というような表現になったのだと思います。

投稿2017/05/06 13:35

swordone

総合スコア20651

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

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

haru666

2017/05/08 05:04 編集

ゲームのHP管理は良い例と言えますね。勝手ではありますが、コメント欄を借りて例を追記しておきたいと思います。 HPを数値型(short)で宣言したとします。shortの範囲は-32,768 ~ 32,767ですが(≒プラスマイナス3万)、ここに何も考えずに4万ダメージを計上しようとしたらどうなるでしょうか。値がオーバーフローを起こしHPはプラス2万になってしまうかもしれません。フィールドに対して直接計算を行っていると、プログラムは「処理を挟む余地」がありません。 人間のエラーは入力ミスだけではありません。「ロジックのエラー」も当然存在します。そして、殆どの優れた技術者が出会うエラーは「ロジックのエラー」です。人間の入力ミスによるエラーに出会うのはしばしばありますが、対処忘れがほとんどです。私たちはそのような入力を防ぐようにプログラミングすることができます。 具体的にHPの変化を考えてみます。初心者はキャラクターオブジェクトのHPを変数として公開し、ここに直接計算結果を反映しがちですが、この方法には問題があります。 「4回攻撃の派手な技を作ろう!」「攻撃力があがれば最大ダメージは9999だ!」として、HPフィールドを直接操作して上手に管理できるでしょうか。HPを4万減算しようとしてオーバーフローを起こし、HPが2万に増えてしまうかもしれません。はたまた、1万を超えるダメージを通してしまうかもしれません。 ゲームにおいて、ダメージの処理は人が入力するものではありません。ゲームでは意思決定をするだけですが、ゲーム開発者の考慮不足が含まれていると変な値になってしまうことがあります。プログラムの機能の組み合わせによって想定外の問題を引き起こします。 そのため、ダメージの処理をメソッドの形にし「HPが0を切ったらダメージ処理は無視する」「1万を超えるダメージは9999にする。」という機能をつければ、そのようなミスは防ぐことができます。 メソッドは、問題を防ぐために使うことのできる接合点になります。フィールドの直接操作には後から介入することができませんが、メソッドであれば処理を足すことができますから、オブジェクトのフィールドを外部公開して直接操作することは今やほとんどありません。「メソッドでフィールドを保護する」理由はそんなところです。
swordone

2017/05/08 04:16

「なぜ変化するのか?」からだいぶ離れたように思いますが…
haru666

2017/05/08 04:28 編集

大元は「メソッドでフィールドを保護する」から沸いた疑問1~3なので、変化は「させる」ので、具体例も必要ではないかなと思いまして。とすると、直接的回答でもないし1個投稿するのもなあと思いました。
guest

0

なぜ、メソッドの処理内容は(プログラム)実行中に変化しないのですか?

Java ではそうなっている、というだけの話です。有名どころで Ruby はプログラム実行中にメソッドの処理内容を変更することができます。

フィールドの値が(プログラム)実行中に変化するのはなぜですか?

メソッドの処理内容が変化しないとすると、後はフィールドの値くらいしかプログラム実行中に変化させるところがないですね。
何も状態を変化させずにプログラムとして意味ある結果を得るのはかなり難しいでしょう。

例えばフィールドに「int zaiko = 100;」と書くところを「int zaiko =-100;」と書いてしまい...

これは「実行中の変化」ではないので例として適切ではありません。

人間のエラーを防止するためだけの役割ではないのですか?ということです。

複雑なプログラムを組むと分かりますが、「だけ」と言うほど簡単なことではないのです。

投稿2017/05/06 10:31

koko_u

総合スコア936

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

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

0

1.なぜ、メソッドの処理内容は(プログラム)実行中に変化しないのですか?

なぜ印刷された本の内容はいつも同じ内容なのでしょうか?
と同じ性質の質問であることを理解しましょう。

2.フィールドの値が(プログラム)実行中に変化するのはなぜですか?

「変化する」のではなく「変化させることができる」
という表現の方が誤解をうまないような気がしますね~

3.「不具合の多くは「フィールドに予期しない値が入る」という形で発現します」

見つけにくい不具合に関しては、そのような傾向にある気がします。
予期している=テストやデバッグで確認している
という前提ですが。

投稿2017/05/06 10:56

takasima20

総合スコア7458

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

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

0

「メソッドでフィールドを保護する」に着目して、RPG の HP で例えてみましょうか。

キャラクターを表すクラスは、いろいろな属性(=フィールド)を持っています。

  • 名前
  • 職業
  • レベル
  • 経験値
  • 現在の HP
  • 最大の HP

などなど。
さて、ゲーム中、HPを弄る処理はいくつもありますね。戦闘で傷つく、罠でHPを失う、薬草を使って回復する、魔法で回復する、宿屋に泊まって回復する、イベント(泉とか)で回復する、レベルアップで増加するなど。
もし現在の HP が「保護されていないフィールド」であったとしたら、上のすべての処理で、「変化したらどうなるか」(HPが0以下になったら死亡ですし、HPが最大HPを超えて回復することはないですよね)をいちいちチェックしなくてはなりません。
ですがメソッド(HPを増減させる)で保護されたフィールドであれば、その処理をすべて「HPを増減させるメソッド」の中にまとめることができます。となれば、「どんな理由でHPを変化させたとしても、正しい処理が行われる」のです。

これはクラスが複雑になればなるほど効果的に効いてきます。

投稿2017/05/08 02:16

tacsheaven

総合スコア13703

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

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

0

一応書いておきますけど、**勝手に値が変化するわけではありません。**ソースコードの記述の通りに値が書き換わります。これはほとんどはプログラマの意図に基づくものです。

とはいえ、結局人間の作るものである以上、意図しないミス(バグ)がまざることも多々あります。そこで、コンパイル時に確定するメソッドを窓口としてフィールド値を変更する作り方が推奨されています。この方法ならば、フィールドの値の書き換え命令は必ず特定のプログラムの箇所を通るわけで、ミスを発見しやすく設計することができます。

なお、「メソッド(プログラムの命令列)はコンパイル時に確定する」というのはjavaの仕様です。他のプログラム言語ではこの限りではありません。古くは「自己書き換えプログラム」と呼ばれる、命令列自体を書き換えるプログラミングも行われておりました。また、自己解凍型の圧縮プログラムデータとして現在も一部で使用されています(ただし、ウイルスにも悪用されておりこれだけでワクチンソフトに検知されることがあります)

投稿2017/05/06 14:11

HogeAnimalLover

総合スコア4830

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

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

0

ベストアンサー

チューリングさんとかノイマンさんという偉い人たちが計算モデルをそのように考えてみんなが「それがいいね」と認めたから・・・という答えが思い浮かびました。

今でこそプログラマーの誰もが当たり前のこととして考えていますが、計算する機械をどうやって作ればいいかということを「データ」に「ある決まったアルゴリズム」を適用して答えとしての「データ」を得るという考え方になったのは上に挙げたような計算機の基礎的な仕組みに貢献した数学者の先生が「そうするのがいいよ」と言って広めてくれたからだと思います。

メソッド=アルゴリズム=計算中は固定です。
フィールドや変数=データ=入力や結果として用いる用いるもの一般で、計算中に刻々と変化します。

ちなみに小学校で我々が学ぶ足し算ですが、ノートの升目に数字を「データ」として書き込み、一の桁からある規則に従って答えの欄に結果の「データ」を書き込んでいき答えを得るということも、計算機が内部で「与えられた数(=データ)に足し算(というアルゴリズム)を適用して結果を得る」のと同じことと捉えることができます。計算機もそういうやりかたと同様の考え方で作られているのは自然なことに感じます(偉い人が仕組みを考えてそれを学んだから後知恵でそういう連想ができるだけかも知れません)。

しかし・・・この説明は質問者さんを満足させるでしょうか?なんとなくそうならない気がします。そんな根源的な質問をするより、実際にプログラムコードを書く経験を積んで自分で実感した方がずっと手っ取り早いような気もしてきます。

投稿2017/05/06 11:04

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問