2010-11-22 18 views
1

Ich habe eine Java-Klasse für mein Klassenprojekt geschrieben, und alle meine Methoden sind void, und ich mache im Grunde nur die Methoden in meiner Hauptmethode aufrufen.Wie man Code flexibler macht

Der Code hilft den Studenten im Grunde, ihr monatliches Einkommen in Bezug auf Miete und Darlehen Zahlungen zu verwalten.

Kann mir jemand in die richtige Richtung zeigen, was ich falsch mache? Irgendwelche Ratschläge in Bezug auf Codierungsgewohnheiten?

der Klassencode:

import java.io.*; 
import java.util.*; 
public class Finance{ 
    private double rentExpenses, tuition, totalCost, totCost, rent; 
    private double payInput; 
    private boolean status, liveWithParent; 
    private int pay; 
    //totalCost=Final cost per month 
    //totCost=cost of tuition and rent per month 


//Living with parents? 
    public void liveWithParents(){ 
    Scanner in=new Scanner(System.in); 
    System.out.println("Are you living with your parents?"); 
    String parents= in.nextLine(); 
    if(parents.charAt(0)=='y' || parents.charAt(0)=='Y'){ 
     status=true;} 
    else{ 
     status=false;}} 

//If yes, do you pay them rent?, if yes how much? else -, else How much is your monthly rent anyway? 
    public void amountRent(){ 
    double rent; 
    char valid; 
    String validIn; 
    Scanner in=new Scanner(System.in); 
    if(status){ 
     System.out.println("Do you need to pay them rent?"); 
     validIn=in.nextLine(); 
     valid= validIn.charAt(0); 
     if(valid=='y' || valid=='Y'){ 
     System.out.println("How much is your rent?"); 
     rent=in.nextDouble();}} 
    else{ 
    System.out.println("How much is your monthly rent?"); 
    rent=in.nextDouble();}} 

//What is your college tuition, $/term 
    public void collegeTuition(){ 
    System.out.println("What what is your college tuition in $ per term?"); 
    Scanner in=new Scanner(System.in); 
    tuition= in.nextDouble();} 

//Total cost of tuition and rent per month 
    public void getMonthlyCost(){ 
    totCost= rentExpenses + tuition/3.75; 
    System.out.println("Your rent expenses and college tuition are: $"+totCost+" per month");} 

//Method of paying for expenses 

    public void payMethod(){ 
    Scanner in=new Scanner(System.in); 
    System.out.println("How will you pay for your expenses?" 
         + "\n 1 -Savings\n 2 -Loans\n 3 -Freelance Work"); 
    pay=in.nextInt(); 
    while(pay<=0 || pay>3){ 
     System.out.println("You need to enter a number coresponding to the three choiches.\n\t Try again:"); 
     System.out.println("How will you pay for your expenses?" 
         + "\n 1 -Savings\n 2 -Loans\n 3 -Freelance Work"); 
     pay=in.nextInt();}} 

//Gets the amount of savings the user has and converts 
//that value to a monthly value 
public void inputPayMethod(){ 
    Scanner in=new Scanner(System.in); 
    if(pay==1){ 
    System.out.println("What amount of savings do you have in total for the school year?"); 
    payInput=in.nextDouble(); 
    payInput=payInput/9;} 
    else if(pay==2){ 
    System.out.println("What amount of loans did you acquire for this school year?"); 
    payInput=in.nextDouble(); 
    payInput=payInput/9;} 
    else if(pay==3){ 
    System.out.println("How much revenue does your Freelane business get per month?"); 
    payInput=in.nextDouble();}} 

//Calculates the total cost that the user needs 
//for renting and tuition solely 
public void getTotalCost(){ 
totalCost=(payInput/3.75)-(rentExpenses + tuition/4.348);} 

//Outputs the total cost 
public void outputCost(){ 
    System.out.println("Your balance per month after expenses is: $" 
         +totalCost); 
    if(totalCost<0){ 
      System.out.println("You still need $"+(-totalCost)+" per months");} 
    if(totalCost>0){ 
      System.out.println("In other words you should be A-O-KAY");} 
       //Balance calculation for an entire school year 
      System.out.println("For an entire school year, your expenses would be: "+ 
           (totalCost*2));} 

//Create a file with the information entered 
//and the information processed 
public void outputFile() throws IOException{ 
String payFileOutput=null; 
Scanner in=new Scanner(System.in); 
System.out.println("Enter the name of the file you wish to store this"+ 
        "information in: "); 
    String fileName= in.nextLine(); 

    PrintWriter file= new PrintWriter(fileName); 
    file.println("Your rent expenses are      :"+rentExpenses); 
    file.println("Your college tuition in dollars per month is:"+tuition); 
    file.println("            -----"); 
    file.println("Your rent expenses and college tuition are :"+(rentExpenses + tuition)); 
    if(pay==1) 
     payFileOutput="Savings"; 
    else if(pay==2) 
     payFileOutput="Loans"; 
    else if(pay==3) 
     payFileOutput="Freelance Work"; 
    else 
     ; 
    file.println("\n\nYou choose "+payFileOutput+"as your income source"); 
    file.println("Your balance per month after expenses is: $"+totalCost); 
    if(totalCost<0){ 
     file.println("You still need $"+(-totalCost)+"per month");} 
    if(totalCost>0){ 
     file.println("\n\n\nYour budget seems good");} 
    file.close(); 
    System.exit(0);} 


} 

//The main method: import java.io.*; public class UseClass { /** * @param args */ public static void main(String[] args) throws IOException{ Finance fin=new Finance(); fin.liveWithParents(); fin.amountRent(); fin.collegeTuition(); fin.getMonthlyCost(); fin.payMethod(); fin.inputPayMethod(); fin.getTotalCost(); fin.outputCost(); fin.outputFile(); } }

