Avatar billede websam Nybegynder
14. marts 2006 - 17:56 Der er 32 kommentarer og
2 løsninger

Interface i forbindelse med business lag ?

Hejsa,

Kort fortalt så laver jeg en factory klasse som sørger for at sende den respektive klasse til mit designlag :

Public Class BusinessFactory
    Public Shared Function LoadClass(ByVal Type As String) As MitInterface
        Select Case Type
            Case "class1"
                Return New Class1
            Case "class2"
                Return New Class2
            Case Else
                Return Nothing
        End Select
    End Function
End Class

Mit interface holder så på en række metoder :

Public Interface MitInterface
    Metode1() As Boolean
    Metode2() As Boolean
    Metode3() As Boolean
    Metode4()As Boolean
End Interface

Jeg har så to el. flere klasser :

Friend Class Class1
    Implements MitInterface
    Metode1() As Boolean
    Metode2() As Boolean
End Class

Friend Class Class2
    Implements MitInterface
    Metode3() As Boolean
    Metode4() As Boolean
End Class

Men det duer jo ikke helt da den så brokker sig over at jeg skal have alle 4 metoder med i hver af mine klasser. Hvordan skal jeg gribe det an ?

/Websam
Avatar billede driis Nybegynder
14. marts 2006 - 18:00 #1
Jeg ville bruge et interface for hver klasse. Et interface definerer jo netop en grænseflade på en klasse.
Avatar billede websam Nybegynder
14. marts 2006 - 18:07 #2
Så forsvinder ideen jo lidt i min factory klasse der tager sig af at sende den respektive klasse som skal benyttes retur til designlaget jo, da jeg jo kalder metoden i den som "As MitInterface".

Men kom endelig med en ide til løsning af det ;o)

/Websam
Avatar billede websam Nybegynder
14. marts 2006 - 18:11 #3
Skal jeg så moske ud i at lave nogle fields og properties med en dafault constructor der så sender den respektive klasse retur til designlaget ?

/Websam
Avatar billede websam Nybegynder
14. marts 2006 - 18:16 #4
Som det er lige nu trækker jeg jo i mit business lag med følgende fra mit design lag :

Private objBLL As NewsletterBLL.BusinessInterface

Public Sub New()
    objBLL = MitNamespace.BusinessFactory.LoadClass("class1")
End Sub

/Websam
Avatar billede driis Nybegynder
14. marts 2006 - 18:28 #5
En klasse skal overholde det interface den arver fra, det er helt essentielt. Jeg er lidt i tvivl om hvad du prøver at opnå, men hvis du bruger .NET 2.0 kan du jo eventuelt bruge en generisk factory metode. Eller du kan lade LoadClass returnere object eller et fælles interface for alle klasserne. I så fald vil det være nødvendigt med nogle type casts for at nå frem til den rigtige type.
Avatar billede websam Nybegynder
14. marts 2006 - 18:35 #6
Ideen er at skille mine lag helt ad og det opnår jeg med at lave en factory klasse der sender den valgte klasse retur "As MitInterface"

Kan du komme med et eksempel på brugen af en generisk factory metode i 2.0 ?

/Websam
Avatar billede arne_v Ekspert
14. marts 2006 - 18:37 #7
det eksempel ser lidt bekendt ud ...

et interface er en bindende kontrakt - man skal implementere alle metoder

man kunne lave et super interface som alle implementerer og saa et antal
sub interfaces (som arver fra super interface - hvad mange ikke er klar
over er at interfaces kan arve)

men saa skal du downcaste og det er absolut ikke paent (og hele ideen med
en factory forsvinder ligesom)

grundliggende skal du kun bruge factory som returnerer interface, hvis
de faktisk har det samme interface

hvis det er forskellige interfaces skal du have flere factories

hvis det kun er en lille bitte forskel kan du evt. kave en dummy metode
i klasserne som smider en exception - det er heller ike paent, men hvad goer man
ikke i en snaever vending

