webForumDet fria alternativet

Bra vs dålig kod/design?

.NETur .NET

29 svar · 1 934 visningar · startad av johannormen

Medlem sedan sep. 200888 inlägg
Frågan#1

hej,

I en tidigare tråd kom vi in på ämnet bra vs dålig kod. Argumentationen började med att många experter anser att en metod bör inte vara större än 10 rader, har man mer finns risken att koden både är för stor, ökar risken för onödiga buggar och en hel del redundans som man lätt kan undvika genom refactoring av olika slag.
För mig finns det många olika punkter att ta hänsyn till gällande att skapa bra kod. Här följer några.

1... Skriv metoderna så små ni kan, när det är gjort gör dem ännu mindre ändå. (Försök ha 10 rader som maxkrav... Då exkl. inräknandet med try, catch, finally. Men medräknandet om deras inkapslade logik. Låt metoden bara göra en sak, gör den mer splittra då har den för mkt att utföra.
ex:

public SomeThingToHandle CreateSomeThingToHandle()
{
      var someThingtoHandle = new SomeThingToHandle();
      someThingtoHandle.Number = GetNumA * GetNumB - GetNumC + NumberA;
      ...
     return someThingToHandle;
}

Metoden skall göra en sak skapa SomethingToHandle klassen. Men i koden gör metoden mer än så den beräknar värden. Flytta beräkningen till egen metod som förklarar vad det är för värde då det är en helt annan sak.

public SomeThingToHandle CreateSomeThingToHandle()
{
      var someThingtoHandle = new SomeThingToHandle();
      someThingtoHandle.Number = GetNextValidNumber();
      ...
      return someThingToHandle;
}
private int GetNextValidNumber()
{
    return  GetNumA * GetNumB - GetNumC + NumberA;
}

Detta är typiskt SrR (Single Responsibility Rule)

2... Tydliga namn, hellre för långa namn är för korta otydliga.
Aldrig använda förkortningar och heller inte hungarian notation. Dvs inga prefix före namnet i en hårdtypad värld så som ex C#, Java, Vb.Net behövs inte denna notation längre. Tydligare namn än svaret.
ex:

    String strName = "John Doe";
    String lName = "Doe";
    string fName = "John";
    string fNameInDtStr = "Johnny";

utan:

    String name = "John Doe";
    String lastName = "Doe";
    string firstName = "John";
    string firstNameInDataString = "Johnny";

3... Ha små klasser. Ha tydliga klasser som bara gör det de skall göra. SrP (Singel Responsibility Principle) Är klassen en User eller en Order skall den bara hantera sånt som rör sig själv allt annat skall refactoreras in i andra klasser som dessa kan använda sig av. Löskoppling är en viktig grundsten här.

4... Undvik kommentarer i koden. Kommentarer som inte berör ///<summery> m.m. utgå från att aldrig behöva kommentera i koden och gör koden tydlig istället. Att behöva kommentera vad man gör är oftast tecken på att koden är otydlig och inte självbeskrivande. Ex.

var date = LastDate(); //handle the lastdate in this month.

bör istället vara:

var lastDateInThisMonth = LastDate();

Kommentarer både smutsar ner kod och skapar lögner i koden. För ca 90% av alla kommentarer i kod underhålls inte så man vet aldrig om de är sanna. Men metodnamn, variabelnamn är sånt som alltid används. I kort förklaring.
Mer text om detta:
Kommentarer i kod (Krönika)

Kommentera Endast sånt som måste kommenteras typ ///ToDo om saker inte är klara (se till och utföra dem sen, kan man inte lova att man tar i det sen gör dem med en gång istället.

5... Felhantering (Självklart tycker många, vad har det med bra kod att göra? jo massor, bra felhantering ger tydlig kod och hjälper andra minst inte dig själv att använda koden rätt och förstå vad som verkligen gick fel. Returnera inga felkoder, eller värden utan kasta tydliga och förklarande exceptions. Är det ett fel skall det även hanteras som ett fel. Att returnera en kod eller ett boolean indikerar inte att det gått fel och det blir svårare att sen förstå vart felet kommer från då retur av ett värde faktiskt inte genererar fel utan säger nått annat.

6... Formatering av kod. Kod skall läsas som om det vore en uppsats. Därför är det viktigt att man har ett bra flöde i koden för att slippa hoppa för mkt i sin egen klass. Ex variabler bör deklareras så nära källan som möjligt. Inte i toppen som många gör. Metoder skall sorteras efter deras anropsföljd. Dvs sortera in private ihop med andra private i bokstavsordning utan sortera metoder efter hur de anropas. Man skall inte behöva läsa en källfil för man måste scrolla upp o ner för att läsa den. Dvs har man första metoden som sedan använder en privat metod skall denna metod helst ligga efter första metoden så man kan fortsätta läsa den. För att slippa hoppa upp o ner för mkt i sin källfil. För mkt hoppande gör att man kan tappa bort sig och man spenderar mer tid att försöka hitta runt i koden, även om go to definition finns så kan hoppa runtandet villa bort en. Förvirra mindre, hjärnan klarar bara av att minnas ca 7 saker i närminnet.

mvh Johan

Medlem sedan jan. 20022 440 inlägg
#2

Håller med i det mesta. Själv drar jag väl mer åt Active Record hållet. Det blir inte lika cleant men heller inte lika analt om man som jag inte fått sitt svarta bälte än.

Det du förespråkar med Single Responsibility Rule är verkligen vackert och absolut något man ska sträva efter men jag tror det är väldigt långt från vad de flesta programmerare faktiskt klarar av. Det gäller att du gjort din hemläsa gällande domän och domän driven design. Det finns "lättare" patterns att ta sig an.

Nu sticker jag ut hakan lite men frågan är om de flesta utvecklare faktiskt har någon nytta av att koda så "strikt". Jag förstår varför men det blir en svårare avvägning mellan tidsåtgång och effektivitet om du inte är tillräckligt effektiv och kan din sak.

Medlem sedan dec. 19996 522 inlägg
#3

Catz, Just att ActiveRecord bryter mot Single Responsibility Rule är en av anledningarna att jag bara använder AR i prototyper.

Jag skulle säga att alla utvecklare bör sträva efter koda så bra som möjligt men att det som utvecklas ändå ska tas i beakande. Så länge man bygger om innan exempelvis en prototyp ska börja utvecklas på riktigt. Det lönar sig enligt min erfarenhet alltid att bygga löst kopplade system som följer diverse välkända riktlinjer och patterns inom om det ska i produktion. Som tur är har ju TDD fått ett rejält uppsving senaste åren :)

MS har öppnat upp med Pattern & Practices och välkomnar öppenhet och guide lines, vilket också är ett steg i rätt riktning för .net-communityn

Medlem sedan jan. 20022 440 inlägg
#4

erka skrev:

Catz, Just att ActiveRecord bryter mot Single Responsibility Rule är en av anledningarna att jag bara använder AR i prototyper.

Jag skulle säga att alla utvecklare bör sträva efter koda så bra som möjligt men att det som utvecklas ändå ska tas i beakande. Så länge man bygger om innan exempelvis en prototyp ska börja utvecklas på riktigt. Det lönar sig enligt min erfarenhet alltid att bygga löst kopplade system som följer diverse välkända riktlinjer och patterns inom om det ska i produktion. Som tur är har ju TDD fått ett rejält uppsving senaste åren :)

