webForumDet fria alternativet

Bra vs dålig kod/design?

.NET

29 svar · 1 936 visningar · startad av johannormen · sida 2 av 2

Frågan, av johannormen

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

Läs frågan i sin helhet →
Medlem sedan sep. 200888 inlägg
#21

Fredde Mannen skrev:

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

hehe... [Skämt] Hoppas du inte argumenterar med dina kollegor med - Min lärare sa... HEHE [/Skämt]

Nä ärligt, sedan när var lärare bra utvecklare?
Kommentering är ett ondo som härstammar från funktionsorienteringstiden då du i princip hade millånga rader kod, det gick inte göra koden så tydlig då därav kommentarer. Just detta sitter kvar i folket då de oftast skolas av äldre eller sitter hemma o läser demo kod som har kommentarer. Att demokod typ MSDN siten etc har kommentarer är för att lära ut, men många tar efter och tror att man gör så bara för att exemplerna har det.

Idag har vi OO och OOP ok kanske inte bäst även om der är bra. Men tack vare OOP så behöver du inte koda efter old school rules.

Fråga din lärare nästa gång, varför kommenterar vi? Säger han/hon för att man skall förstå koden. Säg då är det inte bättre att skriva bra kod, kod med tydliga metoder och variabler som ersätter kommentarerna? För varför förklara något man kan förklara med kod?
Är inte kommentarer tecken på otydlig kod?

Tänk om vi skulle adda kommentera i alla bilder vi gör. Här är en häst. jag satte hästen i gyllenesnittet för att jag tyckte det var snyggt...

Jag målade inte klart solen för jag tyckte det var fräckt när pappret fick vara en sol. hum...

§e

Medlem sedan sep. 200888 inlägg
Medlem sedan aug. 20003 575 inlägg
#23

Går igenom ett program som skrevs för ett bra tag sedan.
Förkortningar som

Vl = Value :| hur jobbigt är det att skriva Value?

Medlem sedan maj 20012 812 inlägg
#24

johan skrev:

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

