webForumDet fria alternativet

Synpunkter.

10 svar · 396 visningar · startad av icaaq

icaaqMedlem sedan okt. 20005 273 inlägg
#1

Jag har tänkt om lite och testar lite OOP. Och nu har jag tänkt att presentera den första delen i objektet.

[red]using System;

namespace Kalendern
{
	/// <summary>
	/// Summary description for kalender.
	/// </summary>
	public class kalender
	{
		private int myDays;
		private DateTime queDate;
		private DateTime dteNow;
		public int intDays
		{
			get
			{
				return myDays;
			}
			set
			{
				if(queDate != null)
				{
					dteNow = new DateTime.Now();
					myDays = DateTime.DaysInMonth(dteNow.Year, dteNow.Month);
				}
				else
				{
					myDays = DateTime.DaysInMonth(queDate.Year, queDate.Month);
				}
			}
		}
	}
}
[/red]

Jag skulle bara vilja ha lite synpunkter eller förslag på hur jag ska göra eller skulle ha gjort.

mvh icaaq

icaaqMedlem sedan okt. 20005 273 inlägg
#2

Men denna funkar ju inte

[red][b]if(queDate != null)[/b][/red]

hur kollar man i C# om queDate är ett giltigt datum eller om det är null :q

mvh icaaq

GrynetMedlem sedan maj 2001329 inlägg
#3

Tjipp.

att kolla DateTime mot null gå icke eftersom DAteTime är en struct och valuetypes (dvs structs mm) ej kan vara null. Så sätt ditt DateTime till DateTime.MinValue och testa sen mot detta istället för mot null.

Angående förslag och sånt:

Det är lite svårt att säga något om det egentliga OO och hur bra det är uppbygt man måste nästan se alla klasser för att kunna säga någe vettigt. Denna klass ser dock helt ok ut.

och så det lite petnoga: ;)

Du har blandat engelska och svenska på variabler namn. Jag föredrar att använda ett språk och då enbart engelska.

Att döpa namespacet och klassen till samma sak är obra. Försök ge namespacet ett mkt mer generellt namn.

Din accessor intDays döp den till Days. Det är överflödigt att döpa den till int eftersom dess return typ ges av return typen.
Sen brukar jag alltid döpa accessorns interna private variabel till samma namn fast med små bokstäver. Alltså days istället för myDays.

dteNow kan du kasta in i set satsen så slipper du ha den som private member.

Ok, detta var kanske lite löjlilgt och då ska man alltid om man är pedagogisk förklara varför..eller hur :)

Anledningen till alla dessa över är att man ska använda ett standaliserat sätt att skriva kod på. Detta spelar ju ingen roll för hemma snickraren börje men sitter man på ett större företag där ett tiotal pers ingår i ens projekt gäller det att alla döper sina variabler etc på ett liknande sätt (vilket i och för sig projektledaren redan gjort).

dteNow ska flyttas in för att man ska använda så få globala variabler som möjlilgt. Vilket medför att klassen tar mindre plats i minnet.

Och dessa petnoga regler kommer ifrån

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconnamingguidelines.asp

Behöver man ideer till hur man ska döpa saker så är det enklaste att ta en titt på hur de har döpt sakerna i frameworket.

Nåja en hel uppsatts bidde det, hoppas det var till någon nytta :stud

icaaqMedlem sedan okt. 20005 273 inlägg
#4

Grynet skrev:

Nåja en hel uppsatts bidde det, hoppas det var till någon nytta :stud

Tack detta var precis vad jag behövde :)

Jag återkommer ;)

icaaqMedlem sedan okt. 20005 273 inlägg
#5

Grynet skrev:

Att döpa namespacet och klassen till samma sak är obra. Försök ge namespacet ett mkt mer generellt namn.

Har du något inte så obra förslag ;)

ZyaxMedlem sedan mars 200262 inlägg
#6

Namespacet borde väl heta Icaaq eller något annat som refererar till vad det är eller kommer ifrån.

