| 

.NET C# Java Javascript Exception

3
Hallo,
ich bastle mir einen Zinsrechner, der mir die Tage ausgeben soll,und zwar die die Differenz zwischen Anfangsdatum und Enddatum.
Die dazwischen liegenden Zeiträume haben unterschiedliche
Zinssätze, so dass diese gesondert wegen der Zinsenberechnung ausgegeben werden.
also:
vom 01.01.2010 - 31.03.2010 7,5 %
vom 01.04.2010 - 30.06.2010 8,0 %
vom 01.07.2010 - 30.09.2010 5,5 %
vom 01.10.2010 - 31.12.2010 6,3 %
vom 01.01.2011 - 31.03.2011 7,5 %
vom 01.04.2011 - 30.06.2011 4,0 %
vom 01.07.2011 - 30.09.2011 4,5 %
vom 01.10.2011 - 31.12.2010 7,3 %
Die Zeiträume erstrecken sich über ein paar Jahre.

Bisher habe ich mich mit if-Abfragen versucht, nur alle Varianten damit zu erfassen führt in den if - Wald.
Kann mir jemand einen Hinweis geben, wie ich das am geschicktesten angehe oder bleibt wirklich nur der Weg über die Abfrage?
Danke für einen Hinweis !
29.08.2013
Lukos 37 5
Wo kommen die Werte her?
lbm1305 30.08.2013
5 Antworten
1
Da Du noch zu wenig Informationen preisgegeben hast, wäre vielleicht folgender Code ein Vorschlag.

// Pseudocode
double Berechne(Zeitraum zeitraum, double zinssatz)
{
// Zeitraum => Zeitraum.Start, Zeitraum.Ende
var differenz = BerechneDifferenz(zeitraum);

var zinsenFuerZeitraum = BerechneZinsenFuerZeitraum(differenz, zinssatz);

return zinsenFuerZeitraum;
}
30.08.2013
lbm1305 849 1 8
lbm1305 849 1 8
0
Ich habe mir die Anfrage noch einmal angesehen und deshalb meine kletzte Antwort revidiert.
Verstehe ich das Problem richtig:
Es gibt eine Summe Geldes, die über einen Zeitraum Zinsen erbringen soll. Die Zinssätze im Zeitraum sind variabel.
Was soll nun ermittelt werden - der Betrag nach der Verzinsung unter Berücksichtigung der Datumsbereiche?

Bitte nähere Angaben machen, welche Ausgangsdaten vorliegen und was genau berechnet werden soll.

Soll der Endbetrag ermittelt werden, dann ist es meiner Sicht eine ganz einfache Standardzinsberechnung (taggenau) - Formeln in jedem Tafelwerk - die lediglich über mehrere Perioden durchgeführt werden muss (also Schleife). Das schwierigste daran sind einfache Datumsvergleiche in der Zeitreihe.
30.08.2013
edvservice 1,4k 1 6
0
Hallo,
vielen Dank, dass Ihr euch damit befasst.
@edvservice
Darf ich Dir mit einer Frage gegenantworten:
Der Code soll ausgeben:
z. B. wenn ich am 15.02.2010 Geld geborgt habe, mit wieviel an Zinsen muss ich den
Geldbetrag (Zins + Kapital) am 03.11.2011 zurückzahlen, letztlich ein Verzugzinsrechner.
Das Problem ist eben, dass es für verschiedene Zeiträume verschieden hohe Zinsen sind.
Das Beginndatum wie das Enddatum soll über Textfeld übergeben werden.
VG
PS.Die Zinsformel ist nicht mein Problem
ich habe bei meinen Versuchen bislang, jeweils eine if-Abfrage mit before und afte Startdatum bzw. Enddatum gearbeitet, aber da komme ich eben in den If- Wald
30.08.2013
Lukos 37 5
0
Ein weiterer Vorschlag.

Erstelle für jeden Zeitraum eine Klasse.
Als Basis sollte ein Interface dienen.

Vorteile
- Erstellen neuer Zeiträume ohne die Implementierung der anderen Klasse anzupassen
- Entfernen der Zeitraum-Berechnungen ohne die Implementierung anzupassen

//Pseudocode

public interface IZeitraum
{
double? Berechne(DateTime datum);
}

public class Zeitraum1 : IZeitraum
{
public double? Berechne(DateTime datum)
{
// wenn datum in Zeitraum, dann berechne den Zinssatz.
// sonst rückgabe bspw. null
return null;
}
}

