webForumDet fria alternativet

Förenkla och förminska?

.NET

22 svar · 767 visningar · startad av CatZ

Medlem sedan jan. 20022 440 inlägg
Frågan#1

Har skapat en klass "User" som ska innehålla en massa information om användare (givetvis) men tycker att det ser tråkigt ut när jag kollar i min class.

public class User
{
	#region Private Member Variables
	private int userid;
	private string username;
	private string email;
	private string password;
	private string fullname;
	private string address;
	private int mpnid;
	private int phone;
	private string signature;
	private string skype;
	private string msnmessenger;
	private int icq;
	private string yahoomessenger;
	private string lastlogindate;
	private bool adminaccess;
	private bool resultaccess;
	private bool writeaccess;
	private bool useraccess;
	private bool active;
	#endregion

	#region Constructors
	public User() { }
	public User
		(
			int userid, 
			string username, 
			string email, 
			string password, 
			string fullname, 
			string address, 
			int mpnid, 
			int phone,
			string signature, 
			string skype, 
			string msnmessenger, 
			int icq, 
			string yahoomessenger, 
			string lastlogindate, 
			bool adminaccess, 
			bool resultaccess, 
			bool writeaccess, 
			bool useraccess, 
			bool active
		)
	{
		this.userid = userid;
		this.username = username;
		this.email = email;
		this.password = password;
		this.fullname = fullname;
		this.address = address;
		this.mpnid = mpnid;
		this.phone = phone;
		this.signature = signature;
		this.skype = skype;
		this.msnmessenger = msnmessenger;
		this.icq = icq;
		this.yahoomessenger = yahoomessenger;
		this.lastlogindate = lastlogindate;
		this.adminaccess = adminaccess;
		this.resultaccess = resultaccess;
		this.writeaccess = writeaccess;
		this.useraccess = useraccess;
		this.active = active;
	}
	#endregion

	#region Public Properties
	public int UserID
	{
		get { return userid; }
		set { userid = value; }
	}
	public string UserName
	{
		get { return username; }
		set { username = value; }
	}
	public string Email
	{
		get { return email; }
		set { email = value; }
	}
	public string Password
	{
		get { return password; }
		set { password = value; }
	}
	public string FullName
	{
		get { return fullname; }
		set { fullname = value; }
	}
	public string Address
	{
		get { return address; }
		set { address = value; }
	}
	public int MpnID
	{
		get { return mpnid; }
		set { mpnid = value; }
	}
	public int Phone
	{
		get { return phone; }
		set { phone = value; }
	}
	public string Signature
	{
		get { return signature; }
		set { signature = value; }
	}
	public string Skype
	{
		get { return skype; }
		set { skype = value; }
	}
	public string MsnMessenger
	{
		get { return msnmessenger; }
		set { msnmessenger = value; }
	}
	public int ICQ
	{
		get { return icq; }
		set { icq = value; }
	}
	public string YahooMessenger
	{
		get { return yahoomessenger; }
		set { yahoomessenger = value; }
	}
	public string LastLoginDate
	{
		get { return lastlogindate; }
		set { lastlogindate = value; }
	}
	public bool AdminAccess
	{
		get { return adminaccess; }
		set { adminaccess = value; }
	}
	public bool ResultAccess
	{
		get { return resultaccess; }
		set { resultaccess = value; }
	}
	public bool WriteAccess
	{
		get { return writeaccess; }
		set { writeaccess = value; }
	}
	public bool UserAccess
	{
		get { return useraccess; }
		set { useraccess = value; }
	}
	public bool Active
	{
		get { return active; }
		set { active = value; }
	}
	#endregion
}

Kan jag förenkla / minska den på nåt vis? Jag har en massa idéer på hur jag skulle kunna göra men har inte vågat ändra för mycket :)

Medlem sedan jan. 20022 440 inlägg
#2

användarkontots rättigheter borde jag väl med fördel kunna använda mig av enum istället och ha en metod för getUserType istället och byta ut alla access mot UserType eller MemberType?