hvis du leder efter et framework til at instantiere vilkaarlige klasser, saa
kan du kigge paa SpringFramework.NET (der faar du en factory som du kan kalde
med et navn og saa kigger factory i en XML config og laver et objekt til dig)
Avatar billede websam Nybegynder
14. marts 2006 - 18:44 #8
Hej arne_v, ja det er jo dig der har ledt mig ind på den måde at styrre tingene på, men ville det så ikke blot være letter helt at droppe factory klassen og så blot trække igennem interfacet til den pågældende klasse på tværs af de forskellige lag ?

/Websam
Avatar billede arne_v Ekspert
14. marts 2006 - 18:55 #9
hvis det skal vaere nemt saa lav noget PHP slam kode

:-)

nej - der er en pointe

lad os antage at det her er en stoerre app - hvor du har dit presentation
layer og dit business logic layer i seperate dll'er

hvis du bruger

MitInterface o = new MinFoersteImplementation();

[koden er i presenttaion layer, typer er erklaeret i business logic layer]

og du vil rette til:

MitInterface o = new MinAndenImplementation();

saa skal du foerst lave den nye klasse i dit BLL source code, rette i
din PL source code, builde baade BLL og PL

hvis du bruger

MitInterface o = MinFabrik.CreateEnKlasse("XXXX");

saa kan du rette i din BLL source code og builde BLL og deploye uden
at der skal rettes noget i PL

[hvis "XXXX" evt. skal rettes saa smid den i en config file !]
Avatar billede arne_v Ekspert
14. marts 2006 - 18:57 #10
1)  det hedder decoupling naar det skal vaere fint

2)  bemaerk at jeg siger ikke at al PHP kode er slam kode, men der er
    blevet lavet meget PHP slam kode
Avatar billede websam Nybegynder
14. marts 2006 - 19:15 #11
Slam kode i php kender jeg ikke til men slam kode i alm. asp har til gengæld lavet en del af *GGG*

Men tilbage til emnet, for det første bliver det ret omfattende inden jeg bliver færdig. For det andet skulle det hele gerne gå op i en højere enhed i sidste ende. Mine lag ligger i seperate dll'er Data, Business og Design.

Og det var jo netop det smarte jeg kunne se i at have en factory klasse der loader den klasse jeg nu skal bruge i mit design lag.

Men skal jeg så have en factory klasse til hver af mine klasser ? For det kan jeg tilgengæld ikke se noget smart i ?

/Websam
Avatar billede arne_v Ekspert
14. marts 2006 - 19:41 #12
ikke til alle dine klasser

2/3 - 3/4 af dine klasser i BLL er vel ikke engang visible fra PL

og det skal jo ikke bruges til data only klasser men kun til klasser som goer noget

ideelt set fra et lag kun et enkelt interface for "goer noget"
Avatar billede websam Nybegynder
14. marts 2006 - 19:59 #13
arne_v >> Nej, men i de klasser der levere noget fra DAL til BLL og fra BLL til PL, korrekt ? Mine info klasser og deslige andre har jo ikke behovet ;o)

driis >> Gik du helt kold ? havde du ikke et eksempel på det generisk factory i asp.net 2.0 ?
Avatar billede arne_v Ekspert
14. marts 2006 - 20:05 #14
ja