MS har öppnat upp med Pattern & Practices och välkomnar öppenhet och guide lines, vilket också är ett steg i rätt riktning för .net-communityn

Jag håller med er till fullo. Som sagt jag har inte svart bälte än. Jag saknar helt vissa saker varav TDD är en av dem. Utan TDD så blir SiR ganska omständigt, långsamt att utveckla (tar tid att testa alla de "extra" metoder som uppstår).

Jag har beställt fler böcker idag (fan jag gör ju inte annat än att läsa om programmering när jag inte programmerar) ;)

/RED glömde idag :)

Medlem sedan maj 200010 687 inlägg
#5

Bra inlägg! (y)

Jag va på ett DotWay seminarium om MVC i Malmö som två göteborgare höll i.
Inte så att du va en av dem? :)

Angående långa vs. korta namn så säger en del annorlunda.
T.ex. om man har en sån här metod:

public Message CreateMessage()
{
	var message = new Message();
	message.Subject = "Foo";
	message.Body = "Bar";

	return message;
}

Skulle man istället döpa message till "msg" eller t.o.m. "m" så skulle inte koden vara mer oläsbar. Man ser att det är ett Message man håller på med.
Man upprepar sig inte utan ser istället all viktig logik.

Vad tycker ni om detta? :)

Medlem sedan sep. 200888 inlägg
#6

CatZ skrev:

