400.000 projekter kan ikke tage fejl: Mellemrum slår tabulator

Skal man bruge mellemrum eller tabulator til indrykning i programkode? En Google-udvikler har set nærmere på én milliard filer på Github.

Mellemrum eller tabulator? Den ene er universel og entydig, den anden er effektiv og fleksibel, men valget mellem dem deler vandene, når udviklere skal blive enige om, hvordan man bedst laver indrykning i programkode.

Nu har Google-udvikler Felipe Hoffa set nærmere på én milliard filer på Github fordelt på 400.000 open source-repositories eller projekter, og konklusionen er en overbevisende sejr til mellemrum.

Læs også: Tabulator eller mellemrum? Silicon Valley-serien rammer et ømt punkt

Spørgsmålet om tabulator eller mellemrum blev trukket frem i lyset, da det blev gjort til et centralt punkt i tv-serien Silicon Valley i den seneste sæson af serien.

Analysen blev gjort mulig gennem et tidligere projekt, Google annoncerede i juni, Big Query, hvor Google har indsamlet mere end tre terabyte data fra 2,8 millioner open source-projekter på Github med det formål at kunne analysere på en enorm mængde kode fra mange forskellige udviklere.

Det kan eksempelvis bruges til at finde frem til, hvor mange gange udviklere har skrevet en kommentar i koden såsom 'This should never happen'.

Og nu har Felipe Hoffa altså afgjort kampen mellem mellemrum og tabulator. Det mest interessante er dog, at der er variation mellem forskellige programmeringssprog. I et sprog som Python er indrykning vigtig, og her er mellemrum standard, så det er ikke overraskende, at Python-koden næsten udelukkende bruger mellemrum.

Google er til gengæld stor fortaler for tabulator, og der er ingen Go-kode i analysen, hvor udviklere har veget fra kursen og sneget mellemrum ind.

Sproget C skiller sig også ud ved at hælde mest mod tabulator, men med en næsten ligelig fordeling mellem de to.

Analysen har kun set på filer fra de 400.000 højst rangerede respositories på Github, ligesom filerne skulle have mindst 10 kodelinjer med indrykning.

Tips og korrekturforslag til denne historie sendes til tip@version2.dk
Følg forløbet
Kommentarer (28)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Sebastian Paaske Tørholm

Men hvorfor skal andre udviklere bestemme om jeg foretrækker at indrykningen skal være 2, 4, 8 eller noget helt andet. Med tabulator styrer jeg selv hvordan koden ser ud.

Al fred være med det, så længe du konsekvent bruger tabs til al indrykning, og så mellemrum til at justere ting under hinanden. Fx, hvis "---|" repræsenterer et tab:

