webForumDet fria alternativet

Komma igång med ASP.NET

.NET

63 svar · 2 329 visningar · startad av J07 · sida 3 av 4

Frågan, av J07

Skulle behöva tips på hur jag kommer igång med Asp.net? Det jag undrar över är: Funkar det bra med Sql server express versionen som är gratis och vad mer behöver jag för att kunna köra asp.net sida mot databas? Enkla kom igång artiklar. Har kollat på microsofts sidor och lite andra med hittar ingen riktigt bra guide som gör att jag inte behöver lista ut allt själv bara för att komma igång. Tacks

Läs frågan i sin helhet →
Medlem sedan maj 20012 812 inlägg
#41

nickemannen skrev:

Men för att få upp läsbarheten och för att få namngivningar på större kodblock så att utvecklaren slipper sätta sig in i alla detaljer så ser han 10-15 rader som beskriver vad som händer, vill han se vad som är under f12:ar han vidare sig, men oftast räcker det att han ser vad metoden gör i korta drag för att förstå och komma vidare.

Jag skall ge dig ett exempel från en metod som jag råkat ut för. Det var en Order klass, och i denna hade man en OrderRow till sig. Till denna orderRow så finns något som heter OrderRowCost. Alltså kostnaden för vad just denna orderrad kommer att kosta och dessutom vad försäljningspris blir, och vad marginalen blir osv osv...

Denna orderrad har ungefär 25-30 olika properties som skall uträknas och sättas så de kan visas senare i GUI:et. För att kunna räkna ut visa av parameterna så måste andra parameters vara uträknade först, och uträkningarna måste följa ett speciellt flöde, eftersom det annars kommer bli fel när man räknar med procentsatser...

Detta löste jag genom att ha en uträkningsmetod som såg ut ungefär så här...

public OrderRowCost CalculateOrderRowCost(Order order, OrderRow orderRow)
{
     //-- Först kontroller att alla data är valid, typ order != null osv osv..
     if(order == null || !order.Validate())
       return null;
     ... 

     //-- Här efter så kommer uträkningarna i rasade följd.
     OrderRowCost orderRowCost = new OrderRowCost();
     
     orderRowCost.FreightCost = CalculateFreightCostForOrderRow(order, orderRow);
     orderRowCost.DestinationCountryHandlingPerArticle = CalculateDestinationCountryHandlingPerArticle(order, orderRow);
     orderRowCost.BuyingArticleCost = CalculateBuyingArticlePrice(order, orderRow, orderRowCost);
     ...
}

Ungefär 25-30 olika parameters räknas ut på detta sättet. Hur skulle du vilja dela upp denna metod i flera olika metoder för att hålla metoden till 10-15 rader, utan att göra det hela mer komplext för programmeraren att följa flödet?

Visst är det så att många av parameterna som räknas ut inte hade behövts räknas ut och sättas på klassen, om det inte vore för det faktum att man ville kunna se precis hur kostnaderna fördelas... Så återigen det har inte med antalet rader att göra: 10 eller 20 eller 50 eller 100... om man inte kan bryta ut de så finns det ingen som helst mening med att splita funktionen i flera bara för att det skall vara så...

- M

Medlem sedan sep. 200888 inlägg
#42

Kom igen johan! Det var ett exempel på hur man kan skriva kod på olika antal rader och inte hur man skriver korrekt kod... Men om du vill gnälla på sandlådenivån så är ditt exempel inte speciellt mycket bättre.

public void CheckIfNotNullOrEmpty(string inParam,string paramName)
{
    if(string.IsNullOrEmpty(inParam))
    throw new ArgumentNullException("Input parameter " + paramName + "cannot be null or empty string")
}

För det första så är det ett förväntat värde att inparametern kan vara både Null och tom, alltså skall inga exceptions kastas, exceptions kastas bara när man får ett oväntat fel i koden. Det har du inte i detta sammanhang.

Först vill jag påpeka att jag inte kastar sand, sen vill jag poängtera att mitt inlägg handlar om varför få rader och att man skall försöka landa runt 10 rader/metod som föregående argumenterare påpekat. Ber om ursäkt om det kändes som en näve sand. :l