Jag håller med er till fullo. Som sagt jag har inte svart bälte än. Jag saknar helt vissa saker varav TDD är en av dem. Utan TDD så blir SiR ganska omständigt, långsamt att utveckla (tar tid att testa alla de "extra" metoder som uppstår).

Jag har beställt fler böcker idag (fan jag gör ju inte annat än att läsa om programmering när jag inte programmerar) ;)

/RED glömde idag :)

Du behöver inte köra TDD alls om man inte vill. TDD är ju mer ett tillväga sätt att gå när man tar fram sin applikation. Du kan lika väl utan TDD rafactorera och applicera Principerna m.m. Dessa principer har funnits typ längre än TDD.
TDD kan dock underlätta men även försvåra.

Medlem sedan sep. 200888 inlägg
#7

Erik Juhlin skrev:

Bra inlägg! (y)

Jag va på ett DotWay seminarium om MVC i Malmö som två göteborgare höll i.
Inte så att du va en av dem? :)

Angående långa vs. korta namn så säger en del annorlunda.
T.ex. om man har en sån här metod:

public Message CreateMessage()
{
	var message = new Message();
	message.Subject = "Foo";
	message.Body = "Bar";

	return message;
}

Skulle man istället döpa message till "msg" eller t.o.m. "m" så skulle inte koden vara mer oläsbar. Man ser att det är ett Message man håller på med.
Man upprepar sig inte utan ser istället all viktig logik.

Vad tycker ni om detta? :)

Jepp det var jag det. Jag och Tobias. Det var dock första dragningen vi körde så den var väl kanske inte på top :-) men fick bra respons på de andra orterna. Vilket var kul.

Just förkortningar är ett jäka usch... hehe. Problemet är oftast inte att ha dem i små metoder som ditt exempel utan det blir ful kod. Obeskrivlig på sin rad Ex:

public Message CreateMessage()
{
	var m = new Message();
	m.Subject = "Foo";
	m.Body = "Bar";

	return m;
}

Ok man ser snabbt tack vare lite kod att m är Message. Problemt som uppstår är att kod oftast inte bara är 4 rader utan kanske 5-10 rader som sedan i sin tur nyttjar andra metoder där man kastar in dessa parametrar.
Du skall helst på varjke rad kunna översätta vad du gör utan att vara beroende av raden innan eller kanske to m flera rader innan.

ex:

	...
             m.Subject = "Foo";
	m.Body = "Bar";

	return m;

vad är m här? nej inte Message utan nu är den en MailDescriptior.

ta detta:

public Message CreateMessage()
{
	var m = new Message();
	m.Subject = "Foo";

             CreateBody(m,"Bar");
             
	return message;
}

public void CreateBody(Message m,string text)
{
        m.Body = text;
}

Nu blir m inte lika tydligt. Kolla på koden, aj vad är m? hum leta leta och inputparametern tar emot m som är message. Det är sånt här man bla vill undvika. Att behöva "Leta" för mkt i sin kod.

Ett annat problem är om du har en member variabel som bara heter m och 100-200 rader ner i en metod använder ditt m ... vad betyder detta m då?
Jo du måste ev scrolla till toppen för för att ta reda på vad ditt m var för något. Svårare blir det om m kommer på detta sätt:

     var m = ObjectBuilder.Create(owner);

Nu är detta exempel rätt otydligt o kass, men vill visa just problemet. Du måste ta reda på vad owner är vad objectBuilder Create returnerar.

Ett annat problem som kan uppstå är ex om vi använder msg så kan det ju betyda olika saker. message, master system guid, message storage group etc... Vem vet? oxå en farlig grej rörande använda förkortningar. En utvecklare kanske tror sen att alla msg prefix etc är message klassen men i själv verket i classb står det för message storage group som är nått helt annat.

Mvh Johan

Medlem sedan nov. 20014 054 inlägg
#8

//red

Medlem sedan maj 200010 687 inlägg
#9

Ok, kul att höra synpunkter till detta. Brukar inte förkorta, men läst på lite bloggar o så... :)
Sen så skulle det ju va helt vansinnigt att förkorta member-variabler på det sättet.

Jag tyckte föreläsningen var intressant då jag verkligen avskyr vanliga ASP.NET. Men har inte hunnit kolla på MVC än eftersom jag haft fullt upp på jobb. Men nu när vi lanserat (cdon.se) så får man väl ta o kolla lite på det. :)