Danke

+0

'Kann mir jemand in die richtige Richtung zeigen, was ich falsch mache? Wie sollen wir wissen, was Sie falsch machen, ohne eine Fehlermeldung, einen StackTtrace oder eine Beschreibung dessen, was Sie erwarten? du siehst? – Falmarri

+0

Ich glaube, dass Andrei sagt, dass er nicht glaubt, dass sein Ansatz gemäß OO-Paradigmen und von der Gemeinschaft beobachteten Kodierungsstandards akzeptabel ist. – Joel

+0

Genau Joel. Ich möchte nur etwas Input von erfahreneren Benutzern bekommen, wie Dinge getan werden sollten. Aber ich denke, dieses Problem wird in zwei Kapiteln aus meinem aktuellen Kapitel gelöst, in dem das Buch Klassen und Methoden neu betrachtet ... aber ich würde trotzdem gerne wissen, wie ich meinen Code flexibler gestalten kann. –

Antwort

2

Das erste, was in den Sinn kommt ist, dass Sie benötigen, um Ihre Anliegen zu trennen. Dies bedeutet, dass Ihre Finance-Klasse nur Dinge im Zusammenhang mit Finanzen tun sollte. Es sollte nicht Dinge wie lesen Eingabe von der Kommandozeile.

Eine Möglichkeit, diese Trennung zu erreichen, wäre eine andere Klasse zu erstellen, etwa FinanceDataReader oder so, und alle Benutzerinteraktionen verwalten zu lassen. Es würde die Daten von der Befehlszeile abrufen und sie an Ihre Finance-Instanzen füttern. Wenn Sie wirklich etwas Besonderes wünschen, erstellen Sie eine Schnittstelle zum Lesen von Finanzdaten und verfügen dann über eine CommandLineFinanceDataReader-Implementierung. Auf diese Weise können Sie ändern, wie Sie Daten in Zukunft erhalten, und müssen Ihre Finance-Klasse nicht ändern.

Also, um es anders auszudrücken, verschiebe jede Funktionalität, die Eingaben liest, in eine andere Klasse, um Finanzen kleiner und wartbarer zu machen. Erstellen Sie Klassen, die alle Ihre Funktionen kapseln, gruppieren Sie sie jedoch gemäß den Anliegen, die Sie adressieren.

Eine andere große Sache, die Sie tun können, ist ein Framework wie JUnit zu verwenden, um Ihren Code zu testen. Es wird eine Vorabinvestition erfordern, aber es wird Ihnen helfen, Zeit zu sparen, weil Sie alle kleinen Bits testen werden, während Sie gehen. Mit anderen Worten, Sie schreiben nicht 300 Zeilen Code und müssen dann herausfinden, warum es nicht funktioniert; Wenn Sie beim Testen jeder Methode testen, können Sie sicherstellen, dass Ihre Methoden/Klassen das tun, was Sie wollen.

Mach dir keine Sorgen, diese Art von Dingen kommt mit der Zeit - wenn dies für Ihre erste Java und möglicherweise OO-Klasse ist, werden Sie Fehler machen und haben ein begrenztes Design. Das wird sich mit der Zeit verbessern, wenn Sie dabei bleiben.

+0

Was meinen Sie mit dem Erstellen einer Schnittstelle zum Lesen von Finanzdaten? –

+0

@andrei, wenn das für eine Klasse ist, sind Sie vielleicht noch nicht dort angekommen. Siehe http://en.wikipedia.org/wiki/Interface_(Java) – hvgotcodes

2

Für den Anfang gibt es eine Menge Code wiederholt. Sie haben nur ein paar Fragen, die dem gleichen Muster folgen, also sollten Sie es abstrahieren.

class QuestionIO { 
    private Scanner in = new Scanner(System.in); 

    public boolean boolQuestion(String question) { 
    System.out.println(question); 
    String result= in.nextLine(); 
    return (result.charAt(0)=='y' || result.charAt(0)=='Y'); 
    } 

    //other types for doubles or ints 
} 

Dies hilft auch bei der Partitionierung Ihres Codes. Sie können sich zu einem MVC-Typ-Design mit einer Klasse bewegen, die sich mit dem IO befasst, mit den Daten und einem anderen, der die Interaktion steuert.

0

Die meisten Ihrer Methoden sind Fragen, die einen Wert in einer Variablen speichern. Sie können möglicherweise eine Frage/Regel-Schnittstelle erstellen, die eine Methode zur Eingabeaufforderung an den Benutzer, eine zur Berechnung des Ergebnisses und eine Methode zur Ausgabe enthält. Erstellen Sie dann für jede Frage eine Implementierung mit einer eigenen Logik. Ihre Hauptmethode müsste einfach eine Liste dieser Fragen durchgehen, um sie zu fragen und zu berichten.

0

Der Aufbau von flexiblem, nicht-starrem Code ist etwas, das im Laufe der Zeit erlernt wird und die Verwendung von Entwurfsmustern und allgemeinen Entwurfsprinzipien beinhaltet. Hier ein paar Tipps, wo Sie anfangen können. Sie möchten mit einem soliden Verständnis von Abstraktionen beginnen und mit dem DIP (Design Inversion Principle) arbeiten.

Mit gemeinsamen Entwurfsmuster ist eine gute Möglichkeit, Flexibilität zu erreichen. Ein paar gute Beispiele, um mit zu beginnen, sind das "Strategie-Muster" und das beobachtbare Muster. Sie möchten auch folgen Best Practices und Prinzipien, wie das Prinzip der einfachen Verantwortung, Prinzip des geringsten Wissens, Open Close-Prinzip, etc .. Die wenigen sollten Sie beginnen, aber es ist an Ihnen, die Technik zu meistern .