Misa031
@Misa031

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

クラスとメソッド

Java初心者です。
クラスとメソッドを研修で学習しています。

解決したいこと

新入社員クラスの「操作」のところで、{聞いた回数}と{研修担当.教えた回数}を+1とする というコードを書きたいのですが、{研修担当.数えた回数}をどのように書けば良いか分からないので、ご教示いただきたいです。

発生している問題・エラー

研修担当.png
新入社員.png

■クラス詳細
研修担当クラス
属性
・名前(自分の名前)
・教えた回数(初期値0)
操作
・回数確認:「{名前}は{教えた回数}回、新入社員に教えた」と出力

新入社員クラス
属性
・名前(自分の名前)
・学習(javaなどの学習しているものの名称)
・聞いた回数(初期値0)
操作
・研修担当に質問:(引数に、研修担当)「{名前}は{研修担当.名前}に{学習内容}を教えてもらった」と出力し、{聞いた回数}と{研修担当.教えた回数}をそれぞれ+1する
・回数確認:「{名前}は{聞いた回数}回、研修担当に質問した」と出力

0

1Answer

コードはMarkdown記法を使って直接記載していただけるとありがたいです。
コピーできるので、検証したり回答に用いたりすることが容易になります。
長くなるなら「Details - 折りたたみ」も出来るので試してみてください。

回答例1

まずは、単純な実現方法です。
教えた回数lectureCountTraineeクラスのメンバ変数なので、Traineeクラスのインスタンスを操作することで回数を増やすことができます。

public class Trainee {
-    public void question(String trainerName) {
+    public void question(Trainer trainer) {
-       System.out.println("「" + this.traineeName + "は" + trainerName + "に" + this.studies + "を教えてもらった」");
+       System.out.println("「" + this.traineeName + "は" + trainer.trainerName + "に" + this.studies + "を教えてもらった」");
       this.questionCount += 1;
+       trainer.lectureCount += 1;
    }
}

ただし、あくまで「出来る」というだけで、設計としては良いものではありません。
数えた回数は研修担当が管理しているものですから、カウントアップのルールは研修担当が決めたいはずです。しかし、上のコード例では新入社員が操作することが出来てしまいます。

public class Trainee {
    public void question(Trainer trainer) {
       trainer.lectureCount += 1000; // 🤔
    }
}

回答例2

回答例1の問題をふまえて少し変更してみます。
Trainerクラスにanswerメソッドを追加して、そこで数えた回数をカウントアップします。

public class Trainer {
-    int lectureCount = 0;
+    private int lectureCount = 0;

+    public void answer() {
+        System.out.println("「" + this.trainerName + "は新入社員の質問に答えた」");
+        lectureCount += 1;
+    }
}
public class Trainee {
    public void question(Trainer trainer) {
       System.out.println("「" + this.traineeName + "は" + trainer.trainerName + "に" + this.studies + "を教えてもらった」");
       this.questionCount += 1;
-       trainer.lectureCount += 1;
+       trainer.answer();
    }
}

このようにすることで、研修担当は教えたときのアクションを管理できます。
カウントアップのルールが変更になっても、新入社員が気にする必要はありません。

研修ということですので、もしかしたら回答例2は踏み込んだ内容だったかもしれません。
その場合は細かいことは忘れて結構ですが、実際に開発するときは変更に強い設計を考える必要があります。

2Like

Comments

  1. @Misa031

    Questioner

    お返事が遅れてしまい、そしてお手数をおかけしてしまい申し訳ございません。
    かしこまりました。
    次からはコードをなるべく打ち込むように致します。
    answerメソッドを研修担当クラスでつくり、新入社員クラスでtrainer.answer()とすることで、研修担当が教えた回数をカウントできるという事なのですね。
    コードの書き方等、まだまだ知らない事が多いので、勉強になります。
    ありがとうございます。

    質問させていただきたいのですが、
    int lectureCountの前に「private 」がありますが、何故「private」をつけているのでしょうか?

    もしお時間あれば教えていただけますでしょうか?
  2. 回答例2もあくまで例の1つです。
    設計の良し悪しは簡単に決められないものですし、学習レベルではなかなか効果を体感できないものです。
    ひとまず「実務レベルで回答例1では不十分」という点が伝われば十分です。段階に応じて学習していけば良いと思います。

    privateを付けることにより外部から直接アクセスすることが出来なくなりますが、それによって複雑さを軽減させることが目的です。
    現状だと回答例1で示したように外部から操作できてしまいます。今はたった1箇所しかないので、カウントアップの流れを把握し、間違いの修正や変更することが容易です。しかし、実際の製品は今回の比較にならないコード量なので、"どこから" "どのような"操作しているのか把握することが非常に困難になります。
    せっかくクラスに分けて整理したのに、publicを多用すると穴だらけの状態になり、実質ひとつのごちゃごちゃした塊と同じ状態です。
    そういった状態を防ぐために不要なアクセスがされないようprivateにしました。

    (このように設計について説明しようとすると非常に長くなり、”実際の製品”というイメージが難しいものを扱うので要領を得ないかもしれませんが・・・)
  3. @Misa031

    Questioner

    お返事くださりありがとうございます。
    ひとまずは回答例1では不十分である、という事を覚えておきます。

    今までpublicをずっと使ってきたので、privateの重要性をあまりわかっていませんでした。
    今学習しているものよりもさらに膨大なコードにこれから先挑むとなると不安ですが、今はできるところから少しずつ学習し、理解していけたらと思います。

    ありがとうございます。

Your answer might help someone💌