java初心者です。
今、ある問題を解くために
実行するクラス(mainクラス)
問題を読み取るクラス
問題を変換するクラス
問題を解決するクラス
に分けてプログラミングしています。
問題を読み取るクラスでは問題のルールを記録しArrayListに記録します。
そしてこの結果は他の問題を変換するクラスや解決するクラスでも使いたいデータです。
そこで問題を読み取るクラスで作ったデータを、
例えば変更があればその変更が反映されたりするように
他のクラスにも共有させたいのですが、その場合の宣言の方法が分かりません。
オブジェクト指向を理解していないからだとは思うのですが、
何か助けになる説明が欲しいと思っています。
その中のデータをpublic staticにするのが正解なのでしょうか。
宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
データをPublic staticにするのはおすすめできません。
通常変更が無いデータを扱う方法なので、プログラムの仕様が変わった時にプログラムのどこでどの順序でなんのために変更されるかがわかりづらくなるためです。
オブジェクト指向の場合、名前の通りモノ(object)を真ん中にする考え方です。
確かにReaderとか”er”をつけて名詞化してクラス名にすることも有りますが、説明からするとクラスとしてで意義すべきは”問題”だと感じてます。
例えばこんなクラスはドウでしょうか?(的外れだったらごめんなさい)
➖”問題”は”ルール”によって定義(インスタンス化)され、解決(メソッド)することよって答えを返しますが、ルールの変更(メソッド)をすることによってルールの変換をすることができます。
Java
1public class 問題{ 2 private ArraList<String> ルール; 3 public 問題(ArrayList<String> ルール){...} 4 public void ルールの変更(変換クラス 変換){...} // 変換前のルールが残ってた方がいいのなら、戻り値は返還後の"問題"インスタンスにすると良い 5 public 回答 解決(){...} // 回答はString? 6}
投稿2015/07/19 15:47
編集2015/07/19 16:15総合スコア2883
0
問題を読み取るクラスをReadクラス,変換するクラスをTranceクラス,解決するクラスをSolveクラスとすると,イメージとしては
java
1List rule = new ArrayList(); 2Read read = new Read(rule); 3Trance trance = new Trance(rule); 4Solve solve = new Solve(rule);
と,このようになるのではないでしょうか.
今,read,trance,solveは同じListであるruleを参照しています.
言うなれば「同じ箱の場所」をそれぞれが持っています.
このruleの内容を変更しても,箱の中身が変わるだけで箱の場所は変わらないので,
変換,解決時にも変更後のruleが適用されます.
投稿2015/07/19 12:40
総合スコア20649
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
書かれている通り、オブジェクト指向について、あいまいな部分があるため
作られたいもののオブジェクト指向としてのイメージがいまいちつかめていないので
どうすればいいのかわからないのではないかと思います。
今回の場合、こうイメージしてみてください。
「問題をどこからか読み取ってくる部署」
「その人が読み取った問題を変換してくれる部署」
「問題を解決して答えを出す部署」
の3つの部署があります。
その3部署がうまく連携をとって答えを導き出したいのですが
部屋も違うので、お互いに声をかけることができません。
ではどうすれば良いかというと、その3部署の間やり取りする問題が入ったMailBoxを用意してあげて
そのMailBoxを各部署に入れたり、各部署から出したりすることで、情報の連携を行います。
MailBoxは
「問題を読み取ってくる部署」が問題を詰めて
「変換する部署」が受け取って、変換した後返して
「解決する部署」が受け取って解決する
物になります。
これをコードで表すと
java
1public class Main { 2 //mainクラスは3部署が所属する会社だと思ってください。 3 public static void main(String[] args) { 4 Read read = new Read(); 5 Question question = read.read(); 6 Convert convert = new Convert(); 7 question = convert.convert(question); 8 Solve solve = new Solve(); 9 solve.solve(question); 10 } 11} 12 13/** 14* 問題が入ったMailBox 15**/ 16public class Question { 17 private List<String> questionList; 18 public void setQuestionList(List<String> questionList) { 19 this.questionList = questionList 20 } 21 public List<String> getQuestionList() { 22 return this.questionList; 23 } 24} 25 26/** 27* 問題を読み取る部署 28**/ 29public class Read { 30 public Question read() { 31 //読み取り処理 32 } 33} 34 35/** 36* 問題を変換する部署 37**/ 38public class Convert { 39 /** 40 * 戻り値はなくてもquestionの中身は書き換わりますが<br/> 41 * 動きをイメージしやすいようにあえてreturnさせています。 42 */ 43 public Question convert(Question question) { 44 //変換処理 45 return question; 46 } 47} 48 49/** 50* 問題を解決する部署 51**/ 52public class Solve { 53 public void solve(Question question) { 54 } 55}
このように実装しておくと、例えば、Readが読み取った情報は
Convertしか理解できず、Convertが変換したものしかSolveは理解できない
というのであれば、Questionのフィールドに
java
1private List<String> convertedQuestion;
のようなものを追加してあげることで、簡単にやり取りができるようになります。
また、各部署は、ほかの部署が何をやってるのかを知る必要がなく
自分たちの仕事だけこなせばいい、ということになります。
投稿2015/07/21 09:08
総合スコア297
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。