webForumDet fria alternativet

Förbättra struktur

.NETur .NET

6 svar · 238 visningar · startad av icaaq

icaaqMedlem sedan okt. 20005 273 inlägg
#1

Nu har jag gjort en kalender som jag ska använda till en sorts dagbok :)
Nu vill jag att ni här på wF ska granska den i detalj och komma med synpunkter på hur ni kanske hade gjort

Varsogoda:

[red]
void doMyCalender()
		{
			DateTime dteDate = DateTime.Now.Date;
			
			if (Request.QueryString["dteDate"] != "")
			{
				dteDate = Convert.ToDateTime(Request.QueryString["dteDate"]);
			}
			
			// Testar att göra en kalender
			int intDaysInMonth = DateTime.DaysInMonth(dteDate.Year, dteDate.Month);
			CultureInfo cultSwe = new CultureInfo("sv-SE");
			
			// Börjar att bygga en table
			Response.Write	("<Table id=\"Table1\" cellSpacing=\"0\" cellPadding=\"3\" width=\"300\" border=\"1\">\n" + 
							"<TR><TD colspan=\"3\">"+ dteDate.ToString("y"));
			doLinks(dteDate);
			Response.Write("</TD>");
			int i = 1;
			do
			{	
				dteDate =new DateTime(dteDate.Year, dteDate.Month, i);
				string strColor;
				if (dteDate.DayOfWeek.ToString("d") == "0")
				{
					strColor = "Peachpuff";
				}
				else if(dteDate.Date.ToString() == System.DateTime.Today.ToString())
				{
					strColor = "LightSteelBlue";
				}
				else
				{
					strColor = "White";
				}
					
				Response.Write ("<TR  bgColor=\""+strColor+"\">\n");
				Response.Write ("<TD Width=\"10%\">" + dteDate.ToString("dd", cultSwe)+"</TD><TD Width=\"90%\">"+ dteDate.ToString("dddd", cultSwe) +"</TD>");
				Response.Write ("</TR>\n");
				i ++;
			}while (i <= intDaysInMonth);
			
			Response.Write ("</Table>");
		}
		 public void doLinks(DateTime dteDate)
		{		
			Response.Write("<a href=\"default.aspx?dteDate="+dteDate.AddMonths(-1)+ "\" alt=\""+dteDate.AddMonths(-1)+ "\">&laquo;</a> <a href=\"default.aspx?dteDate="+dteDate.AddMonths(1)+ "\">&raquo;</a>");
		}
[/red]
developerMedlem sedan aug. 2001458 inlägg
#2

OK, här kommer mina funderingar :)

Prestandamässigt är det bättre att inte allokera så mycket på heapen som du gör. Tänk på följande:

1. Återanvänd samma kopia av cultSwe. Lägg cultSwe som en statisk medlemsvariabel eller på något annat bra ställe så den inte skapas om hela tiden. Som du gör nu kommer du skapa ett sådant objekt ca 30 gånger för att skriva ut en kalender. Åtminstone borde du skapa den på bara 1 ställe överst i din funktion.

2. Samma sak med dteDate, där gör du också ca 30 allokeringar på heapen som inte är nödvändiga. Skapa dteDate ovanför do-slingan. Sedan gör du AddDays(1) sist i loopen istället.

3. Du jämför datum som strängar i if-satsen. Gör istället

if (dteDate.DayOfWeek == 0)
{
	strColor = "Peachpuff";
}
else if(dteDate.Date == System.DateTime.Today)
{
	strColor = "LightSteelBlue";
}
else
{
	strColor = "White";
}

4. Inom Response.Write loopen gör du en flera gånger sträng-sammanslagningar. Det kommer att innebära allokeringar av System.String som du kan undvika. Gör istället Response.Write flera gånger eftersom ett funktionsanrop har lägre kostnad än allokering. Läs punkt 7 i http://samples.gotdotnet.com/quickstart/aspplus/doc/perftuning.aspx

NETworkMedlem sedan juni 20011 732 inlägg
#3