Medlem sedan aug. 20003 575 inlägg
#3

Jag hade gjort såhär.

Du har t.ex. flera IM fält bryt ut dom mot en lista med IM objekt.
Du har flera Access bryt ut dom till ett eget objekt.

Om du hade haft fler parametrar till Adress och namn hade jag brutit ut dom också.

Medlem sedan jan. 20022 440 inlägg
#4

Nickemannen skrev:

Jag hade gjort såhär.

Du har t.ex. flera IM fält bryt ut dom mot en lista med IM objekt.
Du har flera Access bryt ut dom till ett eget objekt.

Om du hade haft fler parametrar till Adress och namn hade jag brutit ut dom också.

Hmm jag funderade på en lista men innebär inte det att jag måste stoppa just IM i en egen klass?

Medlem sedan aug. 20003 575 inlägg
#5

Ne det kan visserligen vara en lista med strängar.
Borde vara det eftersom det bara är en sträng som skall sparas.

Medlem sedan juni 20003 076 inlägg
#6

Nån speciell anledning till att du har en konstruktor med alla dessa variablar?
Själv är jag lite allergisk mot sånt! :)
För samtidigt har du ju alla fält som publika egenskaper, känns som om det räcker!
Men vad vet jag, är lite full just nu! Skål! :bire
Annars är nog klassen så rolig som den kan bli! :)

Medlem sedan feb. 2005280 inlägg
#7

Ja ibland känner jag att det rentav kan räcka men en liten struct istället (less is more som vi säger när vi spelar i bandet)

Medlem sedan juni 20003 076 inlägg
#8

När det gäller rättigheter så har jag lite dåliga erfarenheter när man sätter dem direkt på användaren. Ju mer man bygger ut och ju fler användare det blir så vet man till slut inte vad användarna får göra och inte får göra. Bättre då att flytta all behörighet till grupper istället och så gör du en List<> med användarens grupper i. :)

Medlem sedan jan. 20022 440 inlägg
#9

doggelito skrev:

När det gäller rättigheter så har jag lite dåliga erfarenheter när man sätter dem direkt på användaren. Ju mer man bygger ut och ju fler användare det blir så vet man till slut inte vad användarna får göra och inte får göra. Bättre då att flytta all behörighet till grupper istället och så gör du en List<> med användarens grupper i. :)

Ja det var ungefär vad nicke förslog ;)

Medlem sedan jan. 20022 440 inlägg
#10

Jag är lite vilsen om jag ska vara helt ärlig!

enum IM { Skype, MsnMessenger, Icq, YahooMessenger }

skulle väl gå att använda till nåt. Annars kanske en IList skulle funka men jag begriper inte hur jag skulle binda värden till min IList...

		public IList IM
		{
			get { return im; }
			set { im = value; }
		}

lär ju inte vara rätt metod. Man kan ju lägga till i en ILIst men hur då i det här fallet? Jag har läst för mycket om DDD och Patterns det sista och nu är jag helt vilsen i programmeringen.... allt har blivit kaos :)

Medlem sedan juni 20003 076 inlägg
#11

Varför inte skapa en im klass som du sedan fyller i din user med en List<im> som innehåller alla messangers som användaren har tillgång till?

Medlem sedan jan. 20022 440 inlägg
#12

Jag hade tänkt det från början, sedan hörde jag att varje klass ska ha en ege fil och det känns väldigt lite för en sådan fil när det ändå bara kommer tillhöra user...

Antar att jag får lämna det bakom mig och ha dubbla klasser tillsvidare

Medlem sedan jan. 20022 440 inlägg
#13

Har möblerat om lite... tror det kommer bli lite snyggare såhär.

[Flags()]
public enum Permissions
{ 
	None = 0,
	Administer = 1, 
	PostResults = 2, 
	PostNews = 4,
	User = 8,
	All = Administer | PostResults | PostNews | User
}