Att inputparametrar är av fel typ är typiskt exempel på när exceptions skall kastas. I detta fall får utvecklarna snabbt veta om de gör fel. Dvs Du som programmerare skall se till så andra använder din kod rätt. Det är vad bla Design by Contract och Defensive programming handlar om.

private User CreateUser(int identifier, string firstname, string lastname)
{
   CheckIfNotNullOrEmpty(firstName,"FirstName");
   CheckIfNotNullOrEmpty(lastname,"lastName");

   User user = new User(identifier,firstname,lastname);
   return user;
}

I denna kodsnutt så kommer en användare aldrig att skapas om LastName eller FirstName är NULL eller tomt, eftersom du kastar ett ArgumentException när detta inträffar, vilket inte alls är vad min exempelkod visar, utan där skapas användaren ändå, men utan Displaynamnet satt, din refaktoring har alltså ändrat hela utgången av vad metoden gjorde från början... inte speciellt bra!

Precis, och det är exakt vad man skall försöka åstakomma oxå. I ditt fall har du massa halvlevande tillstånd. Dvs du har klasser där saker kan vara null, men vems uppgift är det att ta reda på sånt? de som använder koden eller de som förser användaren med informationen. I detta fall bör inte en användare kunna skapas om viktiga värden är null eller tomma. Det är ett fel. Och objekt med nullvärden är en av de största skälen till underligga buggar i ett system. Om nu null skulle vara ok och inte orsaka problem bör man istället köra med nullable patterns för att inte få systemet att kasta oväntade null refference exeptions vilket det bergigs kommer göra om en user kan skapas med null tillstånd.

public class User
{
   ... proppar ..
  public string DisplayName
  {
      get { return CreateDisplayName(); }
  }
  
  private string CreateDisplayName()
 {
          StringBuilder displayNameBuilder = new StringBuilder();
          displayNameBuilder.Append(FirstName)
          displayNameBuilder.Append(", ")
          displayNameBuilder.Append(Lastname);

          return displayNameBuilder.ToString();
 }

}

Ur en prestanda synpunkt, så borde mer rätt vara att ha en lokalvariabel på klassen User som sätts i CreateDisplayName() och CreateDisplayName() anropas varje gång som set-metoderna anropas för LastName eller FirstName.

