Budget Manager fragen zur Umsetzung

DrPils

Bekanntes Mitglied
Moin

Ich starte gerade als Übungsprojekt einen Budget Manager.
Starten soll alles als einfache Konsolen Anwendung, aber es soll aufjedenfall erweiterbar sein, so dass ich es später als GUI Programm umsetzen kann.

Es sollen transaktionen hinzugefügt werden können, welche in dem Account gespeichert werden und das Guthaben beeinflussen.

Hier mal eine Blaupause, dachte es ist besser als es in Worte zu formulieren.
class Account {
private int balance;
private List<Income> incomes;
private List<Purchase> purchases;
}


interface Transaction {
void transaction(Account account);
}

class Purchase implements Transaction {

private int amount;
private String description;
//private Category category;

@Override
public void transaction(Account account) {
//Die Ausgabe wird der transactions List hinzugefügt und die balance
// dementsprechend verringert
}
}

class Income implements Transaction {

private int amount;
private String description;
//private Category category;

@Override
public void transaction(Account account) {
//Die Einnahme wird der Incomes List hinzugefügt und die balance
// dementsprechend verringert
}
}
[/CODE]

Mein Problem ist jetzt, dass ich jeder Transaktion eine Kategorie hinzufügen möchte, also zb Lebensmittel, Miete, etc.
Die Transaktionen sollen nach dieser Kategorie gefiltert werden können. Leider habe ich keine Ahnung wie ich Kategorie umsetzen soll.
Enum fällt aus, da Kategorien hinzugefügt werden können. Außerdem sind mir die Klassen Income und Purchase ein Dorn im Auge,
da sie identische Attribute haben, wäre statt ein Interface eine Abstrakte Klasse evtl eher angebracht?

Danke schonmal!
 

mrBrown

Super-Moderator
Mitarbeiter
Außerdem sind mir die Klassen Income und Purchase ein Dorn im Auge,
da sie identische Attribute haben, wäre statt ein Interface eine Abstrakte Klasse evtl eher angebracht?
Warum nicht einfach nur eine gemeinsame Klasse für Einnahmen und Ausgaben? :)

Leider habe ich keine Ahnung wie ich Kategorie umsetzen soll.
Enum fällt aus, da Kategorien hinzugefügt werden können.
Vielleicht einfach eine Klasse Category mit einem Namen als Attribut?
 

DrPils

Bekanntes Mitglied
Warum nicht einfach nur eine gemeinsame Klasse für Einnahmen und Ausgaben? :)
Ich möchte sie in verschiedene Listen speichern und evtl später auch getrennt behandeln. Also zb Income kann immer nur positiv sein und Purchase immer nur negativ.

Vielleicht einfach eine Klasse Category mit einem Namen als Attribut?
Gute Frage :D aber dann könnte ich ja direkt Category als Attribut der Klasse Incom und Purchase deklarieren. Aber dann hätte ich meiner Meinung nach das Problem dass ich wenn ich sie in getrennten Listen packen möchte, ein unschönes Konstrukt von
Java:
if(purchase.category.equals("xxxx")){
    liste1.add(purchase)
}else if(purchase.category.equals("xxxy")){
    liste2.add(purchase)
}else if(...){
    ...
}....
hätte. Oder liege ich da falsch?
 

mrBrown

Super-Moderator
Mitarbeiter
Ich möchte sie in verschiedene Listen speichern und evtl später auch getrennt behandeln. Also zb Income kann immer nur positiv sein und Purchase immer nur negativ.
Wenn du dafür wirklich zwei verschiedene Klassen brauchst, kannst du natürlich zusätzlich eine abstrakte Klasse einführen.
aber zumindest die getrennten Listen sind ja auch ohne extra Klassen möglich, nur halt nicht nach Typ getrennt.
Gute Frage :D aber dann könnte ich ja direkt Category als Attribut der Klasse Incom und Purchase deklarieren.
Theoretisch ja, allerdings hast du mit einer eigenen Klasse den Vorteil, das explizit ist, was es ist :) eine Kategorie ist ja nicht einfach ein String.


Aber dann hätte ich meiner Meinung nach das Problem dass ich wenn ich sie in getrennten Listen packen möchte, ein unschönes Konstrukt
Das Konstrukt wäre ja unabhängig davon, wie Kategorien aussehen – es ließe sich aber unabhängig davon schöner lösen, ohne eigene if‘s
 

DrPils