public class User
{
	#region Private Member Variables
	private int userid;
	private string username;
	private string email;
	private string password;
	private string fullname;
	private string address;
	private int mpnid;
	private int phone;
	private string signature;
	private IList<IM> im;
	private DateTime lastlogindate;
	private Permissions _permission = Permissions.None;
	private bool active;
	#endregion

	#region Constructors
	public User() { }
	#endregion

	#region Public Properties
	public int UserID
	{
		get { return userid; }
		set { userid = value; }
	}
	public string UserName
	{
		get { return username; }
		set { username = value; }
	}
	public string Email
	{
		get { return email; }
		set { email = value; }
	}
	public string Password
	{
		get { return password; }
		set { password = value; }
	}
	public string FullName
	{
		get { return fullname; }
		set { fullname = value; }
	}
	public string Address
	{
		get { return address; }
		set { address = value; }
	}
	public int MpnID
	{
		get { return mpnid; }
		set { mpnid = value; }
	}
	public int Phone
	{
		get { return phone; }
		set { phone = value; }
	}
	public string Signature
	{
		get { return signature; }
		set { signature = value; }
	}
	public IList<IM> IM;

	public DateTime LastLoginDate
	{
		get { return lastlogindate; }
		set { lastlogindate = value; }
	}
	public Permissions Permission
	{
		get { return _permission; }
		set { _permission = value; }
	}
	public bool Active
	{
		get { return active; }
		set { active = value; }
	}
	#endregion
}

public class IM
{
	private string _skype;
	private string _msnmessenger;
	private string _yahoomessenger;
	private int _icq;

	public string Skype
	{
		get { return _skype; }
		set { _skype = value; }
	}
	public string MsnMessenger
	{
		get { return _msnmessenger; }
		set { _msnmessenger = value; }
	}
	public int ICQ
	{
		get { return _icq; }
		set { _icq = value; }
	}
	public string YahooMessenger
	{
		get { return _yahoomessenger; }
		set { _yahoomessenger = value; }
	}
}
Medlem sedan feb. 2005280 inlägg
#14

Fiffig enum där med All, visste jag inte:-)

Och inte vet jag vad Flags() attributet gör för något?

Medlem sedan jan. 20022 440 inlägg
#15

Det är för att du ska kunna jämföra har jag för mig

Medlem sedan feb. 20002 300 inlägg
#16

CatZ skrev:

Det är för att du ska kunna jämföra har jag för mig

Det stämmer. Flags-attributet säger att följande enum är ett bitfält som logiska uttryck som t.ex. AND och OR ska kunna operera på.

Medlem sedan feb. 2005280 inlägg
#17

Ah vad smutt, det är ju verkligen användbart!

Medlem sedan jan. 20022 440 inlägg
#18

Tror att detta ska fungera om du sedan vill kolla om en användare har tillstånd

public bool HasPermission(Permissions _permissionToCheck)
{
	int _permission = Permissions.All;
	return ((_permissionToCheck & _permission) == _permissionToCheck);
}
Medlem sedan juni 20003 076 inlägg
#19

Nu vet jag inte hur din databas ser ut men rent spontant så hade jag nog inte gjort im klassen så där.
För mig hade den nog sett ut typ:

public class IM
{
     private int id;
     private string name;
     private string username;

     public ...

och sedan lagt alla mess. programmen i en egen tabell i databasen med relation till users för att på så sätt slippa hårdkodningar av programmen.
det blir enkelt då att lägga till ett mess. program då om du skulle vilja! :)

Medlem sedan jan. 20022 440 inlägg
#20

Jag kommer i dagsläget inte ha någon användning av IM alls, det är ett framtida projekt och ingenting som jag bryr mig så himla mycket om men jag håller med dig om att det blir lite bättre maintainability då.

Däremot tror jag inte det kommer sådär himla många nya chatprogram som folk kommer använda sig av.

Själv har jag testat det mesta men lagt ner allt utom Live Messenger.

259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)