Detta är oxå ett klassiskt fel. Prestanda vad är det? Prestanda är aldrig några problem förrän de blir problem. Idag lägger många utvecklare ca 80% av sin tid att optimera sin kod helt i onödan. Det är mkt tid att spara. I detta fall blir prestandaproblemet om Dispayname skulle anropas över flera 100 000 ggr. Om ens då. Jag kan mycket väl tänka mig att Displayname används mer sällan än de andra propparna på en user. Vilket gör att adda extra kod som inte behövs är att slösa tid och inte en vist över huvudtaget. YAGNI (You arn't gonna need it) gör inget du inte behöver förrän du vet att du behöver det. Oprtimering för man först sist det är då man först vet om det ens behöver göras och fördelen är att det är väldigt få ställen man behöver optimera då istället för att optimera 80% av koden i onödan. Även logisk optimering (som många kör med) gör att system istället får långsammare då logik inte går ihop med praktik när det gäller kod. Även om man så gärna önska det vore så...

>Skapar man en User vill man ju gärna att dess displayname alltid ger resultat,

Hur kan du förutsätta det, har du sett designspecen?

För att annars hade man inte haft proppen på user överhuvudtaget.
Att ha user.DisplayName som ger null är inte så smart, vilket jag förklara tidigare varför.

Skall vi fortsätta kast sand på varandra???

Du tog det nog lite för personligt, sorry, var inte min mening alls att göra dig upprörd utan försöka förklara varför jag inte tycker dina argument var rätt.

Få rader är bra, helt klart, ju färre rader destu bättre. Färre rader ger färre möjligheter att införa buggar. Men återigen det handlar inte om ANTALET rader utan vad dessa rader gör.

Om du har en metod som består av 50 rader och du inte har någon redundant kod där i, och alla kod hör logiskt ihop. Tänker du då dela upp denna metod i 5 olika metoder bara för att du skall få 10 rader i varje och därefter skapa en annan metod som anropar på dessa 5 metoder. Skulle inte tro det!

Det är just det som inte stämmer. Du kommer typ aldrig kunna ha 50 rader kod och inte ha redundans. Just 10 rader är mer en statistik siffra som är en målriktning för att just minimera risken med redundans. Den är inte påhittat.

Jag ville med mitt exempel visa just redundansen som jag extrahera ut.
Ex DisplayName refactorera jag till user för att det kommer bergis finnas flera tillfällen som man vill ha ut Displayname och då vill man inte skriva den koden igen som du hade i if-satsen. Detta skrev jag inte för att klandra din kod utan för att faktiskt förtydliga och visa att få rader kod handlar inte bara om att ha små metoder för någon säger att det är snygg kod. Utan för att även bevisa att jag nu minimerade risken för redundant kod. Om du har en annan klass som sen skall använda user så skall man slippa skriva koden igen för att sätta ihop för o efternamn. Redundans kod handlar alltdå inte om att i sin metod ha redundans utan att man även då riskerar redundans på andra områden.

Jag är villig att diskutera det vidare med dig om du håller dig till sakfrågan och inte kommer med tramsiga kommentarer om tydliga buggar och sånt...

Sorry. Tyckte du kom med barnsligt svar ang lägga all kod på en rad så kunde inte låta blir... Ta det mer ironiskt än pajkasning... För pajkastning var det ej... bara ett förtydligande varför du har fel med dina påståenden om 200 rader kod.

-- Bhaaa.. ser massa slintningar när jag skrev. ursäkta om ord ser knasiga ut eller stavats fel... orka rinte rätta det just nu ---

Mvh Johan

Medlem sedan jan. 20022 440 inlägg
#43

Gladh skrev:

Visst är det så att många av parameterna som räknas ut inte hade behövts räknas ut och sättas på klassen, om det inte vore för det faktum att man ville kunna se precis hur kostnaderna fördelas... Så återigen det har inte med antalet rader att göra: 10 eller 20 eller 50 eller 100... om man inte kan bryta ut de så finns det ingen som helst mening med att splita funktionen i flera bara för att det skall vara så...

- M

Jo det där har jag fightats med en hel del det sista. Jag vill gärna bryta ut det men jag finner det omständigt och ologiskt i precis det scenariot du beskriver där.

//RED Nu var det fakturor och inte ordrar för min del.

Medlem sedan sep. 200888 inlägg
#44

Denna orderrad har ungefär 25-30 olika properties som skall uträknas och sättas så de kan visas senare i GUI:et. För att kunna räkna ut visa av parameterna så måste andra parameters vara uträknade först, och uträkningarna måste följa ett speciellt flöde, eftersom det annars kommer bli fel när man räknar med procentsatser...

Visst är det så att många av parameterna som räknas ut inte hade behövts räknas ut och sättas på klassen, om det inte vore för det faktum att man ville kunna se precis hur kostnaderna fördelas... Så återigen det har inte med antalet rader att göra: 10 eller 20 eller 50 eller 100... om man inte kan bryta ut de så finns det ingen som helst mening med att splita funktionen i flera bara för att det skall vara så...

Här påkar du på ett annat problem. Problemet här är inte antal rader kod som du säger så måste du ha flera rader. Vist det går att bryta ut lite av all denna kod, ex kan man bryta ut beräkningar som rör en vissdel till egna metoder. Ex kanske du har 10 beräkningar på momsatser då kan man sortera ut dem och lägga dem i en gemensam metod etc... men det är inte ditt huvudproblem här. Ditt problem här är att den som gjort denna klass med alla dessa proppar har designat den fel. Dessa proppar skulle utan problem kunna grupperas in i subklasser till main klassen. Refactoring handlar inte bara om att extra hera metoder så man får många små utan även extrahera bla klasser så man får mer beskrivande och löskopplad logik.

Sen kan säkert många av de beräkningar som sker kunna refactorerats så man delar på en metod på flera ställen men justerar något litet lätt. Kanske använt vistorpattern eller liknande.

Viss logik kan säkert även läggas i propparna i klassen. Ex som jag flytta DisplayName till User o la dess affärsrelaterade logik där. När Man använder sig av klassens egna tillstånd för att göra saker så är det oxå bäst att ha koden i klassen. Lazy Init eller lazy Load...

Så återigen får man för många rader kod så är det nått som är fel. Och det behlöver inte vara just DEN metoden som är fel utan det kan vara hur saker är byggt som just DEN metoden måste lösa.

genom att bryta ner orderklassen så det blir färre proppar o mer aggregat så får man även en metod för att hantera varje aggregat och redan då har du nog metoder som är under 10 rader och tom en mer återanvändbar orderklass som i framtiden minimerar andra fel pga att man har för många proppar och troligen rätt kass koll på vad alla är till för.

mvh Johan

Medlem sedan aug. 20003 575 inlägg
#45

Måste bara försöka göra mig förstådd på vad jag menar som en rad.

En rad för mig är en operation, möjligtvis 2. Inte att man kan skriva ihop e hel metods rader på en och samma rad.

Och den metoden du visade för mig är inga problem att dela upp.

Men som jag skrivit tidigare i mina inlägg, defineringsmetoder kan vara okej att ha fler rader i (vilket din metod gör, den bygger upp en annan klass). Jag ser det inte som en lag att ha fler "rader" men generellt sätt så bör man sträva efter att hålla nere dom för att öka kodförståelsen. Samt har metoden eller klassen för mycket kod så kanske den har för mycket ansvar som kan delas upp på flera.

Medlem sedan maj 20012 812 inlägg
#46

Först Johan så diskuterar vi fortfarande fel saker, glöm exemplet och dess eventuella riktigthet när det gäller NULL värde på Displaynamn och skapandet av klassen. Det hör inte hit. Även om jag har en del att tycka till om där också, då jag fortfarande inte håller med dig i allt du säger...

joahn skrev:

genom att bryta ner orderklassen så det blir färre proppar o mer aggregat så får man även en metod för att hantera varje aggregat och redan då har du nog metoder som är under 10 rader och tom en mer återanvändbar orderklass som i framtiden minimerar andra fel pga att man har för många proppar och troligen rätt kass koll på vad alla är till för.

För att förtydliga det hela så är många av parameterna redan indelade i subklasser med flera egna parameters på. Själv ser jag ingen möjlighet att dela upp dessa parameters på ett annat sätt så det fortfarande blir logisk.

Visst kan jag skapa CalculatedValue1Class och CalculatedValue2Class för att få mindre properties på OrderRowCost klassen och där under sätta några av dem, men ingen av dem kommer logiskt att höra ihop och de parametes som finns där hör ihop med OrderRowCost (även om namnet kanske skulle vara något annat).

Totalt sett rör det sig säkert om 70-80 olika parameters som sätts och räknas ut för att få fram det korrekta utrpiset på en artikel om man får inköpspriset. Och dessa är grupperade till dessa 25-30 parameters på orderrowcost...

- M

Medlem sedan maj 20012 812 inlägg
#47

johan skrev:

Detta är oxå ett klassiskt fel. Prestanda vad är det? Prestanda är aldrig några problem förrän de blir problem. Idag lägger många utvecklare ca 80% av sin tid att optimera sin kod helt i onödan.

Jag lovar dig att det tar inte längre tid att genomför min lösning istället för din. Och nej, jag tror inte heller att prestandaförlusten blir speciellt stor, om än märtbar för vanliga system. Men det finns ingen som helst vinst (som jag ser det) att skapa Displaynamn varje gång det skall visas, istället för skapa det när firstname/lastname väl sätts.

- M

Medlem sedan sep. 200888 inlägg
#48

För att förtydliga det hela så är många av parameterna redan indelade i subklasser med flera egna parameters på. Själv ser jag ingen möjlighet att dela upp dessa parameters på ett annat sätt så det fortfarande blir logisk.

Jag tror nog fortfarande att domän desingen är boven här...
30 proppar är lite mkt. Men jag skall inte utala mig för mkt då jag inte har domän promblematiken bakom mig, men vet att i andra projekt då fallet vart att de behövt många proppar m.m. alltid vart mer eller mindre fel design val. (fel o fel... smaksak baserat på vad man vill ha för design och arkitektur på sin kod och vilka principer man värdesätter m.m. )

Prboblemet med design o arkitektur är just att det finns så många sätt att bygga saker på. Har man designat fel från början påverkar det andra principer dvs ex den niklas pratar om att försöka ha mindra än 10 rader kod.

Det finns funktionsorientering, objekt orientering, trasaction script programmering etc etc... Många idag tror de gör OO och OOP bara för de har arv. andra hävdar att de har OOP men i själva verket har de funktionsorienterad kod m.m.

Over and out!!!

Medlem sedan maj 20012 812 inlägg
#49

johan skrev:

Jag tror nog fortfarande att domän desingen är boven här...

heheh... Själv tror jag beställaren är boven i dramat och deras krav på att allt som kan räknas skall kunna visas...

- M

Medlem sedan sep. 200888 inlägg
#50

Jag lovar dig att det tar inte längre tid att genomför min lösning istället för din. Och nej, jag tror inte heller att prestandaförlusten blir speciellt stor, om än märtbar för vanliga system. Men det finns ingen som helst vinst (som jag ser det) att skapa Displaynamn varje gång det skall visas, istället för skapa det när firstname/lastname väl sätts.

Det är ju frågan. Vad händer om man byter förnamn? Skall alltid förnamn och efternamn trigga en metod som uppdaterar ens fält som knappt används då?
Helt i onödan?

Eller skall man få rätt namn när man vill ha displayname?

Medlem sedan maj 2007172 inlägg
#51

Oj, som det urartade =)