Fredde: Håller med lite. Men har fått för mig att ReSharper är långsammare på att hitta referenser om man har många metoder med samma namn. :)

Medlem sedan maj 20012 812 inlägg
#10

johan skrev:

public SomeThingToHandle CreateSomeThingToHandle()
{
var someThingtoHandle = new SomeThingToHandle();
someThingtoHandle.Number = GetNextValidNumber();
...
return someThingToHandle;
}
private int GetNextValidNumber()
{
return GetNumA * GetNumB - GetNumC + NumberA;
}

Nu vet jag att detta är ett enkelt exempel och förstår precis vad du menar med det (så har vi klarat av det). Men det sagt så skall jag lägga in mina 2 cent här.

I ett sådant enkelt exempel som detta, där vi antar att GetNextValidNumber() inte kan återanvändas till något annat än just till den raden där ursprungskoden fanns, och det dessutom är gansaka intetsägande med en rad som bara lägger ihop 4 tal, så ser jag ingen som helst anledning att bryta ut detta och lägga i en egen funktion. Och det av 2 anledningar.

1. Det kommer krävas flerkod rader för mig att skriva eftersom jag behöver skapa en ny funktion.
2. Eftersom själva uträkningen är intetsägande (och inte hör hemma någonstans förutom i ursprungskoden) så måste jag kommenterar metoden ordentligt så när jag sedan kollar igenom min kod och ser denna metod 6 månader senare, så skall jag kunna förstå vad den gör och till vem den är relaterad till.

Själv så ser jag ingen anledning till att hålla funktioner nere till ett max ANTAL rader, utan funktionen skall istället vara så liten och optimerad till det den gör, kod som kan återanvändas av andra funktioner skall givetviss flyttas ut, så det inte finns redundant kod. Att flytta ut kod för att få ner antalet rader är helt meningslöst, det är samma mängdkod som skrivs (till och med mer) alltså så minskar du inte risken med att införa buggar i metoderna.

Det jag kan tänka mig är om jag har if-satser där kodmängden inom dessa ifsatser blir för stora så kan jag flytta ut dessa till egna metoder för att öka läsförståelsen i den första metoden. Men om jag har 2 rader i min if-sats som är välavgränsade för just den metoden, så skulle jag aldrig skapa en ny metod för att lägga dessa 2 rader kod där i. Koden blir inte enklare att förstå för att man måste hoppa till 10 olika metoder för att kunna hantera 20 rader kod, bara för att man skall kunna skapa kod enlig SrR...

Dessutom så kan man ju fråga sig vad är Singel i sammanhanget, om dess uppgift är att skapa ett nytt objekt av någonting, så kan det ju även innebärar att det skall instasieras av data, och inte bara skapa ett objekt och sedan returnera tillbaka det. Hur bestämer man var gränsen går.. är det enda nere så att man har en metod för varje property som man sätter. Eller låter man en metod sätta alla property och en annan skapa objektet, eller har man en metod som skapar objektet och sätter alla property...

Att skriva program handlar inte om att följa vissa patterns så strikt som möjligt, patterns är till för att underlätta för utvecklaren och de finns där av en anledningen, men man skall inte glömma bort att i slutet av dagen så är det utvecklaren som skall stå bakom sin kod, och kunna underhålla den.

På förra stället som jag jobbade på hade man tagit fram riktlinjer för hur varje projekt skulle delas upp i olika lager och vad som skulle finnas i dessa lager, i teorin såg det riktig bra ut, men i verkligheten så hade man alldeles för mycket overhead för ungefär 85% av alla projekt som skrevs, de sista 15% var de som verkligen hade något att vinna på att följa dessa riktlinjer. De andra 85% var helt enkelt för små projekt (och för unka) för att ha någon nytta av att skapa services av alla affärslogik, och hade heller inte någon nytta av att man snabbt kunde skifta mellan ett WebUI och WinUI. Där var väldigt mycket YAGNI i dessa riktlinjer...

Alla patterns och riktlinjer skall appliceras med sunt förnuft och inte ut i sista beståndsdelen, då slutar det med att man lägger 80% av sin tid på att följa riktlinjer och 20% på att lösa problemet och inte tvärtom.

