webForumDet fria alternativet

Bolla lite idéer om OOP arv i VB.NET

.NET

8 svar · 398 visningar · startad av PDahlen

Medlem sedan apr. 2004778 inlägg
Frågan#1

Här kommer en liten metodikfråga.

Jag bygger ett framework som skall ligga till grund för flera olika applikationer.
Beroende på applikation så finns det vissa objekt som har olika antal egenskaper. Min första tanke är då självklart arv. En baseclass som de olika versionerna ärver ifrån.

En stor nackdel med att sitta själv och jobba är att man inte har något bollplank för sina idéer så jag tänkte kolla om någon här vill ge lite åsikter om detta.

T.ex. mina användare

UserBase
  ID
  FirstName
  LastName
  Email
  Password
  Active

UserExtended Inherits UserBase
  Address1
  Address2
  Zip
  City
  Phone
  Mobile
  Fax
  Notes

UserSubscriber Inherits UserExtended
  CC
  CCMonth
  CCYear
  CCType
  Instructions

UserCompany Inherits UserExtended
  Company
  Department
  Extension
  Title

Nu är dessa lite förenklade, men själva tanken bakom är som sagt att ha en BaseClass som övriga klasser ärver från, och det är väl grunden i objekt-orienterad programmering.

Om man då skapar en UserSubscriber så skulle man i denna klass New() först köra MyBase.New() och sedan fylla sina egna variabler, osv.

Hur känns det här för er övriga OOP-freak?
Ser ni något som talar emot den här tekniken? Grotta inte ner er i själva egenskaperna och att det är Users, jag har samma upplägg för t.ex. produkter (grundprodukter, livsmedel, luftfilter, bilar, m.m.)

Medlem sedan okt. 2002188 inlägg
#2

Hej

Satt å skrev ett försök till svar på detta på pellesoft men fick inte till något bra :-). Är på inget sett en oopfreak men tycker det är väldigt skoj. Problemet som jag fastnade på vart att man inte riktigt vet i vilket sammanhang objekten skall leva i. Men tex UserCompany, jag tror att det är en användare i ett företag?

I så fall så skulle jag istället skapa en klass för en person. Denna personen har sedan en roll Anställd som också är en klass. Anställd innehåller mao ett person objekt, men ärver inte från person objektet. Samma person skall kunna bli ägare i företaget, genom att tilldela en ägarroll till detta person objekt.

Jag har lärt mig detta genom boken streamlined object modeling, och har precis börjat ändra om min egen kod, så jag är inte helt säkert på om det fungerar och blir bra.

Medlem sedan feb. 200112 078 inlägg
#3

Jag förstår inte riktigt upplägget, men kanske är det för att jag inte är något vidare på hela OOP-snacket.

Är UserBase och UserExtended egna klasser? Och vad gör/är alla benämningar som ID och FirstName, för de är ju inte metoder i klassen iallafall? :)

Medlem sedan juli 20011 304 inlägg
#4

Enilgt skolbokens alla regler känns ditt upplägg bra.
Problemet som jag brukar stöta på är att man kanske gör saker och ting lite väl komplicerade ibland. Rent programmeringsmässigt kan det bli väldigt mycket enklare att hantera endast en userclass även om man kan bryta ner den och overheaden i just detta fallet är inte särskilt stor.

Sen håller jag med de andra om att det skulle vara lättare att utveckla tankarna om man hade ett sammanhang att sätta det hela i.

Men jobbar man mycket med t.ex roller tycker jag att din modell kan passa bra in eftersom det säkert tillkommer funktioner som endast är dedikerade för vissa roller också.

Det jag ser som mycket positivt i sammanhanget är att du inte har gjort som ack så många andra och utgåt från en datamodell utan har tänkt objekt/klasser från början.
En stor fördel är att du slipper aggregera t.ex company och department som ju är klasser i sig själva där det inte behövs.

Fortsätt att utveckla dina idéer och gör gärna ett UML-diagram så blir det lättare för utomstående att förstå hur du tänker :)

En sak: eftersom alla ärver UserExtended kan steget UserBase->UserExtended kännas överflödigt i mina ögon.

Medlem sedan juni 20008 205 inlägg
#5

Re: Bolla lite idéer om OOP arv i VB.NET

PDahlen skrev:

Beroende på applikation så finns det vissa objekt som har olika antal egenskaper. Min första tanke är då självklart arv. En baseclass som de olika versionerna ärver ifrån.

Det beror på hur du tänker använda dem. Finns det något tillfälle då du verkligen kommer behöva att använda t.ex. en UserSubscriber på samma sätt som en UserCompany? Om ja, fortsätt på din inslagna väg. Om nej, avbryt. Ärv inte för att spara dig själv besväret att skriva några variabelnamn igen, utan för att du faktiskt behöver polymorfismen.

Medlem sedan apr. 2004778 inlägg
#6

Walker

I så fall så skulle jag istället skapa en klass för en person. Denna personen har sedan en roll Anställd som också är en klass. Anställd innehåller mao ett person objekt, men ärver inte från person objektet. Samma person skall kunna bli ägare i företaget, genom att tilldela en ägarroll till detta person objekt.

Ja, det upplägget är ju också en tanke. Ska titta lite närmare på det. Tack för tipset om boken också

Overload

Jag förstår inte riktigt upplägget, men kanske är det för att jag inte är något vidare på hela OOP-snacket.