Testade ialla fall lite och fick inte rätt på det hela.
Verkar finnas en del kunniga inom området så det skulle sitta fint med en liten guide stegvis för att komma igång snabbare än att kolla massa videos.

Vilka olika saker som ska installeras osv och hur når jag filerna? http://localhost/?

Medlem sedan feb. 2005280 inlägg
#52

:D

bara att högerklicka på en aspx sida och välj "View in browser"

Medlem sedan sep. 200888 inlägg
#53

J07 skrev:

Oj, som det urartade =)

haha har du rätt i... Fick länken av en polare som ville jag skulle svara på ett inlägg i tråden. Lite trolligt av mig att inte först kolla vad det var för huvbudämne :)

Medlem sedan jan. 20022 440 inlägg
#54

Den här tråden blev ordentligt Hi-jackad :) Spännande diskussion i alla fall. För mig är det lite mer "grå-zon" än för en dek andra bevisligen :D. Nyttigt ämne. Jag önskar det blev fler sådana här diskussioner på webforum. Om jag håller med båda sidor i diskussionen borde inte min kod bli jävligt bra då? :)

J07 skrev:

Oj, som det urartade =)

Testade ialla fall lite och fick inte rätt på det hela.
Verkar finnas en del kunniga inom området så det skulle sitta fint med en liten guide stegvis för att komma igång snabbare än att kolla massa videos.