Bekanntes Mitglied
So ich habe jetzt mal ein bisschen daran rumgetüftelt. Insbesondere meine sortedTransactions() scheint mir eine einzige Katastrophe zu sein(class Account Zeile 67). Sie soll mir eine nested List zurückgeben deren innere Listen jeweils die Transaktionen der gleichen Kategorie beinhalten.
Dafür erstelle ich ein Hashset, durchlaufe meine transactions List und und füge die Category jeder Transaktion dem HashSet hinzu. Das mache ich da in einem Hashset ja jedes Element einzigartig ist. Nun durchlaufe ich das HashSet und erstelle für jedes Element eine neue Arraylist welche von der transactionsFilteredByCategory eine Liste der jeweiligen Kategorie bekommt. Diese Liste füge ich dann meiner nested List hinzu.
Ich sehe schon selbst dass das nicht sauber sein kann und wäre daher für Ratschläge dankbar.

[CODE lang="java" title="Account" highlight="67 - 76"]package budgetmanager.account;

import budgetmanager.transaction.Category;
import budgetmanager.transaction.Income;
import budgetmanager.transaction.Purchase;
import budgetmanager.transaction.Transaction;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public final class Account {

private final static Account instance = new Account();

private final List<Transaction> transactions;

private int balance;

private Account() {
transactions = new ArrayList<>();
}

public void doTransaction(Transaction transaction) {
if (transaction instanceof Purchase) {
balance -= transaction.getAmount();
} else {
balance += transaction.getAmount();
}
transactions.add(transaction);
}

public static Account getInstance() {
return instance;
}

public List<Income> incomesList() {
List<Income> incomes = new ArrayList<>();
for (Transaction t : transactions) {
if (t instanceof Income) {
incomes.add((Income) t);
}
}
return incomes;
}

public List<Purchase> purchasesList() {
List<Purchase> purchases = new ArrayList<>();
for (Transaction t : transactions) {
if (t instanceof Purchase) {
purchases.add((Purchase) t);
}
}
return purchases;
}

public List<Transaction> transactionsFilteredByCategory(Category category) {
List<Transaction> filtered = new ArrayList<>();
for (Transaction t : transactions) {
if (t.getCategory().equals(category)) {
filtered.add(t);
}
}
return filtered;
}

public List<List<Transaction>> sortedTransactions() {
HashSet<Category> categories = new HashSet<>();
transactions.forEach(t -> categories.add(t.getCategory()));
List<List<Transaction>> sorted = new ArrayList<>(categories.size());
for (Category category : categories) {
List<Transaction> t = transactionsFilteredByCategory(category);
sorted.add(t);
}
return sorted;
}
}

[/CODE]

[CODE lang="java" title="Category"]package budgetmanager.transaction;

import java.util.Objects;

public class Category {

private final String name;

public Category(String name) {
this.name = name;
}

@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Category{");
sb.append("name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Category category = (Category) o;

return Objects.equals(name, category.name);
}

@Override
public int hashCode() {
return name != null ? name.hashCode() : 0;
}
}
[/CODE]

[CODE lang="java" title="Income"]package budgetmanager.transaction;

public class Income extends Transaction {

public Income(String description, Category category, int amount) {
super(description, category, amount);
}

}



[/CODE]

[CODE lang="java" title="Purchase"]package budgetmanager.transaction;

public class Purchase extends Transaction {

public Purchase(String description, Category category, int amount) {
super(description, category, amount);
}

}
[/CODE]
[CODE lang="java" title="Purchase"]package budgetmanager.transaction;

import java.time.LocalDate;


public abstract class Transaction {

private final String description;
private final Category category;
private final int amount;
private final LocalDate date;


public Transaction(String description, Category category,
int amount) {
if (amount <= 0) {
throw new IllegalArgumentException("Amount must be positive");
}
this.description = description;
this.category = category;
this.amount = amount;
this.date = LocalDate.now();
}


public String getDescription() {
return description;
}

public Category getCategory() {
return category;
}

public double getAmount() {
return amount;
}

public LocalDate getDate() {
return date;
}


@Override
public String toString() {
StringBuilder sb = new StringBuilder("Transaction{");
sb.append("description='").append(description).append('\'');
sb.append(", category=").append(category);
sb.append(", amount=").append(amount);
sb.append(", date=").append(date);
sb.append('}');
return sb.toString();
}
}
[/CODE]
 

mrBrown

Super-Moderator
Mitarbeiter
Insbesondere meine sortedTransactions() scheint mir eine einzige Katastrophe zu sein(class Account Zeile 67). Sie soll mir eine nested List zurückgeben deren innere Listen jeweils die Transaktionen der gleichen Kategorie beinhalten.
Ich würde List<List<..>> generell immer als Katastrophe ansehen, aber ansonsten sieht die Methode gar nicht so schlimm aus, besser wäre eher sowas wie Map<Category, List<Transaction>>, je nachdem was du machen willst natürlich.

Und vorher solltest du dir die Frage stellen, ob die Methode überhaupt nötig ist, oder nicht schon der Account selbst ausreichend ist – von dem bekommst du ja jeweils alle Transactions zu einer Category ;)
 

DrPils