Om jag gör en klass som hör till programmet "MrMagic" så bör väl namespacet till programmet heta MrMagic. Om du skall göra ett antal klasser till detta program som skall användas någon annanstans bör klasserna heta såsom microsofts egna tillägg heter (t ex Microsoft.Web.UI.WebControls) om det är en webcontrol. I ditt fall kanske: Icaaq.Web.UI.WebControls. Nu är det ingen webcontrol du har gjort men du kanske hittar något annat bra namespace i .NET som du bygger din kod på??

icaaqMedlem sedan okt. 20005 273 inlägg
#7

hur ska jag göra detta

[red]	public class calender
	{
		private int days;
		private DateTime date;
		private int daysinmonth;
		public int Days
		{
			[b][i](1) [/i]get[/b]
			{
				[b][i](2) [/i]if(daysinmonth == 0)[/b]
				{
					days = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
				}
				else
				{
					days = daysinmonth;
				}	
			}
		}
		public DateTime Date
		{
			get
			{
				return date;
			}
			set
			{
				date = value;
				daysinmonth = DateTime.DaysInMonth(value.Year, value.Month);
			}
		}
	}[/red]

Får följande fel
1. icaaq.calender.Days.get': not all code paths return a value.

Det är alltså vid (2:an) som jag måste kolla om det är nått värde tillsatt, hur kollar jag det :q

mvh icaaq

PatrikBMedlem sedan mars 20002 836 inlägg
#8

Här kommer en lösning ... i VB då förståss :e

<%@ Page Language="VB" %>
<%@ import Namespace="System" %>
<script runat="server">

    ' Insert page code here
    '
    Public Sub Page_Load(sender As Object, e As EventArgs)
    
        Dim _specDate As New SpecialDates()
    
        '## -- unquote next line to test daysinmonth with a date specified by You --
        '_specDate.TodaysDate = CDate("2004-02-13")
        Label1.Text = CStr(_specDate.DaysInMonth)
    End Sub
    
    Public Class SpecialDates
    
        Private _date As DateTime
    
        Public Property TodaysDate() As DateTime
    
            Set(ByVal value As DateTime)
                _date = value
            End Set
            Get
                return _date
            End Get
    
        End Property
    
        Public Function DaysInMonth() As Integer
            Dim TempDate As DateTime
            TempDate = DateTime.Now()
    
            If (_date.MinValue.ToString() <> "00:00:00") Then
                return Int32.Parse(_date.DaysInMonth(_date.Year, _date.Month))
            Else
                return Int32.Parse(TempDate.DaysInMonth(TodaysDate.Year, TempDate.Month))
            End If
    
        End Function
    
    End Class

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:Label id="Label1" runat="server"></asp:Label>
        <!-- Insert content here -->
    </form>
</body>
</html>

du får väl bryta ut klassen. Nu är den inbakad för att kunna testa den utan att kompilera om hela tiden ;)

cya,
PatrikB

icaaqMedlem sedan okt. 20005 273 inlägg
#9

Jag tänkte lite fel!!! :r
Så här kunde jag ju göra

[red]
public class calender
	{
		private DateTime date;
		private int daysinmonth = 0;
		public int Days
		{
			get
			{
				if(daysinmonth != 0)
				{
					return daysinmonth;
				}
				else
				{
					return DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
				}	
			}
		}
		public DateTime Date
		{
			get
			{
				return date;
			}
			set
			{
				date = value;
				daysinmonth = DateTime.DaysInMonth(value.Year, value.Month);
			}
		}
	}[/red]

Jag återkommer ;)

icaaqMedlem sedan okt. 20005 273 inlägg
#10

Nästa fråga ;)
Hur ska jag göra då jag skapar en HtmlTable i classen calender. Jag vill ju då kunna placera den på sidan, men hur gör jag då? jag vill alltså göra en egen <tag>

mvh icaaq

PatrikBMedlem sedan mars 20002 836 inlägg
#11

dvs, du vill göra en egen calender control.

Kika in denna artikel (del 1 av 2)

Den visar hur man gör en "custom datagrid control".
Du får göra på ngt liknande sätt, eller, spara bara som en .ascx fil som du "länkar" in i .aspx sidan där du vill att den ska synas

cya,
PatrikB

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