Det gör ont i mitt .net-hjärta när jag ser hur du bygger upp tabellen med response.write. ;) Titta på det här exemplet så får du ett tips på hur du ska göra:

http://samples.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/table/doc_table.aspx

NETworkMedlem sedan juni 20011 732 inlägg
#4

Sedan kan man ju förstås fråga sig varför du inte använder dig av den inbyggda kalenderkontrollen... där finns ju alla funktioner du behöver färdiga att användas och mer ändå:

Kalender: http://samples.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/Calendar/VB/Calendar5.aspx
Kod: http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/webforms/ctrlref/webctrl/Calendar/Calendar5.src&file=CS\calendar5.aspx&font=3

icaaqMedlem sedan okt. 20005 273 inlägg
#5

Tack

2. Samma sak med dteDate, där gör du också ca 30 allokeringar på heapen som inte är nödvändiga. Skapa dteDate ovanför do-slingan. Sedan gör du AddDays(1) sist i loopen istället.

Hur ska jag då skriva vid while?

NETwork--- Jag ska kolla in det där och återkommer sen med resultat ;)

icaaqMedlem sedan okt. 20005 273 inlägg
#6

NETwork skrev:

Sedan kan man ju förstås fråga sig varför du inte använder dig av den inbyggda kalenderkontrollen... där finns ju alla funktioner du behöver färdiga att användas och mer ändå:

Kalender: http://samples.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/Calendar/VB/Calendar5.aspx
Kod: http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/webforms/ctrlref/webctrl/Calendar/Calendar5.src&file=CS\calendar5.aspx&font=3

För jag vill inte ha en sån modell ;) Skämt ossidå så kommer jag nog att använda en sådan senare, men för att jag ska lära mig detta nån gång testade jag att göra en egen.

icaaqMedlem sedan okt. 20005 273 inlägg
#7

Ok nu har jag möblerat om lite :) Och jag kommer att studera länken om tabellbygnationen under dagen.
Men ni kan väl kolla vad jag gjort så länge:

[red]
void doMyCalender()
		{
			// Testar att göra en kalender
			DateTime dteDate = DateTime.Now.Date;
			CultureInfo cultSwe = new CultureInfo("sv-SE");
			if (Request.QueryString["dteDate"] != null)
			{
				dteDate = Convert.ToDateTime(Request.QueryString["dteDate"]);
			}
			int intDaysInMonth = DateTime.DaysInMonth(dteDate.Year, dteDate.Month);
			// Börjar att bygga en tabel.
			Response.Write("<Table id=\"Table1\" cellSpacing=\"0\" cellPadding=\"3\" width=\"300\" border=\"1\">\n");
			Response.Write("<TR><TD colspan=\"3\">");
			Response.Write(dteDate.ToString("y"));
			doLinks(dteDate);
			Response.Write("</TD>");
			string strColor;
			DateTime dteDay = new DateTime(dteDate.Year, dteDate.Month, 1);
			int i = 0;
			do
			{					
				if (dteDay.DayOfWeek == 0)
				{
					strColor = "Peachpuff";
				}
				else if(dteDay.Date == System.DateTime.Today)
				{
					strColor = "LightSteelBlue";
				}
				else
				{
					strColor = "White";
				}
					
				Response.Write ("<TR  bgColor=\""+strColor+"\">\n");
				Response.Write ("<TD Width=\"10%\">" + dteDay.ToString("dd", cultSwe)+"</TD><TD Width=\"90%\">"+ dteDay.ToString("dddd", cultSwe) +"</TD>");
				Response.Write ("</TR>\n");
				i ++;
				dteDay = dteDay.AddDays(1);
			}while (i <= intDaysInMonth);			
			Response.Write ("</Table>");
		}
		 public void doLinks(DateTime dteDate)
		{		
			 
			Response.Write("<a href=\"default.aspx?dteDate="+dteDate.AddMonths(-1)+ "\" alt=\""+dteDate.AddMonths(-1)+ "\">&laquo;</a> <a href=\"default.aspx?dteDate="+dteDate.AddMonths(1)+ "\">&raquo;</a>");
		}[/red]

Nu börjar det bli roligt :e

138 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)