Vilka olika saker som ska installeras osv och hur når jag filerna? http://localhost/?

Hur har du tänkt dig att utveckla? Har du tankat hem visual studio web developer och sql express? Om inte så rekommenderas det varmt! ;) http://www.microsoft.com/express/

Nästa steg blir att skapa ett web application project. I början rekommenderar jag att du skapar ett par tabeller i SQL i management studio express. Personligen rekommenderar jag Sql 2008 Express då den är lättare för nybörjaren. Du har intellisense i Sql 2008 Management Studio Express. Intellisense innebär kortfattat att du medans du skriver får upp en lista på tillgängliga kolumner, tabeller och i visual studio metoder och properties.

Sedan skapar du i Visual Studio en anslutning till databasen. När det är klart så kan du börja dra ut kontroller från Toolbox i Visual Studio.

Det enklaste i början är nog att databinda kontrollerna med hjälp av SqlDataSource. Om du drar ut en SqlDataSource till sidan och väljer en tabell via den anslutningen du skapade i Visual Studio nyss så är det bara att markera de kolumner du vill ha med. Sedan väljer du att låta din exempelvis GridView använda den nyligen skapade SqlDataSourcen som DataSourceID.

Experimentera lite fram och tillbaka och återkom med lite mer specifika frågor om du kör fast!