Bekanntes Mitglied
Wieso würdest du sagen etwas wie List<List<...>> ist immer eine Katastrophe? Die Befürchtung hatte ich zwar auch schon, aber begründen konnte ich es nicht.
Ja der Sinn der Methode erschließt sich mir jetzt auch nicht mehr :D
 
K

kneitzel

Gast
Was ist sowas denn? Die Bedeutung ist nicht leicht erkennbar und das ist ein Zeichen, dass die Lösung zu komplex gewählt wurde.

Ziel soll ja sein, dass Code sich selbst erklärt. Und dazu ist so ein Ausdruck nicht wirklich geeignet.

Ich möchte nicht ausschließen, dass es ggf. Situationen gibt, wo wirklich nur eine Liste von Listen das ist, was da gespeichert wird, aber das dürfte zumindest selten vorkommen.
 

temi

Top Contributor
Ich würde nur eine Klasse für Transaktionen verwenden und Ein- und Auszahlung als positiven oder negative Betrag berücksichtigen. Der Kontostand kann über eine Abwicklung aller Transaktionen ermittelt werden.
Java:
class Account
    List<Transaction> transactions;

    void applyTransaction(Transaction transaction) {
        transactions.add(transaction);
    }

    int getBalance() {
        int balance = 0;
        for(var transaction : transactions) {
            balance += transaction.getValue();
        }
       
        return balance;
    }
}

class Transaction {
    // Zeitstempel, Kommentar usw.
    private int value;
   
    int getValue() {
        return value;
    }
}

Die Kategorien könnten auch in einer separaten Klasse gespeichert werden.
Java:
class Categories {
    private Map<Category, List<Transaction>> categories;
   
    public void add(Transaction transaction, Category category) {
       
        List<Transaction> transactions = categories.get(category);
       
        if (transactions == null) {
            transactions = new List<Transaction>();
        }
       
        transactions.add(transaction);
        categories.put(category, transactions);
    }
   