Angående felhantering så har jag nästan samma ståndpunkt som johan. Egentligen skall man inte kasta fel om felet inte är oväntat (där av namnet exception) utan man skall hantera det på ett annat sätt, just med true/false eller felkoder. Tyvärr är det inte speciellt praktiskt och därför skulle jag även kasta exceptions i de flesta fallen. Fall där man inte bör göra det är om man utvecklar för websiter och där felet kommer att vara vanligt förekommande (typ att man glömt fylla i något värde eller så), detta eftersom en exceptions suger prestanda, och i en win-applikation där du sitter själv så kommer man inte märka det, men helt plötsligt 200 besökare skulle börja kasta en massa exceptions i en web-appplikation så kommer det märkas tydligt...

Håller även med om att namnen på metoder och variabler skall vara tydliga och självförklarande, med intellisens (nej jag använder inte Resharper) så hittar man ju namet snabbt ändå, och tydliga namn som är självbeskrivande är underbara när man tittar på sin kod 6 månader senare...

Glömde bort kommentarerna...
Jag ser faktiskt inte kommentare i koden som en styggelse om de mer beskriver varför jag gör något än snarare hur jag gör det. Har många exempel på kod som är väldigt självförklarande vad den gör, men där man undrar varför den gör som den gör, och där ramlar det in en kommentar på varför denna kod ligger där den gör. Oftas blir det så i slutfasen av projekten när beställaren kommer på att den glömt några viktiga krav. Och då kommer fulhacken fram :). Eller när man måste koda sig runt konstiga implementationer av MS...

- M

Medlem sedan sep. 200888 inlägg
#11
public SomeThingToHandle CreateSomeThingToHandle()
{
      var someThingtoHandle = new SomeThingToHandle();
      someThingtoHandle.Number = GetNextValidNumber();
      ...
      return someThingToHandle;
}
private int GetNextValidNumber()
{
    return  GetNumA * GetNumB - GetNumC + NumberA;
}

Nu vet jag att detta är ett enkelt exempel och förstår precis vad du menar med det (så har vi klarat av det). Men det sagt så skall jag lägga in mina 2 cent här.

I ett sådant enkelt exempel som detta, där vi antar att GetNextValidNumber() inte kan återanvändas till något annat än just till den raden där ursprungskoden fanns, och det dessutom är gansaka intetsägande med en rad som bara lägger ihop 4 tal, så ser jag ingen som helst anledning att bryta ut detta och lägga i en egen funktion. Och det av 2 anledningar.

1. Det kommer krävas flerkod rader för mig att skriva eftersom jag behöver skapa en ny funktion.
2. Eftersom själva uträkningen är intetsägande (och inte hör hemma någonstans förutom i ursprungskoden) så måste jag kommenterar metoden ordentligt så när jag sedan kollar igenom min kod och ser denna metod 6 månader senare, så skall jag kunna förstå vad den gör och till vem den är relaterad till.

Detta _varför_ återspeglas med din kommentar längre ner om comments. Vist det är inte så avancerat att lägga till 4 olika tal men säger de vad de gör? Eller måste du kommentera? I det fall bör man refactorera för att beskriva vad jag gör exempelvis; hämta nästa valida nummer. Behöver jag av någon anledning kolla denna kod så har jag den i en egen metod för enkla justeringar. Men om det inte är denna kod jag skall justera så slipper jag läsa den. I ex 1 måste man typ läsa den för man vet inte vad den gör men den hör inte till den ändring jag ev vill göra. Här kommer även Single resposability Rules in. Utan GetNexvalidNumber så har helt plötsligt min metod mer än en uppgift, min metod kommer ha flera skäl till förändring. Det är just detta som i långa loppet av mycket kod orsakar oreda i koden och även oförståelse över den. Antal rader kod totalt i en klass är mer ointressant än antal rader tydlig självbeskrivande rader kod per metod.
Jag fick lägga till 4 rader med men får då en command i min metod som är tydlig. I andra fall hade man troligen lagt till en kommentar istället för säga vad man gör. En kommentar som troligen inte kommer att uppdateras om en ändring sker. Undersökningar har flera ggr om bevisat att man inte underhåller kommentarer utan man underhåller koden, så tillslut vet man inte vad koden gör för kommentarerna stämmer inte längre.
Det är just därför man extraheterar dem (refactoring) till beskrivande metoder även om de kanske Aldrig kommer att återanvändas mer än en gång. OBS! man refactorerar kod av många skäl, återanvändning är bara ett av skälen. Så stirra inte så blint på att Allt skall vara återanvändbart bara för man gör det till en ny metod.

