Как сделать код более гибким - PullRequest
1 голос
/ 22 ноября 2010

Я написал Java-класс для моего проекта класса, и все мои методы не имеют силы, и я в основном ничего не делаю, но вызываю методы в своем основном методе.

Код в основном помогает студентам управлять своимиежемесячный доход, с точки зрения арендной платы и платежей по кредиту.

Может ли кто-нибудь указать мне правильное направление относительно того, что я делаю неправильно?Любой совет в целом с точки зрения навыков кодирования?

код класса:

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);}


}

</p>

<code>//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();
 }

}

Спасибо

Ответы [ 4 ]

3 голосов
/ 22 ноября 2010

Для начала, много повторяющегося кода.У вас есть только несколько вопросов, которые следуют одному и тому же шаблону, поэтому вам следует абстрагироваться от него.

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
}

Это также помогает разделить ваш код.Вы можете перейти к разработке типа MVC с одним классом, связанным с IO, другим с данными и другим, который управляет взаимодействиями.

3 голосов
/ 22 ноября 2010

Первое, что приходит на ум, это то, что вам нужно разделить свои проблемы.Это означает, что ваш класс Финансы должен делать только то, что связано с финансами.Он должен не делать такие вещи, как чтение ввода из командной строки.

Один из способов добиться такого разделения - создать другой класс, что-то вроде FinanceDataReader или что-то подобное, и заставить его управлять всеми взаимодействиями с пользователем.Он получит данные из командной строки и передаст их в ваши экземпляры Finance.Если вы действительно хотите стать модным, создайте интерфейс для чтения финансовых данных, а затем внедрите реализацию CommandLineFinanceDataReader.Таким образом, вы можете изменить способ получения данных в будущем, и вам не нужно будет менять свой класс «Финансы».

Таким образом, говоря иначе, переместите любую функциональность, которая читает входные данные, в другой класс, чтобы уменьшить финансы.и более ремонтопригоден.Создайте классы, которые инкапсулируют всю вашу функциональность, но сгруппируйте их в соответствии с проблемами, которые вы решаете.

Еще одна важная вещь, которую вы можете сделать, - это использовать такую ​​среду, как JUnit, для модульного тестирования вашего кода.Это потребует первоначальных вложений, но поможет вам сэкономить время, потому что вы будете проверять все мелочи по ходу работы.Другими словами, вы не будете писать 300 строк кода, а затем должны выяснить, почему он не работает;тестирование во время написания каждого метода поможет вам убедиться, что ваши методы / классы выполняют то, что вы хотите.

Не волнуйтесь, такого рода вещи приходят со временем - если это для вашей первой Java и, возможно, OOкласс, вы будете делать ошибки и иметь ограниченный дизайн.Со временем это улучшится, если вы будете придерживаться этого.

0 голосов
/ 05 марта 2014

Создание гибкого, нежесткого кода - это то, что усваивается с течением времени и включает использование шаблонов проектирования и общих принципов проектирования.Вот несколько советов о том, с чего начать. Начните с глубокого понимания абстракций и работы с DIP (Принцип инверсии проектирования).

Использование общих шаблонов проектирования - этоотличные способы достижения гибкости.Несколько хороших примеров, с которых можно начать, - это «Шаблон стратегии» и «Наблюдаемый шаблон».Вы также хотите следовать передовым методам и принципам , таким как принцип единой ответственности, принцип наименьшего знания, принцип открытого закрытия и т. Д. Те немногие должны помочь вам начать, но это зависит от васосвоить технику.

0 голосов
/ 22 ноября 2010

Большинство ваших методов - это вопросы, которые хранят значение в переменной. Возможно, вам удастся создать интерфейс Вопрос / Правило, в котором есть метод запроса пользователя для ввода, один для вычисления результата и метод вывода. Затем создайте реализацию для каждого вопроса со своей уникальной логикой. Ваш основной метод просто должен был бы перебрать список этих вопросов для вопросов и отчетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...