    public List<Transaction> getAll(Category category) {
        return categories.get(category);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
FelixxF Erste Schritte Hilfe bei Fußball Manager Java Basics - Anfänger-Themen 2
C Der Swing Layout-Manager hasst mich Java Basics - Anfänger-Themen 4
F Welchen Layout Manager wählen? Java Basics - Anfänger-Themen 13
D Fehlermeldung "com.element.JavaUpload.Manager" Java Basics - Anfänger-Themen 1
Q Layout Manager Java Basics - Anfänger-Themen 6
M JPA Entity Manager Java Basics - Anfänger-Themen 1
S Passwort Manager Java Basics - Anfänger-Themen 2
P Layout Manager - Welches Layout für Memory? Java Basics - Anfänger-Themen 7
R Welcher Layout Manager-für so ein Fenster? Java Basics - Anfänger-Themen 5
B Transport Manager Java Basics - Anfänger-Themen 23
D Der richtige Layout Manager Java Basics - Anfänger-Themen 8
T Eine doofe Frage zum null-Layout-Manager Java Basics - Anfänger-Themen 6
G Welcher Layout-Manager? *confused* Java Basics - Anfänger-Themen 2
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
H Fragen zu Wrapperklassen Java Basics - Anfänger-Themen 29
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
A Bei VierGewinnt fragen ob man gegen CPU oder Menschen spielen will. Java Basics - Anfänger-Themen 7
A Bei VierGewinnt vorher fragen, ob man gegen den Computer spielen möchte oder gegeneinander. Java Basics - Anfänger-Themen 1
A Bei VierGewinnt fragen, ob man gegen den Computer spielen möchte oder gegeneinander Java Basics - Anfänger-Themen 1
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
G Fragen zu Kompelierfehler in Aufgabe. Java Basics - Anfänger-Themen 25
E Bäume/ allgemeine Fragen Java Basics - Anfänger-Themen 21
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
S Diverse Fragen vor Schulaufgabe ;) Java Basics - Anfänger-Themen 4
S Fragen zu Ausgabe double und float Java Basics - Anfänger-Themen 3
B fragen zu Aufbau eines UML-Klassendiagramm Java Basics - Anfänger-Themen 1
C 3 Fragen rund um Klassenattribute Java Basics - Anfänger-Themen 8
L Erste Schritte Log4J Fragen Java Basics - Anfänger-Themen 5
NeoLexx Fragen zu diversen Elementen der Javabibliothek Java Basics - Anfänger-Themen 5
N Fragen zur Datenspeicherung Java Basics - Anfänger-Themen 45
T Java Anfänger mit konkreten Fragen Java Basics - Anfänger-Themen 2
CT9288 Fragen zu Java Java Basics - Anfänger-Themen 16
W Fragen zu Generics Java Basics - Anfänger-Themen 14
T ObjectInput/OutputStream Fragen zur Funktionsweise Java Basics - Anfänger-Themen 3
J Fragen zu einer Methode Java Basics - Anfänger-Themen 3
J Fragen zum Code aus dem Buch "Schrödinger programmiert Java 2.te Ausgabe" Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
J Fragen zu Input/Output Java Basics - Anfänger-Themen 3
J Erste Schritte Oracle Tutorials zu Java 8 - Fragen dazu Java Basics - Anfänger-Themen 1
H Java Quereinsteiger Roadmap und Fragen Java Basics - Anfänger-Themen 29
H fragen Java Basics - Anfänger-Themen 15
M Samelsarium Grundlegender Fragen 2 Java Basics - Anfänger-Themen 9
M Sammelsarium an Grundlagen Grundlagen Fragen Java Basics - Anfänger-Themen 11
B Java ist / wird kostenpflichtig. Ein paar Fragen Java Basics - Anfänger-Themen 1
J Fragen zu synrchonized und kritischen Abschnitten Java Basics - Anfänger-Themen 5
S Fragen zu einem Rechentrainer Java Basics - Anfänger-Themen 2
B Java Vererbung Fragen (zu Code Beispiel) Java Basics - Anfänger-Themen 3
J Wo kann man Fragen zu ireport stellen. Java Basics - Anfänger-Themen 0
M Fragen zum Anlegen und Benutzen von Listen Java Basics - Anfänger-Themen 9
G Ein paar Anfänger Fragen zu StdDraw Java Basics - Anfänger-Themen 4
D Fragen zur Klassen Java Basics - Anfänger-Themen 4
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
J Interface Fragen bezüglich "Sauberkeit" von Code Java Basics - Anfänger-Themen 5
D Objekte-Fragen Java Basics - Anfänger-Themen 1
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
R Fragen über den Konstruktor Java Basics - Anfänger-Themen 0
Azazel Ein paar Fragen zu Methodenaufrufen(java.awt) Java Basics - Anfänger-Themen 2
S Erste Schritte Fragen zur For-Schleife Java Basics - Anfänger-Themen 9
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
C Fragen zum Spigot Plugin (1.8) Java Basics - Anfänger-Themen 6
J Fragen zu Exceptions Java Basics - Anfänger-Themen 24
N Quiz- Fragen zufällig anzeigen lassen Java Basics - Anfänger-Themen 7
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
L Viele Fragen zu den Grundlagen Java Basics - Anfänger-Themen 5
B Fragen zu ZIP-File Java Basics - Anfänger-Themen 9
L fragen zu arrays Java Basics - Anfänger-Themen 8
L Fragen zu selbstgeschriebenem Programm Java Basics - Anfänger-Themen 5
M Fragen zum Auslesen von HTML Seiten Java Basics - Anfänger-Themen 5
J Threading-Aufgabe. Totale Noob Fragen, aber bitte trotzdem beantworten ;) Java Basics - Anfänger-Themen 7
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
K Erste Schritte Frage Antwort Spiel - Fragen zur Planung Java Basics - Anfänger-Themen 2
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
Anfänger2011 2 kleine Fragen zu ArrayListen Java Basics - Anfänger-Themen 5
S Fragen zu Ausdrücken&Bedingungen Java Basics - Anfänger-Themen 5
A 2 kurze Anfänger fragen Java Basics - Anfänger-Themen 6
H grundlegende Fragen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
N Programm: Fragen beantworten Java Basics - Anfänger-Themen 6
C Anfänger Anfänger Fragen Java Basics - Anfänger-Themen 8
Z Compiler-Fehler LinkedList Fragen Java Basics - Anfänger-Themen 4
D Rekursion Allgemeine Fragen Java Basics - Anfänger-Themen 2
D [Fragen] zu Methoden Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
T Ein paar Fragen zu OOP und Java. Java Basics - Anfänger-Themen 16
J Allgemeine Fragen zur GUI Java Basics - Anfänger-Themen 1
johnnydoe Erste Schritte Erster Blick - erste Fragen Java Basics - Anfänger-Themen 11
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
N Klassen fragen zur getter und setter methode Java Basics - Anfänger-Themen 11
S 3 Fragen, Verzeichnis, GridLayout psoitionieren, Werte für JSpinner Java Basics - Anfänger-Themen 2
T Fragen zu Set / Relationen verknüpfen Java Basics - Anfänger-Themen 4
S 2 Fragen Java Basics - Anfänger-Themen 4
S Hallo und Fragen zu Arbeitsverzeichnis und Menü Java Basics - Anfänger-Themen 8
N Java Fragen... Java Basics - Anfänger-Themen 10
F ExecutorService Fragen! Java Basics - Anfänger-Themen 2
O HashMap Fragen Java Basics - Anfänger-Themen 8
C Fragen zu Arrays Java Basics - Anfänger-Themen 19

Ähnliche Java Themen

Neue Themen


Oben