men man vil jo netop forsoege at minimere afhaengigheden mellem lagene
og vil derfor have saa faa metoder som muligt (plus nogle DTO'er)
Avatar billede arne_v Ekspert
14. marts 2006 - 23:11 #15
OOP er mest velegnet til ting som er stoerre end det typiske hobby projekt

PHP og klassisk ASP er blevet saa populaere som de er fordi de er saa nemme at
bruge til at lave 5 dynamiske web sider med

programmerings paradigmet med at man starter i toppen af filen med <% eller <?php
og saa koder derud af med echo eller Response.Write er jo noget enhver kan finde
ud af

hvis man vil lave de samme 5 sider med ASP.NET eller JSP tager det 10 gange saa
lang tid

50 sider gaar ogsaa

men snakker vi 500 eller 5000 sider saa ender ikke OOP loesningerne ofte med
en gang spagetti, hvor man ikke kan finde tingene, duplikerer funktionalitet,
naar man retter en fejl saa retter man den kun nogle af stederne etc.etc.

man kan godt lave paene loesninger i PHP og ASP, men mange udviklere har faaet nogle
grimme vaner inden de blev gode og fordi det er nemt at komme igang med saa er der
ogsaa stor tradition for udviklere uden IT uddannelse
Avatar billede arne_v Ekspert
14. marts 2006 - 23:11 #16
(sagde ham som som ikke har en IT uddannelse ...)
Avatar billede websam Nybegynder
15. marts 2006 - 06:17 #17
At man ingen it-uddannelse har skal vel ikke danne grundlag for at man ikke kan få/have arbejde inden for programmering/design, eller for den sags skyld kunne lære noget om det.

Og jeg kan da allerede nu se fordelen ved at benytte OOP frem for det jeg tidligere har lavet i alm. asp, det bliver hurtigt uorverskueligt hvor det at arbejde med library og klasser gør tingene væsentligt lettere at have med at gøre.

Lad os antage at mit business lag indeholder 5000 linier kode hvoraf ca 1/5 del bruges i forskellige dele af mit design lag, er det så ikke mest hensigts mæssigt at dele det op i 5 klasser med hver deres factory og interface frem for at skulle kalde en stor klasse hvoraf jeg så kun bruger 1/5 del, eller har det ikke noget at sige ?

/Websam
Avatar billede arne_v Ekspert
15. marts 2006 - 13:23 #18
rigtigt, men det kræver en indsats

----

performance mæssigt er der næppe nogen stor forskel

det er udelukken hvad der giver den bedste strukturering som tæller

5000 linier = 5 x (300 linier core logik + 6 x 100 linier data objekt + 100 linier
support kode)

lyder nok ikke helt ved siden af
Avatar billede websam Nybegynder
15. marts 2006 - 15:54 #19
Ja, men i mine øjne er det jo væsentligt lettere ikke at skulle vælge imellem en hel række properties og metoder der ikke er relevante til netop den del af design delen jeg arbejder med.

Vi er enige om at brugen af en factory klasse er helt i top til adskillelse af de forskellige lag. Det gør det lettere at redigere uden det får nogen indflydelse på de øvrige lag, men det kan godt være at det er mig der ikke forstår brugen af det da jeg syntes det virker tåbeligt at jeg ikke kan nøjes én klasse da det jo netop ville mindske mængden af kode.

/Websam
Avatar billede websam Nybegynder
17. marts 2006 - 19:24 #20
arne_v >> jeg arbejder oxo hårdt på at få det banket fast med 7" søm ;o)
Avatar billede arne_v Ekspert
17. marts 2006 - 19:30 #21
kode linier er ikke i sig selv et problem

kode der er svaert at gennemskue er et problem

det er langt vigtigere at der er en logisk gruppering end at der er
faerre eller flere linier
Avatar billede websam Nybegynder
17. marts 2006 - 19:41 #22
Der hvor jeg tror jeg kludre lidt rundt i det er det med hvad der høre til business laget og hvad der ikke gør.

Selve desing laget er vel egentligt den rene html der genereres ?

Business laget er vel en sammen føjelse af mit code_behind, mine infoklasser og det jeg pt. kalder mit business lag, nemlig en mere eller mindre pass through klasse som blot smidder data igennem til mit datalag ?

Datalaget er der ikke så meget tvivl om det handler om adgang til og fra databasen med diverse metoder.

Kan du ikke prøve at komme med din fortolkning af det ?

/Websam
Avatar billede arne_v Ekspert
17. marts 2006 - 19:52 #23
business laget er den egentlige kerne logik som er uafhaengigt af om det er
en web app eller en win app og uafhaengigt af om det er en SQLServer eller XML filer
data opbevares i

den klassiske opdeling er 3 lags:
  presentation layer
  business logic layer
  data access layer

enkelte har en 4 lags opdeling og den kan jeg faktisk bedre lide:
  presentation layer - user interfacet (.aspx)
  controller layer - behandlingen af brugerens handlinger (codebehind .cs)
  business logic layer - kerne logik (service og data klasser)
  data access layer - (data og hjaelpe klasser)

hvis du bruger 3 lags saa kan du enten lave code behind med kun et enkelt kald til BLL
og kalde den for en del af PL eller putte en masse logik i den og kalde den BLL
Avatar billede websam Nybegynder
17. marts 2006 - 20:09 #24
Så er det 4 lags modellen jeg benytter :

1. Code behind bruger jeg til validering af de input en bruger levere, check af tomme felter, email, længde osv.

2. Business, hvor jeg har min(e) klasser der sørger for levering af de validerede data til datalaget, her jeg så ca. 30 % metoder som blot sender data direkte igennem med f.eks :

Public Function Create(ByVal objInfo As InfoClass)
    Dim boolReturn As Boolean = False
    If objDAL.CreateNew(objInfo) > 0 Then
        Return True
    Else
        Return False
    End If
End Function

Det er der jo ikke meget i ?

3. Min dataklasse med metoder der sørger for levering af data til og fra database

4. Database hjælpe klasse og database.

Jeg betragter databasen som en del af 4. lag da jeg benytter mig af de egenskaber den kan levere så som stored procedures, index, views osv.

Jeg føler bare lidt at jeg bruger for meget tid på de pass through metoder, men du vil sikkert sige at jeg ikke skal bekymre mig så meget om det ;o)