---|if ($foo) {  
---|---|if ($bar == $baz &&  
---|---|    $qux > 10) {

(Læg mærke til, at det er mellemrum der bruges til at justere $qux under $bar.)

Min erfaring er, at her vil mange der bruger tabs være fristet til også at bruge tabs til at justere $qux under $bar:

---|if ($foo) {  
---|---|if ($bar == $baz &&  
---|---|---|$qux > 10) {

Men så er det jo, at man ikke kan justere tab-størrelsen uden at ødelægge formatteringen:

-|if ($foo) {  
-|-|if ($bar == $baz &&  
-|-|-|$qux > 10) {

Derfor er jeg stærk fortaler for mellemrum, behandlet som tabs af ens editor. Så kan man manipulere dem som var de tabs, og koden vil se korrekt indrykket ud for alle.

  • 10
  • 1
Per Krarup

-er fordi det er det der fungerer bedst i mange IDEer - det svære.

I min foretrukne editor betyder et tryk på TAB tasten, at min kode bliver rykket ind (eller ud) så den, på en intelligent måde, passer med koden på linjen oven over. Det er således aldrig nødvendigt at fedte rundt med tabulator og mellemrumstegn til indrykning.

Jeg har så valgt, at indrykningsfunktionen skal benytte mellemrum, så koden ikke ændrer udseende når den vises på konsollen med diff, grep, patch m.v. - men det er jo ikke relevant for alle...

Nogle har altså god grund til at vælge det ene og andre har god grund til at vælge det andet. Så må man bare håbe, at de ikke skal arbejde på den samme kode. :-)

  • 0
  • 0
Claus Futtrup

Hej PHK - kan du evt. give os et kort svar uden at jeg nødvendigvis må læse bogen?

I øvrigt bruger jeg space i min kode, bare til orientering... men argumentationen med at flertallet har ret dur i min optik overhovedet ikke.

  • 3
  • 0
Rune Jensen

Det er vel ikke en appeal to popularity fallacy, hvis målet er standarder for samarbejde i f.eks. et team.

Jeg synes, hvis man har et IDE, hvor man kan bruge TABs men at det oversættes til spaces for andre, eller man automatisk kan indsætte korrekt antal spaces med tryk på på TAB ell. lign., så ville jeg i et givent project benytte hvad flertallet benytter. Udadtil. I min egen kode bruger jeg konsekvent TABs.

Visse open source projecter har sat en standard for deres kode med f.eks. spaces, så ville jeg bruge det til dem, men stadig internt arbejde med tabs.

Så det er nok ikke så meget hvad folk selv foretrækker, mere om deres IDE er gearet til at følge den "officielle" standard for et project.

  • 0
  • 0
Rune Jensen

I serverside kode, som kun jeg ser, bruger jeg altid bare tabs. Det fylder mindre end spaces, man kan selv sætte hvor mange spaces en tab skal fylde (jeg har den konsekvent på 3), og så kan man sætte en fast afstand ved et enkelt tryk.

Mine indrykninger er så også meget kosmetiske alene for at lette overskuleligheden, og jeg deler gerne condition udtryk (f.eks. en IF med mange OR eller AND) over flere linjer for at holde kort enkelt linjelængde, hvilket måske kan synes at gå over gevind for nogle.

Readability er ét og alt.

  • 0
  • 0
Michael Als

Hvis man har brug for at splitte sin if statement op i to så i stedet for at beholde den ene på samme linje, så lav en ny linje for hver ny condition.

---|if ($foo) {    
---|---|if ($bar == $baz &&    
---|---|    $qux > 10) {

Så flyt begge conditions ned. Så er der styr på indenteringen igen.

---|if ($foo){    
---|---|if (  
---|---|---|$bar == $baz &&    
---|---|---|$qux > 10 &&  
---|---|---|$tabsErBedst = true // Nej der mangler ikke et = :-)  
---|---|){
  • 1
  • 2
Hans Schou

En space og en tabulator indrykning er det samme.

To space indrykning og to tabulator er ikke det samme.

Flere space indrykning (bekrig selv hinanden med antal) er layout.

Rigtige programmører bevæger sig ikke ud i layout, kun kode. Vælg selv din indryknings-layout-antal.

  • 0
  • 0
Thomas Jørgensen

Mange af de projekter jeg arbejder med har haft flere udviklere inde over. Hver har haft sin egen tilgang til indrykninger. Når jeg møder en fil som ikke matcher min måde at gøre det på beder jeg IDE'en autoformatere koden efter min preference. Det har endnu aldrig ført til fejlende tests eller fejl i UI.
Men jeg arbejder heller ikke i sprog hvor indrykning er en del af syntaksen.

  • 0
  • 0
Morten Toudahl

Nej, der bliver indsat 4 enkeltstående mellemrum, I stedet for et \t når man trykker på tab.

Selv er jeg fløjtende ligeglad om der er det ene eller andet i min kode. Men det kunne aldrig falde mig ind at trykke gentagne gange på en knap i stedet for 1/4 så mange tryk på en anden.
Selvfølgelig med mindre at sproget eller code convention på arbejdet dikterer andet

  • 0
  • 0
Ditlev Petersen

Tabulator hvis dagnummeret er et primtal? Jonathan Swift ville have elsket denne debat.
Dumt spørgsmål (jeg har ikke gidet undersøge det): Hvis man altid autoformatterer kode, der ikke lige passer til ens personlige stil, bare fordi, får man så ikke en frygtelig masse betydningsløse ændringer, når man graver i versionshistorikken på et program? Man skal tænke lige så meget på dem, der kommer efter en, som på sig selv. Mindst.

  • 1
  • 0
Rune Jensen

Hvis man har brug for at splitte sin if statement op i to så i stedet for at beholde den ene på samme linje, så lav en ny linje for hver ny condition.

Ja, det er hvad jeg gør. Også selv om det som en anden siger, er layout, ikke programmering.

Det er ganske vigtigt for mig, at jeg kan se tilbage på gammel kode og umiddelbart danne mig indtryk af, hvad det gør. Udfra remarks selvfølgelig, men kodeopstillingen giver også gode clues. Ligesådan gør selvfølgelig valg af navne på variable og funktioner.

Til gengæld, hvis koden danner f,eks, HTML, så er selve HTMLens opstilling ikke så vigtig på output. Samme med JS og CSS. Her laver jeg gerne minifying.

Det vigtigste er, at selve sourcen fra min side er readable.

  • 0
  • 0
Kim Bygum

Rigtig dårlig ide - ødelægger diff af din kode!!

Nu kan man jo diffe med ignorering af whitespace.

I øvrigt, hvis jeg skal overtage ansvaret for noget kode starter jeg med at fjerne alle tabs (og nogle andre småting som ikke er relevante her), checke ind og lave et build med samme versionsinfo. Så kan jeg verificere, at output er identisk (embedded sw, ikke windows sw).

  • 0
  • 0
Log ind eller Opret konto for at kommentere
Jobfinder Logo
Job fra Jobfinder

Call to action

Mellemrum eller tabulator? Den ene er universel og entydig, den anden er effektiv og fleksibel, men valget mellem dem deler vandene, når udviklere skal blive enige om, hvordan man bedst laver indrykning i programkode. Nu har Google-udvikler Felipe Hoffa set nærmere på én milliard filer på Github fordelt
på 400.000 open source-repositories eller projekter, og konklusionen er en overbevisende sejr til mellemrum. Læs også: Tabulator eller mellemrum? Silicon Valley-serien rammer et ømt punkt Spørgsmålet om tabulator eller mellemrum blev trukket frem i lyset, da det blev gjort til et centralt punkt i tv-serien Silicon Valley i den seneste sæson af serien. Analysen blev gjort mulig gennem e...