JAVAのオブジェクト指向を勉強・練習している者です。説明が下手で、さらにすっきりしない質問ですいませんが、
「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P397)「メソッドでフィールドを保護する」のところを復習を兼ねて読み直しているのですが、
メソッドの処理内容は、プログラミング段階で決定し、一度コンパイルされれば、**プログラム実行中に変化することは
ありません。一方、フィールドの値は、プログラムが動作する間に刻々と変化していきます。**そのため、動作中に
異常な値になる危険性もありえます。結果的に、不具合の多くは「フィールドに予期しない値が入る」という形で発現します。
と書かれていたのですが、ここで疑問が湧いてきたのですが、
1.なぜ、メソッドの処理内容は(プログラム)実行中に変化しないのですか?
2.フィールドの値が(プログラム)実行中に変化するのはなぜですか?
人間が(属性)値の入力ミスを防止するためのものだと思いますが、メモリ上においてどう変化するのですか?
↓
例えばフィールドに「int zaiko = 100;」と書くところを「int zaiko =-100;」と書いてしまい、それが要因で思わぬ不具合
が起きるなどの、つまり**人間のエラーを防止するためだけの役割ではないのですか?**ということです。
3.「不具合の多くは「フィールドに予期しない値が入る」という形で発現します」
と書かれているのですが、グラフィックソフトや音声編集ソフト等の市販ソフトやロボット制御などのシステム等の不具合も多くはフィールドに関する不具合なのでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
こんにちは。
「メソッドの処理内容」はプログラムそのものです。プログラム起動後にプログラムが変わるケースはかなりレアです。
「フィールド」はある種の変数です。当然ですが、変数に値を設定する度に変化することがほとんどでしょう。(同じ値を設定しない限り変化しますから。)
「不具合の多くは「フィールドに予期しない値が入る」という形で発現します」
経験的にはその通りです。NULL参照で落ちるのも本来NULLになっては行けない変数がNULLになったことによります。全ての不具合において「フィールドに予期しない値が入る」わけではないですが、比較的多いと思います。(統計を取ったわけではないので経験的にですが。)
たぶん本ばかり読んでないで、プログラムを開発した方がよいと思いますよ。
プログラミング・スキルは、ある程度 本を読んで基本を把握したら、次はプログラムを作ってその意味を体感することで身につきます。
「フィールドの値が(プログラム)実行中に変化するのはなぜですか? 」なんて疑問が発生するのは、本で読んだ知識が身についてないからですよ。
投稿2017/05/06 10:21
総合スコア23272
0
おそらくすべての混乱を引き起こしている原因は
一方、フィールドの値は、プログラムが動作する間に刻々と変化していきます。
ここにあると思われます。まるで勝手に変化するような表現になっていたので、「え、フィールドの値は変わっていくのか?」「じゃあなんでメソッドは変化しないのか?」などという思考になったのではないでしょうか。
takasima20さんのおっしゃるとおり、「変化させることができる」ものであり、KSwordOfHasteさんのご指摘通り、「入力や結果として用いるもの」で、むしろ変化させて使うものです。
RPGにおけるキャラクターのHPをイメージしてください。ゲームの進行に伴って、敵からダメージを受けて減ったり、薬を使って回復することで増えたりしますよね?そういう状態を記憶するのがフィールドの役目であるわけです。
RPGのゲーム進行だとプレイヤーの操作に合わせてその時々に変化が生じますが、実際のプログラムの処理だとプレイヤーの操作なんてありません。ただの処理をするだけならコンピュータが高速で処理します。
そのさなか、HP変化のような「フィールドの値の変化」がRPGとは比べ物にならない頻度で起こるので、「プログラムが動作する間に刻々と変化していきます。」というような表現になったのだと思います。
投稿2017/05/06 13:35
総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/08 04:16
2017/05/08 04:28 編集
0
なぜ、メソッドの処理内容は(プログラム)実行中に変化しないのですか?
Java ではそうなっている、というだけの話です。有名どころで Ruby はプログラム実行中にメソッドの処理内容を変更することができます。
フィールドの値が(プログラム)実行中に変化するのはなぜですか?
メソッドの処理内容が変化しないとすると、後はフィールドの値くらいしかプログラム実行中に変化させるところがないですね。
何も状態を変化させずにプログラムとして意味ある結果を得るのはかなり難しいでしょう。
例えばフィールドに「int zaiko = 100;」と書くところを「int zaiko =-100;」と書いてしまい...
これは「実行中の変化」ではないので例として適切ではありません。
人間のエラーを防止するためだけの役割ではないのですか?ということです。
複雑なプログラムを組むと分かりますが、「だけ」と言うほど簡単なことではないのです。
投稿2017/05/06 10:31
総合スコア936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
1.なぜ、メソッドの処理内容は(プログラム)実行中に変化しないのですか?
なぜ印刷された本の内容はいつも同じ内容なのでしょうか?
と同じ性質の質問であることを理解しましょう。
2.フィールドの値が(プログラム)実行中に変化するのはなぜですか?
「変化する」のではなく「変化させることができる」
という表現の方が誤解をうまないような気がしますね~
3.「不具合の多くは「フィールドに予期しない値が入る」という形で発現します」
見つけにくい不具合に関しては、そのような傾向にある気がします。
予期している=テストやデバッグで確認している
という前提ですが。
投稿2017/05/06 10:56
総合スコア7458
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「メソッドでフィールドを保護する」に着目して、RPG の HP で例えてみましょうか。
キャラクターを表すクラスは、いろいろな属性(=フィールド)を持っています。
- 名前
- 職業
- レベル
- 経験値
- 現在の HP
- 最大の HP
などなど。
さて、ゲーム中、HPを弄る処理はいくつもありますね。戦闘で傷つく、罠でHPを失う、薬草を使って回復する、魔法で回復する、宿屋に泊まって回復する、イベント(泉とか)で回復する、レベルアップで増加するなど。
もし現在の HP が「保護されていないフィールド」であったとしたら、上のすべての処理で、「変化したらどうなるか」(HPが0以下になったら死亡ですし、HPが最大HPを超えて回復することはないですよね)をいちいちチェックしなくてはなりません。
ですがメソッド(HPを増減させる)で保護されたフィールドであれば、その処理をすべて「HPを増減させるメソッド」の中にまとめることができます。となれば、「どんな理由でHPを変化させたとしても、正しい処理が行われる」のです。
これはクラスが複雑になればなるほど効果的に効いてきます。
投稿2017/05/08 02:16
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
一応書いておきますけど、**勝手に値が変化するわけではありません。**ソースコードの記述の通りに値が書き換わります。これはほとんどはプログラマの意図に基づくものです。
とはいえ、結局人間の作るものである以上、意図しないミス(バグ)がまざることも多々あります。そこで、コンパイル時に確定するメソッドを窓口としてフィールド値を変更する作り方が推奨されています。この方法ならば、フィールドの値の書き換え命令は必ず特定のプログラムの箇所を通るわけで、ミスを発見しやすく設計することができます。
なお、「メソッド(プログラムの命令列)はコンパイル時に確定する」というのはjavaの仕様です。他のプログラム言語ではこの限りではありません。古くは「自己書き換えプログラム」と呼ばれる、命令列自体を書き換えるプログラミングも行われておりました。また、自己解凍型の圧縮プログラムデータとして現在も一部で使用されています(ただし、ウイルスにも悪用されておりこれだけでワクチンソフトに検知されることがあります)
投稿2017/05/06 14:11
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
チューリングさんとかノイマンさんという偉い人たちが計算モデルをそのように考えてみんなが「それがいいね」と認めたから・・・という答えが思い浮かびました。
今でこそプログラマーの誰もが当たり前のこととして考えていますが、計算する機械をどうやって作ればいいかということを「データ」に「ある決まったアルゴリズム」を適用して答えとしての「データ」を得るという考え方になったのは上に挙げたような計算機の基礎的な仕組みに貢献した数学者の先生が「そうするのがいいよ」と言って広めてくれたからだと思います。
メソッド=アルゴリズム=計算中は固定です。
フィールドや変数=データ=入力や結果として用いる用いるもの一般で、計算中に刻々と変化します。
ちなみに小学校で我々が学ぶ足し算ですが、ノートの升目に数字を「データ」として書き込み、一の桁からある規則に従って答えの欄に結果の「データ」を書き込んでいき答えを得るということも、計算機が内部で「与えられた数(=データ)に足し算(というアルゴリズム)を適用して結果を得る」のと同じことと捉えることができます。計算機もそういうやりかたと同様の考え方で作られているのは自然なことに感じます(偉い人が仕組みを考えてそれを学んだから後知恵でそういう連想ができるだけかも知れません)。
しかし・・・この説明は質問者さんを満足させるでしょうか?なんとなくそうならない気がします。そんな根源的な質問をするより、実際にプログラムコードを書く経験を積んで自分で実感した方がずっと手っ取り早いような気もしてきます。
投稿2017/05/06 11:04
総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。