前提・実現したいこと
独学でオブジェクト指向を学習している者ですが、依存関係をなくそうとして、依存先のクラスの命令を受けて動くようにクラスを作っています。そうすると、命令を受けるだけで、逆に、命令を出したいようなときに、どうすればよいかわからなくなってしまうのです。例えば、サッカーチームの監督がいて、監督(メインクラス)が、選手(小クラス)に命令をするようにクラスを作ったほうがいいと聞きました。(間違って捉えているのかもしれません。)すると、監督が選手の状況を感知して、他の選手に命令することができても、選手同士で命令(攻撃)をするのができない気がするのです。もっと複雑な構造になってくるとなおさらです。
今、日(Day)をデータとして持っていてクラスがあって、日ごとに予定(Plan)と完了したこと(CompletePlan)があるとします。そのような構造で、Planから他のDayにCompletePlanを追加する方法を知りたいです。(※PlanとCompletePlanはした量(didAmount)や名前(todoName)など情報を共有しているので、絶対Planから追加するとします。)
該当のソースコード
public class Main{ static public void main(String[] args){ new Schedule(); } } class Schedule{ public Day[] days; public Schedule(){ days = new Day[365]; //365日生成 for(int i = 365;i > 0;i--){ days[i] = new Day(i); } } } class Day{ public ArrayList<Plan> plans; public ArrayList<CompletePlan> completePlans;//日ごとに格納 public int date; public Day(int date){ this.date = date } //ユーザーからの入力の関数から呼ばれる(actionPerformed()とか) public void AddPlan(String name, int willDoAmount){ plans.add(new Plan(name, willDoAmount); } public void ShowPlans(){ //プランを表示 } public void ShowCompletePlans(){ //完了したプランを表示 } public void AddCompletePlan(CompletePlan comp){ completePlans.add(comp); } } class Plan{ public String todoName; public int willDoAmount; public ArrayList<CompletePlan> completes;//プランごとに格納 //↑このデータは構造は違えど同じデータが格納されているのが気になります public Plan(String todoName, int willDoAmount){ this.todoName = todoName; } //ユーザーからの入力の関数から呼ばれる(actionPerformed()とか) public void AddCompletePlan(int date, int amount){ //ここで、DayにCompletePlanを追加したいが、取得方法がわからない completes.add(new CompletePlan(amount, this.name)); } //リストにあるCompletePlanからdidAmountの総数から完了したかどうか算出します public boolean isComplete(){ int didAmount = 0; for(CompletePlan comp : completes){ didAmount += comp.didAmount; } if(didAmount >= willDoAmount){ return true; } return false; } } class CompletePlan{ String todoName; int didAmount; public CompletePlan(int didAmount, String todoName){ this.todoName = todoName; this.didAmount = didAmount; } }
試したこと
これに対して、2つ方法を考えました。
1.Dayを生成するときに、一緒に引数として、Scheduleも入れてアクセスできるようにする
2.ScheduleSystemのようなクラスを作って、Scheduleを格納しておく。(Scheduleは一回しか作らない)
この2つを考えたのですが、1は依存関係が循環してしまいそうで、2は回りくどくて効率的ではないと思うので、どちらも適切だとは思えないのです。
どうか、どんなことでも良いので、なにかヒントを頂ければ幸いです。
補足情報(FW/ツールのバージョンなど)
今はJavaを学習している途中です。独学なため、他の人のソースも、例題みたいなもの以外見たことがないので、これであっているのかよくわからない次第です。
###修正・補足
助言を頂き、ありがとうございました
しかし、質問するときに、コードを省いてしまった点や説明不足の点がありました。
まず、CompletePlanはPlanから生成します。(Dayから生成すると、Planに格納ができなくなると思います。なぜなら、Planの日付とCompletePlanの日付が違う場合があるからです。予定の日と同じ日するとは限りません。)
また、CompletePlanを改めてクラスとして作ったのは(初めはisCompleteで作っていたのですが)何回かに分けて予定を実行する事を考えたからです。
以上の点が抜けていました。説明が下手で、すみませんでした。
###追加質問
このようにクラスを作ると、
1.DayでCompletePlanを生成すると、Planに格納できなくなる
2.PlanでCompletePlanを生成すると、Dayを取得できなくなる
(※予定の日と完了した日は異なる場合があります)
3.DayにもPlanにもCompletePlanを格納してしまっている
という問題が出てきてしまいました。
これを解決する方法がありましたら、ご教授願います。
もしくは、根本的なことから間違っていますでしょうか。
汚いコードですみません。
回答2件
あなたの回答
tips
プレビュー