...men man skall inte glömma bort att i slutet av dagen så är det utvecklaren som skall stå bakom sin kod, och kunna underhålla den.

Precis, men vem är utvecklaren? du eller dina kollegor eller de som tar över din kod efteråt? Även om man själv kodar skall man vara pragmatisk och alltid tänka, jag kodar för andra inte för mig själv. Anledningen till detta är för att om 2-3 mån eller 6-8 mån senare så kommer du troligen vara helt vilsen i din egen kod om det inte gjordes bra. Du kommer själv fundera om dina kommentarer stämmer (om du har sådana), du kommer själv undra vad fasen är dessa 4 tal för något och varför beräknar jag dem?

Glömde bort kommentarerna...
Jag ser faktiskt inte kommentare i koden som en styggelse om de mer beskriver varför jag gör något än snarare hur jag gör det. Har många exempel på kod som är väldigt självförklarande vad den gör, men där man undrar varför den gör som den gör, och där ramlar det in en kommentar på varför denna kod ligger där den gör. Oftas blir det så i slutfasen av projekten när beställaren kommer på att den glömt några viktiga krav. Och då kommer fulhacken fram :). Eller när man måste koda sig runt konstiga implementationer av MS...

Det är det många gör fel, de skriver i koden varför, detta varför hör hemma i design dokument inte i koden. "Jag lägger till en användare på detta konstiga sätt bara för att ett krav sa det"

"här adderar jag 10 000 poster för att veta vad totalen blir"

Första kommentaren är helt väderlös den andra kan man säkerligen extrahera till en beskrivande metod istället.

Varför hantera jag 4 tal i mitt exempel? Förklara det genom att titta på exempel nr 1 sen tittar du på exempel nummer 2 och du kommer genast inse att en kommentar i ex 1 hade nog behövts men inte i exempel 2.
Vad händer om rutinen ändras och NextValidNumber behöver sig en uppdatering, jo du kommer i ex 1 då försöka hitta vart kravet NextValidNumber beräknas, vilket inte kommer bli så lätt, i ex 2 vet du direkt vart du har denna beräkning. Och sist men inte minst du vet att den gör den där single som den skall. Dvs tack vare att det ligger i en annan metod o inte inbakad med massa andra responsabilities så kan du med säkerhet ändra det metoden returnerar och vara säker att metoden innan inte påverkas av ändringen.

En regel ang Single resposability Rule är det skall bara finnas ett skäl att ändra i metoden.

Medlem sedan juni 20008 205 inlägg
#12

OK, det är lite sådär halvseriöst kanske, men motsatser bidra till att klargöra: http://www.waterfall2006.com/.
Personlig favorit är http://www.waterfall2006.com/gorman.html (särskilt slidesen) :D

Medlem sedan maj 20012 812 inlägg
#13

johan skrev:

Det är det många gör fel, de skriver i koden varför, detta varför hör hemma i design dokument inte i koden.

Det håller jag som sagt inte alls med om, nämn de programmerare som sitter med design dokumentet i handen när de går igenom gammal kod! (om det ens finns något dokument kvar som är uppdaterat till koden...). Även om kommentarerna inte uppdateras lika flitigt som koden, så uppdateras design dokumenten ännu mindre än vad kommentarerna gör, helt enkelt av den anledningen att det finns någon helt annanstans än där koden finns.

Att kommenterar sin kod med att man bryter mot reglerna för att ett krav säger det ser jag som ett bra exempel på kommentarer. Det kommer förklara för nästa programmerar att jag är medveten om de fel jag gjort och de finns där av en anledning, om jag inte hade skrivit någon kommentar så hade nästa programmerar undrat varför man brutit mot reglerna och om det hade varit en driftig programmerar så hade han letat upp design dokumentet och letat fram kravet och om den första programmeraren hade varit duktig och lagt till denna kommentar i design dokumentet så hade de andra programmeraren nu vetat varför koden ser konstig ut. Men det är bra många fler barriärer som måste brytas för att det scenariot skall falla väl ut, jämfört med att första programmeraren skrivit kommentaren direkt i koden.

- M

Medlem sedan sep. 200888 inlägg
#14

Gladh skrev:

johan skrev:

Det är det många gör fel, de skriver i koden varför, detta varför hör hemma i design dokument inte i koden.