Är UserBase och UserExtended egna klasser? Och vad gör/är alla benämningar som ID och FirstName, för de är ju inte metoder i klassen iallafall?

Ja, alla är egna klasser. Jag har inte tagit med några metoder här utan bara egenskaper. UserBase är grundklassen som de övriga ärver från. I övrigt så ärver UserBase från en annan Base-klass där jag har gemensamma metoder som behövs på andra ställen också.

Jon

Enilgt skolbokens alla regler känns ditt upplägg bra.
Problemet som jag brukar stöta på är att man kanske gör saker och ting lite väl komplicerade ibland. Rent programmeringsmässigt kan det bli väldigt mycket enklare att hantera endast en userclass även om man kan bryta ner den och overheaden i just detta fallet är inte särskilt stor.

Ja, det blir lätt att man driver iväg och gör saker lite väl komplicerade. Bryter ner allt i minsta beståndsdelar, osv. Det är nog något som sitter i ryggmärgen sen skoltiden. ;)
Att använda bara en userclass har självklart slagit mig, men anledningen att jag gjort så här är att jag i min första version av ramverket byggt 4 olika applikationer. Mina User-klasser har uppkommit från vad jag använder i de olika applikationerna. Det minsta jag behöver för en applikation är det som är i UserBase.
Men som sagt, nu gäller detta inte bara användare utan även t.ex. produkter.

Men jobbar man mycket med t.ex roller tycker jag att din modell kan passa bra in eftersom det säkert tillkommer funktioner som endast är dedikerade för vissa roller också.

Japp, jag jobbar med roller. Utöver dessa klasser har jag Role, Permission, PermissionCategory, osv. Varje UserBase-klass har t.ex. en collection av roller.

Det jag ser som mycket positivt i sammanhanget är att du inte har gjort som ack så många andra och utgåt från en datamodell utan har tänkt objekt/klasser från början.
En stor fördel är att du slipper aggregera t.ex company och department som ju är klasser i sig själva där det inte behövs.

Det är just det här som gjort att jag tänker så här. Om jag har en basic-applikation så har jag aldrig några behov av något annat än UserBase.

Fortsätt att utveckla dina idéer och gör gärna ett UML-diagram så blir det lättare för utomstående att förstå hur du tänker

Jo, jag har ett UML-diagram också, det började bli för stort för att hålla kontroll över det annars. :)

En sak: eftersom alla ärver UserExtended kan steget UserBase->UserExtended kännas överflödigt i mina ögon.

Anledningen till att dessa två är uppdelade är att jag i mina små applikationer aldrig har användning för det som finns i Extended. Det kändes naturligt att göra en uppdelning.

Spango

Det beror på hur du tänker använda dem. Finns det något tillfälle då du verkligen kommer behöva att använda t.ex. en UserSubscriber på samma sätt som en UserCompany? Om ja, fortsätt på din inslagna väg. Om nej, avbryt. Ärv inte för att spara dig själv besväret att skriva några variabelnamn igen, utan för att du faktiskt behöver polymorfismen.
[/user]
Jag använder alla mina User-klasser på samma sätt, det är därför jag använder arv.
Om man jämför de två applikationerna jag har idag som använder UserSubscriber och UserCompany så använder de båda alla egenskaper och metoder från Extended och Base. Däremot så har de ingen användning för den andres egenskaper och metoder.
Men när det gäller just dessa två så måste jag ta en runda till, jag är inte helt säker på att det aldrig kommer dyka upp möjligheten att UserCompany behöver det som finns i UserSubscriber. Man kan ju inte förbereda för allt och det tänker jag inte göra, det är därför jag har mina klasser istället så om det dyker upp nya behov så ärver jag från dessa och skapar en ny unik klass med andra egenskaper.
I användar-fallet så kommer jag även i en annan applikation behöva en projektanvändare som ärver UserCompany.

Jag använder inte arv för att spara mig själv något besvär. Jag skriver om allt så många gånger att det inte spelar någon roll. ;)

Medlem sedan okt. 2002188 inlägg
#7

Hej

Satt å surfade runt lite och hittade den här länken där det diskuterars en del om arv.

mer om lsp

PDahlen skrev:

Ja, det upplägget är ju också en tanke. Ska titta lite närmare på det. Tack för tipset om boken också

np.. Säg till om du läser den. Har ganska mycket funderingar runt deras principer.

EDIT: la till en länk om lsp till :)

Medlem sedan apr. 2004778 inlägg
#8

Har beställt boken och den borde komma om ett par dagar. :)

Medlem sedan maj 20012 812 inlägg
#9

Tycker det verkar vettigt, tänk dock på att du inte kan göra multipla arv. Så om du vill att någon av dina klasser skall ärva en annan klass, så måste du göra detta på din basklass och då kommer alla dina klasser automatiskt få detta arv, det kanske man inte vill alltid.

Ett annat förslag är att inte använda dig av arv, utan av Interface om du vill ha möjligheten att låta en eller flera av dina klasser ärva av olika andra klasser.

Så jag håller med Spango, var restriktiv med arven, specillet då man inte kan göra multipla arv i .NET. Kankse Interface kan lösa dina problem lika bra. De kräver ju dock att man skriver samma kod till alla klasser så du lär inte spara kodrader utan istället skriva fler.

- M

361 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
228 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
228 ms — ändringar (db)