この人頭いいなと思ったエピソード

お世話になります。Java勉強中です。

クラスを別のファイルに分けて、
1.入力受付クラス
2.処理クラス

と分けようとしているのですが、(1)で、
String tmpFirstName = "";
while(!Validation.requiredCheck(tmpFirstName)){
tmpFirstName = JOptionPane.showInputDialog(null, "苗字を入力", "苗字", JOptionPane.INFORMATION_MESSAGE);}

(2)で、
private String firstName
//コンストラクタ
ShortAddress(String firstName){
this.firstName = firstName;}
//ゲッター
public String getFirstName(){
return firstName;}

とした場合に、どういう論理で(2)に情報が受け渡されるのかよくわかりません。ここで言うと、
tmpFirstName と firstName の関連のしくみが分かりません。

他の人のコードを見ても、『入力順に受け付けているの?』ぐらいにしか。

仮に、『10個の入力と、対になる10個のメソッド』があったとして、一番最初の入力を(任意の)10番目のメソッドで処理するにあたり(出来るんだろうと思います)、どういった手続き、関連づけが必要なのか、そもそも必要があるのか教えてください。どうか宜しく。

m(_ _)m れざ(ちょっと壷状態)

A 回答 (3件)

簡単なカプセル化について説明します。


カプセル化とは、中身が隠蔽されているためプロパティを
直接参照できないようなプログラムを指すと思って下さい。

たとえば以下のような構成にしたとします。
1.データの保持クラス(DataClass)
2.入力クラス(InputClass)
3.処理クラス(ProcessClass)

データの保持クラスには private なプロパティを設定します。

private String firstName;
private String familyName;
private int age;

これに対してgetterメソッドとsetterメソッドを作成します。
eclipseであれば右クリック→ソース→getter,setterの作成です。

// firstNameに対するGetter
public String getFirstName() {
return firstName;
}

// firstNameに対するSetter
public void setFirstName(int firstName) {
this.firstName = firstName;
}

firstNameはデータの保持クラスのprivate変数なので、
変数を直接操作できるのはデータの保持クラスだけですね。

他のクラスからfirstNameに値を設定したいときは
setFirstNameメソッドを使用し、値を取得したいときは
getFirstNameメソッドを使用することで入出力を可能とします。

では入力クラスの処理です。
入力クラスでは質問者様のソースコードのように、
任意に入力させるものとします。
名前入力の結果を変数 tmpFirstName にセットしたとしましょう。

データの保持クラスのインスタンスを生成します。

DataClass dataClass = new DataClass();

ここでデータの保持クラスの setFirstName を実行します。
引数には tmpFirstName を指定します。

dataClass.setFirstName(tmpFirstName);

これでデータの保持クラスの firstName には、setFirstName経由で
tmpFirstName の値がセットされたことになります。

同様にsetFamilyName、setAge …と設定していきます。
その後、処理クラスにデータの保持クラスのインスタンスを渡します。

次に処理クラスです。
処理クラスでは入力されたfirstNameの値が欲しいので、
データの処理クラスから値を取り出すことになります。

String tmpFirstName = dataClass.getFirstName();

これでtmpFirstNameに、データの保持クラスのfirstNameの値が
セットされるわけです。

いかがでしょうか。

この回答への補足

Splatter さん、早速の返答ありがとうございます!ゲッターとセッターは名前だけ知っていましたが、使い方はよく分かっていませんでした(てか、まだすべて手探り状態です。)

仕組みについてもう少し見えてきたように思います。実践をしないといけないので、頂いたコメントを参考に、あと数日のたくってみます。

結果報告しますので、質問は締めないでおきます。(^^)

補足日時:2008/12/17 10:38
    • good
    • 0
この回答へのお礼

このページにあがいた結果へのリンクを上げておきました。(他人様のを少し加工しただけです。しかも機能低下してるし(汗)) いちおうコンパイルは通ります。

検証の方法がいまいち掴めず、結局カプセル化を「使いこなす」には至りませんでしたが、ゲッター、セッターの役目や、入力されたデータがどういう経路を辿って、どういう処理を受け、最終的にどう処理されるのか、おおよそ見えるようになってきました。保持、入力、処理クラスの分別も今まで漠然と理解していた事に輪郭がついた感じで「おおっそうか」という感じです。

頂いた説明は簡潔で分かりやすく非常に役に立ったと思います。どうも有り難うございました。(^^)

お礼日時:2008/12/20 05:07

http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%97% …

↑の例とかが理解しやすいかと。

この回答への補足

リンク有り難うございます(^^)。Wikiって手もありましたか。「焙煎JAVA」さんとか漁ってたんですが、私の実践にはちと高度過ぎて唸っていた所なので、こっちのほうが噛み砕いて説明してある感じで良いですね。

事後報告したいので質問は締めないでおきます。でも死にそう。。最初の方は楽勝だったのに(泣)。

補足日時:2008/12/18 05:09
    • good
    • 0
この回答へのお礼

…結局こんなんなりますた。激しく玉砕しています。課題の要項にも添ってないし。でも一応コンパイルするので、よしとしました。助言頂き有り難うございました。(^^)

構成は以下の通りです。

入出力-ドライバ
http://kinugosiigomadowff.arrow.jp/miscsc/WK5/WK …

検証
http://kinugosiigomadowff.arrow.jp/miscsc/WK5/Va …

格納1
http://kinugosiigomadowff.arrow.jp/miscsc/WK5/St …

格納2 ([1]の拡張)
http://kinugosiigomadowff.arrow.jp/miscsc/WK5/St …

お礼日時:2008/12/20 04:50

ソースコードが省略されすぎていてなにやってるのかわからんちんです。



私にもどういう関連があるのかこのコードからでは読み取れません。

この回答への補足

ProKaseifuさん、またお世話になります(^^;)

私が??なのはカプセル化で入力と処理の分離の仕方が根本的に分かっていないという(事に最近やっと気付いた)。

入力用のクラスは
System.out.println("区画名を入力");
String streetNum = usrIn.readLine();
でも、JOptionpaneでも作れるのですが、さて、受け付けた情報をどうやってほかのクラスに受け渡すのか(仕組み)、という部分がポカッと抜けているので、カプセル化を厳しく言われ始めて、すっかりハマってしまった次第です。

参考コードは他人様の借り物なんですが、本来は4つのクラスファイルからなる物で、

1.入力受け付け(ドライバ)
2.バリデーション
3.住所録1
4.継承"super"を使った住所録2

という構成になってます。

以下はそれをひとまとめにしたページです(長いです&コメントが英語混じり)。
http://kinugosiigomadowff.arrow.jp/miscsc/Joel-C …

この例は私には高度すぎて流用できないのですが、クラス事の仕分けがきちんとされているようなので参考例として拝借しました。が、いったん入力された情報がどういう経路を辿るのか、部分的にしか理解できないのです。

補足日時:2008/12/17 10:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!