/Websam
Avatar billede arne_v Ekspert
17. marts 2006 - 20:59 #25
faktisk vil jeg mene at det meste af validering af data hoerer hjemme i business
layer og ikke i controller layer

controller leyer er mere omkring flow:
  bruger har submittet disse data
  nu kalder jeg business layer med dem
  i tilfaelde af success skal han videre til denne side
  i tilfaelde af fejl skal han have samme side igen med foelgende fejl tekst
Avatar billede arne_v Ekspert
17. marts 2006 - 21:05 #26
nu kan man se paa tingene paa mange maader

med hensyn til databse server og stored procedures saa taenker jeg som foelger

client tier (browser)

application tier (web app)
  presentation layer
  controller layer
  business logic layer
  data access layer

database tier:
  stored procedure layer
  table layer
Avatar billede arne_v Ekspert
17. marts 2006 - 21:09 #27
Avatar billede websam Nybegynder
17. marts 2006 - 21:39 #28
17/03-2006 20:59:40 >> Det virker også som en ganske fin idé, men med de indbyggede validator kontroller ligger det lige til højrebenet at bruge dem i controler laget :

If Page.IsValid Then
    '--- kald business laget
Else
    '--- giv brugeren besked om at det ikke var super godt
End if

17/03-2006 21:05:55 >> Ja, det er nok fordi jeg ikke har tænkt på det som database tier, men så fik du endnu engang udvidet min horisont, cool ;o)

17/03-2006 21:09:58 >> Ja det er noget tid siden jeg læste den og jeg forstår også godt principperne i det, det er mere det med hvad der skal være i PL og BLL jeg er lidt i tvivl om, men hvis jeg skal udelukkende skal bruge PL til submit og visning af data så skal jeg jo droppe de indbyggede validator kontroller og så skrive mine egne, e..er kan jeg trække i dem min BLL klasse ?

/Websam
Avatar billede arne_v Ekspert
17. marts 2006 - 21:45 #29
ja - men man skal skelne mellem

simpel data validering (er det her et tal ? er det her en email adresse ? etc.)
som godt kan laves i PL/CL og saa mere substans orientered valideringer
(eksisterer konto i databasen ? er slut data senere end start dato ? etc.) som
skal ligge i BLL

de foerste skal laves i PL/CL fordi data types skal proppes ind i data klasser
inden de sendes til BLL
Avatar billede websam Nybegynder
17. marts 2006 - 22:23 #30
Ok så er jeg sq på rette vej for det er i reglen den fremgangs måde jeg har benyttet, så det var rart at få det på plads, mange tak for de meget nyttige info.

Og lad os så få lukket denne tråd ;o)

/Websam
Avatar billede arne_v Ekspert
17. marts 2006 - 22:38 #31
jeg formoder at det betyder at jeg skal ligge et svar
Avatar billede websam Nybegynder
17. marts 2006 - 23:37 #32
Ja og "driis" lige så han deltog jo oxo i starten ;o)
Avatar billede driis Nybegynder
18. marts 2006 - 10:39 #33
Jeg kan godt lægge et svar, men jeg har nu kun deltaget ganske lidt.
Avatar billede websam Nybegynder
18. marts 2006 - 21:58 #34
Jeg fordeler dem oxo derefter, men lidt skal du have ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester