aus drei mach eins

broetchen

Erfahrenes Mitglied
moin

ich hab ne code-wust die is riesengroß
das problem is, die Funktionen eigentlich das selbe machen, nur auf verschiedene Werte zugreifen:

setTempPsiRang() setzt Ränge für die Temp-Werte des Tages
setGSPsiRang() setzt Ränge für die Globalstrahlungs-Werte des Tages
setRfPsiRang() setzt Ränge für die relative Feuchte-Werte des Tages

alle funktionen machen das gleiche, nur greift setTempPsiRang() aus t.Temp.Tagesmittel zu,
setGSPsiRang() greift auf t.GS.Tagesmittel zu und setRfPsiRang greift auf t.rF.Tagesmittel zu

das ganze wird also etwas unübersichtlich, wie man sieht.

meine frage also: gibt es irgendeine möglichkeit den code zu verallgemeinern und so die code-menge auf 1/3 zu reduzieren

Klasse Wert:
Code:
         public class Wert
	{
		public float Tagesmittel;
		public int PsiRang; //A2-Rangliste
		public double Psi;
		public int FRang; //A3-Rangliste
		public double F;
		public double FMinusPsi;
	
	
		public Wert(float mittel)
		{
			this.Tagesmittel = mittel;
			this.PsiRang = 0;
			this.Psi = 0;
			this.FRang = 0;
			this.F = 0;
			this.FMinusPsi = 0;
		}
	}

Klasse Tag:
Code:
         public class Tag
	{
		public int Day;
	
		public Monat Parent;
	
		public Wert Temp;
		public Wert rF;
		public Wert GS;
	
		public float WG_Tagesmittel;
	
	
		public Tag(int day, float temp, float rf, float gs, float wind,Monat parent)
		{
			this.Day = day;
			
			this.Temp = new Wert(temp);
			this.rF = new Wert(rf);
			this.GS = new Wert(gs);
			
			this.WG_Tagesmittel = wind;
			
			this.Parent = parent;
		}
		
		override public string ToString()
		{
			int year = Parent.Parent.YearNr;
			int month = Parent.MonthNr;
			int day = this.Day;
			
			return day.ToString()+"."+month.ToString()+"."+year.ToString();
		}
	}

desweiteren gibt es noch die Klasse Monat mit ner Hashtable wo die Tage drin sind(Keys sind die Date-Zahlen) und ne Klasse Jahr wo ne Hashtable mit den Monaten drin is(Keys sind Monatszahlen)
ganz oben steht eine Klasse Periode die ne Hashtable mit Jahren beinhaltet(Keys sind die Jahreszahlen) und den ganzen Funktionen

setTempPsiRang()
Code:
                 public void setTempPsiRang() //A2T-Ranglistenerzeugung
		{
			for(int i=1;i<=12;i++)
			{
				ArrayList tage = new ArrayList();
				int aktRang = 1;
				foreach(Jahr y in this.Jahre.Values)
				{
					Monat m = (Monat) y.Months[i];
					foreach(Tag t in m.Tage.Values)
					{
						tage.Add(t);
					}
				}
				while(tage.Count != 0)
				{
					Tag t = getMinTempTag(tage);
					t.Temp.PsiRang = aktRang;
					aktRang++;
					tage.Remove(t);					
				}
			}
		}

setGSPsiRang()
Code:
                 public void setGSPsiRang() //A2T-Ranglistenerzeugung
		{
			for(int i=1;i<=12;i++)
			{
				ArrayList tage = new ArrayList();
				int aktRang = 1;
				foreach(Jahr y in this.Jahre.Values)
				{
					Monat m = (Monat) y.Months[i];
					foreach(Tag t in m.Tage.Values)
					{
						tage.Add(t);
					}
				}
				while(tage.Count != 0)
				{
					Tag t = getMinGsTag(tage);
					t.GS.PsiRang = aktRang;
					aktRang++;
					tage.Remove(t);
				}
			}
		}

setRfPsiRang()
Code:
                 public void setRfPsiRang() //A2T-Ranglistenerzeugung
		{
			for(int i=1;i<=12;i++)
			{
				ArrayList tage = new ArrayList();
				int aktRang = 1;
				foreach(Jahr y in this.Jahre.Values)
				{
					Monat m = (Monat) y.Months[i];
					foreach(Tag t in m.Tage.Values)
					{
						tage.Add(t);
					}
				}
				while(tage.Count != 0)
				{
					Tag t = getMinRfTag(tage);
					t.rF.PsiRang = aktRang;
					aktRang++;
					tage.Remove(t);
				}
			}
		}



mfg broetchen
 
Hallo broetchen,

natürlich kannst du aus den drei Methoden eine machen, wenn der Code in jeder Methode sehr ähnlich ist. Dazu kannst du der Methode als Parameter einen Wert übergeben, an dem sie sich orientieren und die entsprechende Unterscheidung vornehmen kann.
Im Grunde genommen müssen ja nur zwei Zeilen aus der Methode ersetzt werden:
Code:
public void setPsiRang(string art)
{
	for(int i=1;i<=12;i++)
	{
		ArrayList tage = new ArrayList();
		int aktRang = 1;
		foreach(Jahr y in this.Jahre.Values)
		{
			Monat m = (Monat) y.Months[i];
			foreach(Tag t in m.Tage.Values)
			{
				tage.Add(t);
			}
		}
		while(tage.Count != 0)
		{
			switch(art) {
				case "temp":
				{
					Tag t = getMinTempTag(tage);
					t.Temp.PsiRang = aktRang;
				}
				case "gs":
				{
					Tag t = getMinGsTag(tage);
					t.GS.PsiRang = aktRang;
				}
				case "rf":
				{
					Tag t = getMinRfTag(tage);
					t.rF.PsiRang = aktRang;
				}
			aktRang++;
			tage.Remove(t);					
		}
	}
}

Das ist allerdings nur ein Beispiel. Wie du diese Unterscheidung vornimmst, bleibt natürlich dir überlassen. Evtl. kannst du auch direkt das Tag-Objekt an die Methode geben, auf dem du die Änderungen vornehmen möchtest, das würde den Code nochmals etwas kürzen.
 
Zurück