2 svar
110 visningar
Berty von Fjerty 86
Postad: 28 mar 2021 17:39 Redigerad: 28 mar 2021 17:43

Feedback på program för att hantera ärenden

Hej, är ny på programmering i allmänhet och på Java i synnerhet. I en javakurs jag tar fick vi i uppgift att bygga ett enklare textbaserat program som ska hantera ärenden. Programmet skulle bl.a ha funktionerna:

  • Skapa nytt ärende
  • Se olösta ärenden
  • Lös ärende
  • Avsluta programmet

Dessutom fanns det krav på att skapa en klass, och från den klassen skapa objekt (ärenden) som lagrar en beskrivning (sträng) och en status (boolean). Objekten ska lagras i en arraylist.

Jag har inte stött på några tekniska svårigheter (programmet funkar) annat än att det är enkelt för användaren att krascha programmet. Min förhoppning är att jag får feedback på koden. Jag är inte särdeles bevandrad i best practice vad gäller Java och hur man på bästa sätt skapar en meningsfull klass. Vad i koden nedan tycker ni ser tokigt ut? Vad hade ni lagt till/tagit bort/formulerat annorlunda? 

Här körs programmet:

import java.util.ArrayList;
import java.util.Scanner;

class Main {
  static Scanner myScan = new Scanner(System.in);

  public static ArrayList olöstaÄrenden(ArrayList ärenden){
    ArrayList olösta = new ArrayList();

    for(int i = 0; i < ärenden.size(); i++){
      Ärende dummy = (Ärende) ärenden.get(i);
      if(dummy.getStatus()){
        olösta.add(dummy);
      }
    }
    return olösta;
  }
  public static ArrayList löstaÄrenden(ArrayList ärenden){
    ArrayList lösta = new ArrayList();

    for(int i = 0; i < ärenden.size(); i++){
      Ärende dummy = (Ärende) ärenden.get(i);
      if(!dummy.getStatus()){
        lösta.add(dummy);
      }
    }
    return lösta;
  }

  public static void main(String[] args){
    ArrayList allaÄrenden = new ArrayList();

    String menuText = ("---Ärendehanterare---\n(1) Lägg till ärende\n(2) Markera ärende som löst\n(3) Se alla olösta ärenden\n(4) Se alla lösta ärenden\n(5) Avsluta");

    String choice;
    boolean startProgram = true;

    while(startProgram){
      System.out.println(menuText);
      choice = myScan.nextLine();

      if(choice.equals("1")){
        System.out.print("Ange ärende: ");
        choice = myScan.nextLine();
        Ärende nyttÄrende = new Ärende(choice, true); //användaren skapar nytt ärende och lägger till i en lista med samtliga ärenden
        allaÄrenden.add(nyttÄrende);
      }
      else if(choice.equals("2")){
        System.out.println("---Lös ärende---");
        ArrayList olösta = (ArrayList) olöstaÄrenden(allaÄrenden);

        for(int i = 0; i < olösta.size(); i++){
          Ärende dummy = (Ärende) olösta.get(i);
          System.out.println("["+i+"] " + dummy.getBeskrivning()); 
        }
        int choice2 = myScan.nextInt();
        Ärende lös = (Ärende) olösta.get(choice2);
        lös.changeStatus(); //ändrar status på ärendet

      }
      else if(choice.equals("3")){
        System.out.println("---Olösta ärenden---");
        ArrayList olösta = (ArrayList) olöstaÄrenden(allaÄrenden);

        for(int i = 0; i < olösta.size(); i++){
          Ärende dummy = (Ärende) olösta.get(i);
          System.out.println("["+i+"] " + dummy.getBeskrivning()); //skriver bara ut olösta
        }
      }
      else if(choice.equals("4")){
        System.out.println("---Lösta ärenden---");
        ArrayList lösta = (ArrayList) löstaÄrenden(allaÄrenden);

        for(int i = 0; i < lösta.size(); i++){
          Ärende dummy = (Ärende) lösta.get(i);
          System.out.println("["+i+"] " + dummy.getBeskrivning()); //skriver bara ut lösta
        }
      }
      else if(choice.equals("5")){
        startProgram = false;
      }
      else{
        System.out.println("*\n***Inte ett giltigt alternativ***\n*");
      }
    }
  }
}

 

Här är klassen med vilken jag skapar objekt (ärenden):

import java.util.ArrayList;

public class Ärende{

  private String beskrivning;
  private boolean status;

  Ärende(String beskrivning, boolean status){
    this.beskrivning = beskrivning;
    this.status = status;
  }

  public String getBeskrivning(){
    return beskrivning;
  }
  public boolean getStatus(){
    return status;
  }
  public void changeStatus(){
    status =! status;
  }
}
Laguna Online 28597
Postad: 28 mar 2021 18:36

Om du vet att programmet kan krascha och varför så borde du fixa det först.

EnApelsin 180
Postad: 31 mar 2021 10:38

Hej, tycker koden ser bra ut. Jättebra att du kollar ifall användaren skrivit fel och delat upp det så att ärenden har en egen klass. Har ett par idéer om hur man kan förbättra utifrån vad som generellt brukar vara bra när man skriver Java (framförallt om du i framtiden skriver större program):

 

1. Jag skulle lägga in de olika ärendena i varsin metod (alltså kalla på respektive metod när användaren skriver in 0,1,2,3 osv). Nu vet du att programmet funkar men generellt sett är det bra att dela upp olika uppgifter i olika metoder pga

 

* Lättare att felsöka ifall du skulle få en bugg eller helt enkelt för att testa

* Lättare att förstå för dig och andra (t ex din lärare, ifall du glömmer vad du har gjort eller om du hade jobbat med en klasskompis)

* Lättare att ändra ifall du skulle vilja lägga till eller ta bort någon operation (t ex om du vill lägga till olika ärenden eller av någon anledning inte längre vill att användaren ska kunna se olösta ärenden).

 

2. Jag hade gjort en egen metod för att ta in användarinput/ köra programmet av samma anledningar som ovan: Lättare att felsöka, förstå och ändra ifall du behöver. Dvs, nåt i stil med:

 

public void start(){

while (startProgram) {

   System.out.println(menuText);

   choice = myScan.nextLine();

 

if (choice.equals("1")){

    skapaNyttÄrende();

}

    ...

}

}

 

3. Jag hade lagt till kommentarer för varje metod där du beskriver vad den gör. Det blir lättare att förstå för andra som läser koden men även för dig att komma ihåg vad du gjort, så man inte behöver sitta och läsa koden i detalj för att förstå vad en metod gör.  Sparar tid och ork :)

 

Mvh

EnApelsin

Svara Avbryt
Close