Det håller jag som sagt inte alls med om, nämn de programmerare som sitter med design dokumentet i handen när de går igenom gammal kod! (om det ens finns något dokument kvar som är uppdaterat till koden...). Även om kommentarerna inte uppdateras lika flitigt som koden, så uppdateras design dokumenten ännu mindre än vad kommentarerna gör, helt enkelt av den anledningen att det finns någon helt annanstans än där koden finns.

Att kommenterar sin kod med att man bryter mot reglerna för att ett krav säger det ser jag som ett bra exempel på kommentarer. Det kommer förklara för nästa programmerar att jag är medveten om de fel jag gjort och de finns där av en anledning, om jag inte hade skrivit någon kommentar så hade nästa programmerar undrat varför man brutit mot reglerna och om det hade varit en driftig programmerar så hade han letat upp design dokumentet och letat fram kravet och om den första programmeraren hade varit duktig och lagt till denna kommentar i design dokumentet så hade de andra programmeraren nu vetat varför koden ser konstig ut. Men det är bra många fler barriärer som måste brytas för att det scenariot skall falla väl ut, jämfört med att första programmeraren skrivit kommentaren direkt i koden.

- M

Så sant så... Vet ej om du läste min krönika på pellessoft om kommentarer och dokumentering?

Grejen är att folk skriver för mkt dokument. Ett design dokument skall vara litet och tunnt, det skall bara beskriva det viktigaste och helst så lite som möjligt för ingen orkar läsa dokument. Vi är kodare inte författare...

///ToDo kommentarer är helt ok att ha, i ditt fall ser jag det mer som en //ToDo med tanke på att det ev finns en förbättring, spec om du var tvungen att bryta mot någon regel? (vad det nu skulle vara... finns så många... §e )

Även ///ToDo är jobbiga om ingen ser till att bli av med dem o rätta till eller förbättre de ställen där ToDo:erna finns.

En annan fördel med att nästa programmerare skulle undra Varför är att denna person troligen skulle fråga dig personligen och ni tillsammans skulle då ev kunna komma med en förbättring. Om du inte finns kvar och denna undrar varför, om koden då är bra skriven kan denna person rätta till det så det inte finns någon varför. Det är tjusningen med bra kod, den är agile, den är underhållsbar och förändringsbar. Då har du lyckats skriva bra kod.

"Don't comment bad code -- rewrite it!" - W. Lernighan

Däremot kan det vara trevligt med kommentarer som ex kanske förklarar en regularexpression... för shit de är inte alltid så lätta att läsa :)

Medlem sedan maj 20012 812 inlägg
#15

En kommentar om SrR bara. Det finns motsvarande inom databasdesignen och det kallas ju som alla vet normalisering. Där är målet att man skall ha en så normaliserade databas som möjligt, och det finns exempel på groteska normaliseringsgrader, och det är inte att rekomendera. Om man skulle hårdra SrR till sin spets så skall varenda uträkning placeras i sin egen metod och varenda behandling av data placeras i sin egen metod, det blir inte hållbart i längden.

Och som jag frågade dig innan johan, praktiserar du detta i de projekt som du utvecklar? Där du med gott samvette kan säga att du följer SrR till punkt och pricka? Så fall är jag imponerad, och det säger jag utan att vara sarkastisk...

- M

Medlem sedan juni 20019 024 inlägg
#16

spango skrev:

OK, det är lite sådär halvseriöst kanske, men motsatser bidra till att klargöra: http://www.waterfall2006.com/.
Personlig favorit är http://www.waterfall2006.com/gorman.html (särskilt slidesen) :D

Haha, ska läsa vidare i boken Mortgage-driven Development tror jag. ;)

Medlem sedan sep. 200888 inlägg
#17

Gladh skrev:

En kommentar om SrR bara. Det finns motsvarande inom databasdesignen och det kallas ju som alla vet normalisering. Där är målet att man skall ha en så normaliserade databas som möjligt, och det finns exempel på groteska normaliseringsgrader, och det är inte att rekomendera. Om man skulle hårdra SrR till sin spets så skall varenda uträkning placeras i sin egen metod och varenda behandling av data placeras i sin egen metod, det blir inte hållbart i längden.

Och som jag frågade dig innan johan, praktiserar du detta i de projekt som du utvecklar? Där du med gott samvette kan säga att du följer SrR till punkt och pricka? Så fall är jag imponerad, och det säger jag utan att vara sarkastisk...

- M

