2016-04-10 8 views
-1

Javaを使用するパッケージでは、4つのファイルを使用しています。最初のものは、StudentModel.javaを言う、もう一つは言うstudentView.java、第studentController.java及び第studentMain.javaクラスオブジェクトに入っているArraylistの冗長性

は今studentMain.javaの構造は次のとおりです。

package student; 

import java.util.*; 



public class studentMain{ 
    public static void main(String[] args) { 
    menu(); 
} 
    public static void menu(){ 
    Scanner sc = new Scanner(System.in); 
     //fetch student record based on his roll no from the database 
     studentModel model = new studentModel(); 
     //Create a view : to write student details on console 
     studentView view = new studentView(); 
    ArrayList<studentController> list = new ArrayList <studentController>(); 
    int choice=1,roll1=0;boolean flag=false; 
    studentController controller; 
    while(true){ 
     System.out.println("\n************* Main Menu ********************\n"); 
     System.out.println("Enter 1 to input student"); 
     System.out.println("Enter 2 to display all students"); 
     System.out.println("Enter 3 to display a particular student"); 
     System.out.println("Enter 4 to remove a particular student"); 
     System.out.println("Enter 5 to Update the marks of a student"); 
     System.out.println("Enter 6 to exit program"); 
      System.out.println("\n*********************************************\n"); 
     System.out.println("Enter choice : "); 
     choice=sc.nextInt(); 
     switch(choice){ 

      case 1 : 
       list.add((new studentController(model,view)).input()); 
        break; 

      case 2 :controller = new studentController(model,view); 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        controller.show_for_all(); 
       } 
       break; 
       case 3 :flag=false; 
        controller= new studentController(model,view); 
       System.out.println("\nEnter Roll Number of Student :"); 
       roll1=sc.nextInt(); 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        if(controller.compare_roll(roll1)){ 
         controller.show(); 
         flag=true; 
        break; 
        } 
       } 
       if(!flag) 
        System.out.println("Roll Number Does NOT exist !!"); 
       break; 
      case 4:controller = new studentController(model,view); 
       System.out.println("\nEnter Roll Number of Student :"); 
       roll1=sc.nextInt(); 
       flag=false; 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        if(controller.compare_roll(roll1)){ 
         list.remove(i); 
         flag=true; 
         break; 
        } 
       } 
       if(!flag) 
        System.out.println("Roll Number Does NOT exist !!"); 
       break; 
      case 5: 
       controller = new studentController(model,view); 
       System.out.println("\nEnter Roll Number of Student :"); 
       roll1=sc.nextInt(); 
       flag=false; 
       for(int i=0;i<list.size();i++){ 
        controller=list.get(i); 
        if(controller.compare_roll(roll1)){ 
         controller.change_marks(); 
         flag=true; 
         break; 
        } 
       } 
       if(!flag) 
        System.out.println("Roll Number Does NOT exist !!"); 
       break; 
      case 6: 
       System.out.println("Exiting !!!"); 
       System.exit(0); 
       break; 
      default: 
       System.out.println("Wrong Input !!"); 
       break; 
      } 
     } 
    } 
} 

そしてstudentController.javaの構造は次のとおりです。

package student; 

import java.util.*; 
import java.io.*; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 