public class Zeitraum2 : IZeitraum
{
public double? Berechne(DateTime datum)
{
// wenn datum in Zeitraum, dann berechne den Zinssatz.
// sonst rückgabe bspw. null
return null;
}
}

var zeitraeume = new IZeitraum[] { new Zeitraum1(), new Zeitraum2(), };

// Prüfe in jeder Klasse im Array, ob das Eingabe-Datum im Zeitraum liegt.
// Wenn ja, dann gib statt NULL die Klasse zurück.
IZeitraum instance = Array.Find(
zeitraeume,
zeitraum => zeitraum.Berechne(new DateTime(2013, 1, 15)) != null);

if (instance != null)
{
// Berechne und Verarbeite das Ergebnis.
}


Siehe auch:
http://de.wikipedia.org/wiki/Single-Responsibility-Prinzip
http://de.wikipedia.org/wiki/Open-Closed-Prinzip
http://de.wikipedia.org/wiki/Chain_of_Responsibility

Ggf. kannst Du die Klasse mit einer Factory-Klasse erzeugen. Dafür müsstes Du bspw. die Daten (Start, Ende, Zinssatz) über den Konstruktor der Zeitraumklasse mitgeben.

Die Daten können dann bspw. aus einer DB oder XML-Datei kommen.

EDIT:
Die Variante "Erstellen der Berechnung über Fabrikklasse"

// Pseudocode
public class ZeitraumFabrik
{
public IZeitraum Erstelle(DateTime start, DateTime ende, double zinsSatz)
{
return new Zeitraum(start, ende, zinsSatz);
}
}

public interface IZeitraum
{
double? Berechne(DateTime dateTime, double betrag);
}

public class Zeitraum : IZeitraum
{
private readonly DateTime _start;
private readonly DateTime _ende;
private readonly double _zinssatz;

public Zeitraum(DateTime start, DateTime ende, double zinssatz)
{
_start = start;
_ende = ende;
_zinssatz = zinssatz;
}

public double? Berechne(DateTime dateTime, double betrag)
{
// wenn datum in Zeitraum, dann berechne den Zinssatz.
// sonst rückgabe bspw. null

return null;
}
}

// Anwendung:
var fabrik = new ZeitraumFabrik();
var zeitRaeume = new List<IZeitraum>();

foreach (var line in datenFuerBerechnung)
{
var regel = fabrik.Erstelle(line.Start, line.Ende, line.ZinsSatz);

zeitRaeume.Add(regel);
}
01.09.2013
lbm1305 849 1 8
lbm1305 849 1 8
0
Hallo zusammen,
danke für die Anregungen.
ich bin noch vor dem Posting von ibm1305 die Sache mit if-Abfragen angegangen.
Ich werde mir aber den Vorschlag von ibm1305 genauer ansehen, und meine Sache anpassen.
Nachfolgend die erste if für die Halbjahre 2010 für die unterschiedliche Tagesanzahl(wegen der verschieden Zinssätze).Von hier aus kann man dann einfach die verschiedenen
Zinsbeträge ermitteln und summieren. Na ja, das ist eher handgemacht.
String beginnDate = "05.06.2013";
Date beginn = sdf.parse(beginnDate);

Date now = new Date();
Date aktuell = new Date(now.getTime());

if (beginn.getTime() >= HJ_2010_1A.getTime() // 1.HJ2010
&& beginn.getTime() <= HJ_2010_1E.getTime()) {
t = calculateDays(beginn,HJ_2010_1E);
t1 = calculateDays(HJ_2010_2A, HJ_2010_2E);
t2 = calculateDays(HJ_2011_1A, HJ_2011_1E);
t3 = calculateDays(HJ_2011_2A, HJ_2011_2E);
t4 = calculateDays(HJ_2012_1A, HJ_2012_1E);
t5 = calculateDays(HJ_2012_2A, HJ_2012_2E);
t6 = calculateDays(HJ_2013_1A, HJ_2013_1E);
t7 = calculateDays(HJ_2013_2A, aktuell);
}

Für weitere Anregungen, wie man das elegant lösen kann, bin ich dankbar.
VG
01.09.2013
Lukos 37 5
Ich habe meine Posting aktualisiert. Da findest Du den Ansatz mit einer Fabrik-Klasse
lbm1305 02.09.2013
1
Wie sieht es aus? Wenn Dir der Vorschlag geholfen hat, dann markiere diesen doch bitte als Antwort. Danke im Voraus.
lbm1305 04.09.2013

Stelle deine Java-Frage jetzt!