Medlem sedan nov. 20014 054 inlägg
#55

Det är inte dumt heller att ladda hem exempeldatabasar från Microsoft, som redan är fullmatade med information. :)

Då har man något att leka emot, och slippa att eventuellt hålla på att skapa databasar, tabeller osv.

http://www.microsoft.com/downloadS/details.aspx?familyid=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en

Medlem sedan maj 20012 812 inlägg
#56

johan skrev:

Det är ju frågan. Vad händer om man byter förnamn? Skall alltid förnamn och efternamn trigga en metod som uppdaterar ens fält som knappt används då?
Helt i onödan?

Eller skall man få rätt namn när man vill ha displayname?

Griper du efter halmstrå johan? Både du och jag vet att Displaynamn kommer visas oftare än man byter för- eller efternamn.

Men visst helt beroende på hur man fyller sitt objekt så finns det ju fördelar med att skapa Displaynamn när det efterfrågas eftersom du isåfall slipper spara undan displaynamn på lagringsstället. Och dubbellagrad information är inget som vi tycker om...

Däremot måste jag fråga dig om du inte har metoder som har mer än 15 rader i sig, eller du har refaktorereat ut all din kod till så små metoder....

Det kan jag garanterat säg att det har jag, om det inte finns någon anledning att återanvända koden för mig, så får den ligga kvar i metoden där den skrevs från början... YAGNI :)

- M

Medlem sedan sep. 200888 inlägg
#57

Gladh skrev:

Det kan jag garanterat säg att det har jag, om det inte finns någon anledning att återanvända koden för mig, så får den ligga kvar i metoden där den skrevs från början... YAGNI :)

- M

Vi kan ta den här diskussionen i en annan tråd rörande redundans, refactoring, bra vs kass kod/design etc... om du vill? Tror många tycker detta är ett intressant ämne, Jag skall själv föreläsa om området inför SweNug i GBG nästa vecka. Alltid kul med argumentationer m.m. för att se vilka punkter man kanske skall inrikta sig mer åt m.m.

Tills dess kan ni få läsa min ny krönika på pellesoft, intressantare ämne för studen. Som är en grundsten till tankesätt för bra kod.

http://www.pellesoft.se/documents/pageblank.aspx?id=12013

Tyck gärna till om krönikan oxå.
(OBS! den ligger länkad på pellesförsta sidan så alla ser vilka komments man ger. )

Mvh Johan

Medlem sedan sep. 200888 inlägg
#58

Som sagt så flyttar vi prat om bra kod till någon annan tråd. Här följer en ny diskussion för dem som är intresserade av ämnet:

http://www.webforum.nu/showthread.php?p=1435529#post1435529

Mvh Johan

Medlem sedan feb. 2005280 inlägg
#59

johannormen skrev:

Tills dess kan ni få läsa min ny krönika på pellesoft, intressantare ämne för studen. Som är en grundsten till tankesätt för bra kod.

http://www.pellesoft.se/documents/pageblank.aspx?id=12013

Mvh Johan

Ähum.... lite tips bara, näst intill oläsbar text i både IE o FF, vad är detta för standard :e ?

<font size="1">
<font face="Calibr," verdanai="">
Jämför med bilförare: Bilförare har i regel en sak gemensamt; 
De är säkra på att de är en bra bilförare. De stannar vid rött ljus, 
blinkar när de svänger, förutser situationer i trafiken bra och 
vet oftast bäst i olika trafiksituationer. De kör defensivt. De är 
försiktiga på sitt sätt och kör på rätt sätt. De klagar 
på andra i trafiken som inte kan köra bil osv.
<o:p _moz-userdefined=""/>
</font>
</font>
Medlem sedan sep. 200888 inlägg
#60

faktiskt messat pelle om detta. Jag är inte den som står för textstorleken... tyvärr..

397 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
126 ms — deklarationer (db)
120 ms — hämta statistik (db)
148 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)