Det vet man inte, och utan att du ens tänkt på det, så har du faktiskt bevisat hur fel det blir, för Item är inte Category, det är Article som har en property Category... :(

- M

Medlem sedan sep. 200888 inlägg
#25

Gladh skrev:

johan skrev:

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

Det vet man inte, och utan att du ens tänkt på det, så har du faktiskt bevisat hur fel det blir, för Item är inte Category, det är Article som har en property Category... :(

- M

Jaha... hehe...

Medlem sedan jan. 20022 440 inlägg
#26

Eftersom vi tydligen har i alla fall 4 stycken extremt duktiga utvecklare i den här tråden så kan ni ju svara på den här frågan gällande att hantera händelser i en klass. Jag har fält som heter width, length och thickness. Dessa ska få ett värde tilldelat sig när Widths, Lengths och Thicknesses får ett värde. Hur ska jag hantera det korrekt? Det är fält som inte ska inte sparas i någon databas utan bara användas för att räkna ut volym och lite annat. Sedan behöver jag ju en metod för att räkna ut värdena. Jag har nu suttit och snorat över det här en stund och får inte riktigt till någon lösning som jag känner blir tillräckligt "snygg" designmässigt. Kollegan vill att jag räknar ut allting i Form1.cs vilket jag givetvis vägrar.

Medlem sedan sep. 200888 inlägg
#27

Skall se om jag hängde med rätt. Du har proppar och när ex en propp ändras skall alla andra uppdateras oxå?

Om så är fallet skulle jag satt event på propparna som triggar en businessmetod som jag har i klassen. Antingen private eller publik beroende på om man vill manuellt räkna om dem.

Fast vi borde öppna en ny tråd för detta istället.

Mvh Johan

Medlem sedan jan. 20022 440 inlägg
#28

johannormen skrev:

Skall se om jag hängde med rätt. Du har proppar och när ex en propp ändras skall alla andra uppdateras oxå?

Om så är fallet skulle jag satt event på propparna som triggar en businessmetod som jag har i klassen. Antingen private eller publik beroende på om man vill manuellt räkna om dem.

Fast vi borde öppna en ny tråd för detta istället.

Mvh Johan

Ok jag öppnar en ny tråd på ämnet dumt av mig..

Medlem sedan feb. 200563 inlägg
#29

johannormen skrev:

Bra böcker till ämnet:
Code Complete - MS Press
...

Ja, den boken är bra, inte minst för att den innehåller en hel del referenser till diverse studier. Exempelvis i kapitlet som handlar om längden på metoder/"rutiner" (kapitel 7.4) så propagerar inte författaren för en subjektiv åsikt om hur långa rutinerna ska vara, utan hänvisar till sex olika studier angående vilken längd som leder till minst problem. I det sammanfattande stycket kan man bl.a. läsa följande:
"... From time to time, a complex algorithm will lead to a longer routine, and in those circumstances, the routine should be allowed to grow organically up to 100-200 lines. (A line is a noncomment, nonblank line of source code.) Decades of evidence say that routines of such length are no more error prone than shorter routines...."

Missförstå mig nu inte och tro att jag rekommenderar långa metoder, för det gör jag definitivt inte, men jag vänder mig bara mot följande attityd att det är ett ändamål i sig att hålla ner antalet rader till ett minimum med en övre gräns på 10 rader:

johannormen skrev:

...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...

I sammanhanget kan det även vara värt att kommentera följande bok (som jag också håller med om att den är bra):

johannormen skrev:

Bra böcker till ämnet:
...
Refactoring - Martin Fowler
...

I den boken finns bl.a. en refactoring som heter Inline Method som man kan använda när man har metoder som "are no longer pulling their weight" eller när man "get lost in all the delegation".

Det är med andra ord inte självklart att extrahera metoder till så små metoder som möjligt, såvida man inte vill ifrågasätta existensen av den motsatta refaktoriseringen "Inline Method", men mig veterligen så är den inte kontroversiell (och jag tycker själv inte att den borde vara det, utan att den helt klart kan vara befogad ibland).

Observera alltså att "Inline Method" är en refactoring som går i motsatt riktning som den refactoring Extract Method som användes i exemplet i denna tråd där rekommendationen var att byta ut:

johannormen skrev:

someThingtoHandle.Number = GetNumA * GetNumB - GetNumC + NumberA;

mot en ny extraherad metod:

johannormen skrev:

someThingtoHandle.Number = GetNextValidNumber();

och jag håller inte med det exemplet (med exemplets befintliga metodnamn) såvida inte beräkningen "GetNumA * GetNumB - GetNumC + NumberA" återanvänds, för i så fall är det självklart att extrahera beräkningen till en egen metod.
Så länge metoden inte återanvänds så ser jag ingen anledning till att lägga den i en egen metod (med de metodnamn som används) eftersom semantiken i den anropade metoden inte tillför särskilt mycket. Jag menar, eftersom det finns många sätt för ett nummer att vara "valid" så är "GetNextValidNumber" nästan lika intetsägande som "GetNumA" och "GetNumB". Med ett mer verkligt exempel så skulle det förstås kunna vara på det viset att den extraherade metoden får ett namn som faktiskt beskriver vad man får fram för slags värde, t.ex. genom någon typ av beräkning, och i så fall har den ett större existensberättigande som egen metod, även om den inte återanvänds.

Min poäng är alltså att man inte ska fokusera så mycket på metodlängden för att avgöra huruvida man borde dela upp en metod på flera metoder, utan det är andra parametrar som borde avgöra, bl.a. om den nya metoden kan erbjuda semantik som gör koden mer läsbar. Det är dock inte alltid självklart att en extra metod förbättrar semantiken, vilket den ovanstående länken till "Inline Method" illustrerar, där Fowler refaktoriserar bort metoden "moreThanFiveLateDeliveries()" och istället använder inline-uttrycket "numberOfLateDeliveries > 5" eftersom han anser att det ger lika tydlig kod.
En annan viktig faktor (förutom den förbättrade semantiken som ett metodanrop eventuellt kan erbjuda) som påverkar metodlängden är förstås den nämnda Single Responsibility Principle (SRP) vilket f.ö. är ungefär samma sak som High Cohesion (HC) och i Code Complete så skriver författaren bl.a. att "rutinens cohesion" är en bidragande faktor som påverkar hur lång en metod lämpligen bör vara ("rather than imposing a length restriction per se") tillsammans med bl.a. "depth of nesting", "number of variables" m.m.

För den som programmerar i C# så kan det förresten vara särskilt frestande att utnyttja/missbruka en särskild "feature" nämligen output-variabler så att man låter en metod returnera flera olika värden.
(i java finns inte den direkta möjligheten, men däremot finns liknande möjligheter att indirekt populera flera output-variabler t.ex. via en input-hashtabell så att man därigenom skapar ännu groteskare kod...)
I en sådan situation (med flera output-parametrar) så blir metoden sannolikt längre eftersom den ska plocka ut flera värden, men då är grundproblemet att man inte tillämpar SRP/HC inom metoden, och längden på metoden är förstås beroende på hur många olika saker man låter metoden utföra, och det är detta som man alltså ska fokusera på (dvs fokusera på SRP/HC och inte på att minimera antalet rader i metoden, vilket istället bör bli en bieffekt). Om man tillämpar SRP/HC så blir metoderna kortare än om man inte gör det, vilket är bra (t.ex. är det ju väldigt trevligt att kunna läsa en hel metod på skärmen utan scrollning) men det är alltså inget automatiskt självklart ändamål att minimera antalet rader eller att sikta på högst 10 rader, utan som sagt var så bör man ha i åtanke att:
"...up to 100-200 lines...Decades of evidence say that routines of such length are no more error prone than shorter routines...." (Code Complete, 2:a upplagan, sid 174, kapitel 7.4)

/ Tomas

Medlem sedan jan. 20022 440 inlägg
#30

TomasJ skrev:

... utan som sagt var så bör man ha i åtanke att:
"...up to 100-200 lines...Decades of evidence say that routines of such length are no more error prone than shorter routines...." (Code Complete, 2:a upplagan, sid 174, kapitel 7.4)

/ Tomas

Och där satt den sista spiken i den diskussionen ;)

262 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)