public class studentController { 
      private studentModel model; 
      private studentView view ; 

public studentController(studentModel model, studentView view){ 
    this.model = model; 
    this.view = view; 
} 

public void show(){ 
    this.view.display(this.model); 
} 
public void show_for_all(){ 
    this.view.display_for_all(this.model); 
} 
public void input(){ 
     String name;//name of student 
     int roll; //roll of student 
     String date;   
     int marks[]=new int [6]; 
     String sub[]=new String[6]; 
     Scanner s = new Scanner(System.in); 
     int m,j;String s1;int fg=0; 
     System.out.println("\t\t ENTER DETAILS OF STUDENT"); 
     System.out.print("Enter name:"); 
     name=s.nextLine(); 

     /*to check if a string contains digits or not*/ 
     for(int h=0;h<name.length();h++){ 
     if(name.charAt(h)=='1' || name.charAt(h)=='2'||name.charAt(h)=='3'||name.charAt(h)=='4'||name.charAt(h)=='5'||name.charAt(h)=='6'||name.charAt(h)=='7'||name.charAt(h)=='8'||name.charAt(h)=='9'){ 
      fg=1; 
      System.out.println("name contains digits enter correctlty"); 
      break; 
     } 
    } 
    if(fg!=1){ 
     System.out.print("Enter roll no:"); 
     roll=s.nextInt(); 
     System.out.println(); 
     /*system generated date*/ 
     SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//dd/MM/yyyy 
      Date now = new Date(); 
      date = sdfDate.format(now); 
     System.out.println("Admission Date : "+date); 
     System.out.println("Enter Subject and marks :"); 
     /*entering the marks of the subjects*/ 
     for(j=0;j<5;j++){ 
      s1=s.next(); 
      m= s.nextInt(); 
      if(m<0 || m>100){   //marks should not > 100 or <0 
       System.out.println("wrong marks entered");break;} 
      sub[j]=s1; 
      marks[j]=m; 
      //total=total+m; 
     } 
     model.set_name(name); 
     model.set_roll(roll); 
     model.set_date(date); 
     model.set_sub_marks(marks,sub); 
     model.set_total(); 
     model.set_cgpa(); 
    } 

    } 
     public boolean compare_roll(int rol){ 
      if(this.model.get_roll()==rol) 
       return true; 
      else 
       return false; 
      } 
     /*function to change the marks of any of the subjects of a particular student*/ 
    public void change_marks(){ 
     int f,sub_code,new_marks; 
     System.out.println("enter no of subjects whose marks needs to be changed"); 
     Scanner s = new Scanner(System.in); 
     f=s.nextInt(); 
    while(f!=0){ 
     System.out.println("Enter subject codes : ");  
     sub_code=s.nextInt(); 
     if(sub_code>=1 && sub_code<=5){ 
      System.out.println("Enter new marks"); 
      new_marks=s.nextInt(); 
      if(new_marks>=0&&new_marks<101) 
      model.change_marks(sub_code,new_marks); 
      else 
      System.out.println("Marks OUT of Range of 0 to 100"); 
      } 
     else 
      System.out.println("Wrong subject code entered"); 
     f--; 
     } 
    } 


}; 

データのための新しいエントリを入力しながら、私は最初に入り口学生のためにあります。 なし問題私は第二エントリのために、学生の詳細を入力しています.When詳細最初エントリのための学生のを削除.AND冗長性などがあるなっています2番目の生徒の詳細が最初の生徒にコピーされています。これは、第一のエントリが正しく入力されて保存されたことを意味し

Details of the First Student Printed

:私はスクリーンショットを含めていますより良い説明のために

Printing the details of all the students

あなたは最終スクリーンショットが表示された場合、あなたはこのように冗長性が第一の生徒の詳細はsecond.Andの詳細に置き換えられていることがわかります。

+1

問題を示すための最小限の例を作成してください。 –

+0

この場合、MVCはロジックを大幅に複雑にします。コントローラを不適切に使用しています。ここにはコントローラが1つだけあります。この場合、 'main'はあなたのコントローラです。 – 4castle

+0

@PaulBoddington基本的に 'studentMain.java'を調べると、' studentController class'のオブジェクトを使用して指定された型のを持つArraylistにコピーしようとしました。エントリは正常に機能しますが、2番目のエントリに入ると、最初のエントリが削除され、2番目のエントリがarraylistに2回コピーされます。 –

答えて

1

あなたが興味を持っている問題を説明する前に、(まだ)関心がない問題を説明しましょう。

一般的にはMVCについて非常に混乱しているようです。モデルビューコントローラとしてのMVCは、ビューとコントローラからモデルを分離する必要があるという考えに基づいています。モデルはデータモデリングを担当し、ビューはユーザーとのやりとりを担当し、コントローラはバックエンドロジックを担当します。だから私はあなたのコードをリファクタリングすることをお勧めします。私を信じて、あなたはこの考えに感謝します。

ここで、あなたが興味を持っている問題を見てみましょう。

controllerと呼ばれるオブジェクトを使用します。これは無限サイクルの外に作成されます。これは良い考えではありません。なぜなら、オブジェクトを実際に必要とすることなくオブジェクトを作成するからです。ユーザーが6を入力したらどうなりますか?その場合、あなたは無駄にメモリを割り当てました。これに

studentController controller = new studentController(model,view); 

studentController controller; 

さて、コマンドを見てみましょうので、これを変更します。コマンド1で、controllerへの参照を使用し、それをリストに追加します。 controllerが以前の反復のためにリストの最初の要素を参照してから1を押すと、listに全く同じオブジェクトが追加されます。これは、オブジェクトへの参照を複製することを意味し、したがって、あなたが不平を言っていた問題を複製します。だから、これに代えて:(私は私の提案でコードをテストしていない)あなたは、他の問題がある可能性があります

 case 1 : { 
      list.add((new studentController(model,view)).input()); 
     } break; 

が、私はこの答えが良いと信じて:

case 1 :controller.input(); 
     list.add(controller); 
     break; 

あなたはこれを必要とします問題を解決するのに役立ちます。とにかく、コードをリファクタリングしてください。

関連する問題