Absolut, annars skulle jag inte skriva att jag föredrar det :/ nej skämt o sido.
Jag kan inte till 100% säga att min kod är 100% baserad på SrR för det är rätt mkt man skall hålla reda på... Ibland är gränsen svår att dra, det är något man hela tiden lär sig och utvecklas inom oxå. Inte ens Picasso målade den perfekta tavlan även om han hade ett bra arbetsätt... Någonstans kan man missa... Men det viktiga är att andra kan hitta missen, bara det är tecken på att man kodat tydligt... När felen även syns tydligt så de går att rätta till...

Koddesign är ett stort intresse oxå...

Och det roliga är att jag nu inte bara kodar mkt mkt mkt snabbare, kvalitén är oftast sjukt hög och antal kodrader klasser m.m. har minskat markatn och lika så buggar. tack vare den stora löskoppling som i princip automatiskt skapas när man följer en del principles så har underhåll, justeringar och utökningar av funktioner underlättat markant.

Men det kräver ständig codereview, av dig själv, genom andra men även kunna gå tillbaka till sin kod lite senare för att hitta förbättringar, saker i koden du inte tyckte du skrev så bra. Det låter som ett stort proejtk att arbeta så men det är det inte. För shit vad mkt spill man lägger ner för när både metoder och klasser är förstora, har för mkt redundans, redundanta-mönster och har för mkt betéenden som borde extraheras bort etc...

Håller man små klasser så blir det inte så hiskeliggt många metoder heller som många kan tro... som brukar vara ett hett argument...

Men det viktigaste är att veta att hur bra man än tror man är så är man inte bra... :) och ingen kan vara bäst...

Medlem sedan maj 20012 812 inlägg
#18

Jag hittade faktiskt en kommentar i min kod som jag tycker är rätt så passande där den finns.

            //HACK: We need to reset the IsEdit flag to false, since it has been set to true, when we did set our category.
            //HACK: So if we don't set this flag to false, the application will think the entity isn't saved and raise the popup-save box...
            ((Entity.BaseEntity)item).IsEdit = false;

Här är ett lite fulhack som jag är tvingad till att sätta. För att göra en långhistoria kort, så är har alla fält utom Category fältet databinding, det betyder när jag trycker på save knappen så är alla data redan satt på min entitet utom jus Category som jag måste göra för hand i klassens SaveMetod() och i och med att jag sätter en category så kommer IsEdit ändras till True, och kommer så fall slänga upp en popup-som säger att datan är ändrad vill du spara, och detta när jag tryckt på spara knappen :(

Så det blev ett fulhack och en kommentar till varför detta fulhack finns där det finns, så jag inte 6 månader senare undrar varför IsEdit skall sättas till false där och kommenterar ut raden...

En bra kommentering IMHO.

- M

Medlem sedan nov. 20014 054 inlägg
#19

Ja, en bra kommentering. Och det är för att undvika problematik..

Själv vill jag ha en balans mellan koden och kommentarerna. På skolan så vill de att man kommenterar koden sjukt för mycket. :l

Jag kommer snarare att inte skriva en enda kommentar, utan försöka skriva metoder som är själv beskrivande, till och med för mamma min. :p

Medlem sedan sep. 200888 inlägg
#20

Gladh skrev:

Jag hittade faktiskt en kommentar i min kod som jag tycker är rätt så passande där den finns.

            //HACK: We need to reset the IsEdit flag to false, since it has been set to true, when we did set our category.
            //HACK: So if we don't set this flag to false, the application will think the entity isn't saved and raise the popup-save box...
            ((Entity.BaseEntity)item).IsEdit = false;

Här är ett lite fulhack som jag är tvingad till att sätta. För att göra en långhistoria kort, så är har alla fält utom Category fältet databinding, det betyder när jag trycker på save knappen så är alla data redan satt på min entitet utom jus Category som jag måste göra för hand i klassens SaveMetod() och i och med att jag sätter en category så kommer IsEdit ändras till True, och kommer så fall slänga upp en popup-som säger att datan är ändrad vill du spara, och detta när jag tryckt på spara knappen :(

Så det blev ett fulhack och en kommentar till varför detta fulhack finns där det finns, så jag inte 6 månader senare undrar varför IsEdit skall sättas till false där och kommenterar ut raden...

En bra kommentering IMHO.

- M

varför inte göra typ:

              Category category = (Entity.BaseEntity)item;
              ResetIsEditIfSaved(category);

För att vara petig. hur vet man att item är category om man inte förtydligar det?

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