Programmeringsstil - Programming style

Programmeringsstil , også kendt som kodestil , er et sæt regler eller retningslinjer, der bruges, når du skriver kildekoden til et computerprogram . Det hævdes ofte, at det at følge en bestemt programmeringsstil vil hjælpe programmører med at læse og forstå kildekoden, der svarer til stilen, og hjælpe med at undgå at introducere fejl.

Et klassisk værk om emnet var The Elements of Programming Style , skrevet i 1970'erne og illustreret med eksempler fra Fortran- og PL / I- sprogene, der var fremherskende på det tidspunkt.

Programmeringsstilen, der anvendes i et bestemt program, kan stamme fra kodningskonventionerne for en virksomhed eller en anden computerorganisation såvel som præferencer for forfatteren af ​​koden. Programmeringsstile er ofte designet til et specifikt programmeringssprog (eller sprogfamilie): stil, der betragtes som god i C- kildekode, er muligvis ikke passende for BASIC- kildekode osv. Nogle regler anvendes dog ofte på mange sprog.

Elementer af god stil

God stil er en subjektiv sag og er vanskelig at definere. Der er dog flere elementer, der er fælles for et stort antal programmeringsstile. De spørgsmål, der normalt betragtes som en del af programmeringsstilen, inkluderer kildekodens layout , herunder indrykning ; brugen af hvidt rum omkring operatører og nøgleord; store eller små bogstaver i nøgleord og variabelnavne typografien og stavningen af ​​brugerdefinerede identifikatorer, såsom funktion, procedure og variabelnavne og brugen og stilen af kommentarer .

Kode udseende

Programmeringsstile behandler ofte det visuelle udseende af kildekoden med det formål at være læsbar. Software har længe været tilgængelig, der automatisk formaterer kildekoden, hvilket lader kodere koncentrere sig om navngivning, logik og højere teknikker. Som et praktisk punkt sparer tid ved at bruge en computer til at formatere kildekoden, og det er muligt derefter at håndhæve virksomhedsdækkende standarder uden debatter .

Indrykning

Indrykningsformater hjælper med at identificere kontrolflow og kodeblokke. På nogle programmeringssprog bruges indrykning til at afgrænse logiske kodeblokke; korrekt fordybning i disse tilfælde er mere end et spørgsmål om stil. På andre sprog påvirker indrykket og det hvide mellemrum ikke funktionen, skønt logisk og ensartet indrykning gør koden mere læsbar. Sammenligne:

if (hours < 24 && minutes < 60 && seconds < 60) {
    return true;
} else {
    return false;
}

eller

if (hours < 24 && minutes < 60 && seconds < 60)
{
    return true;
}
else
{
    return false;
}

med noget lignende

if  ( hours   < 24
   && minutes < 60
   && seconds < 60
)
{return    true
;}         else
{return   false
;}

De to første eksempler er sandsynligvis meget lettere at læse, fordi de er indrykket på en etableret måde (en "hængende afsnit" -stil). Denne indrykningsstil er især nyttig, når du beskæftiger dig med flere indlejrede konstruktioner.

ModuLiq

ModuLiq Zero Indentation Style grupperer med vognretur snarere end fordybninger. Sammenlign alle ovenstående med:

if (hours < 24 && minutes < 60 && seconds < 60)
return true;

else
return false;

Lua

Lua bruger ikke de traditionelle krøllede seler eller parenteser . if / else-udsagn kun kræver, at udtrykket efterfølges af then, og lukning af if / else-sætningen med end.

if hours < 24 and minutes < 60 and seconds < 60 then
  return true
else
  return false
end

Indrykning er valgfri. and, or, notBruges i mellem sande / falske oplysninger.

De er sande / falske udsagn, som

print(not true)

ville betyde falsk.

Python

Python bruger indrykning til at indikere kontrolstrukturer, så det kræves korrekt indrykning . Ved at gøre dette elimineres behovet for parentes med krøllede seler (dvs. {og }). På den anden side kan kopiering og indsætning af Python-kode føre til problemer, fordi indrykningsniveauet for den indsatte kode muligvis ikke er det samme som indrykningsniveauet for den aktuelle linje. Sådan omformatering kan være kedelig at gøre i hånden, men nogle teksteditorer og IDE'er har funktioner til at gøre det automatisk. Der er også problemer, når Python-kode gøres ubrugelig, når den sendes på et forum eller en webside, der fjerner det hvide område, selvom dette problem kan undgås, hvor det er muligt at omslutte kode i tags, der bevarer hvidt rum, såsom "<pre> .. . </pre> "(for HTML )," [code] "..." [/ code] "(for bbcode ) osv.

if hours < 24 and minutes < 60 and seconds < 60:
    return True
else:
    return False

Bemærk, at Python ikke bruger krøllede seler, men et almindeligt kolon (f.eks. else:).

Mange Python-programmører har tendens til at følge en almindeligt aftalt stilvejledning kendt som PEP8. Der er værktøjer designet til at automatisere PEP8-overholdelse.

Haskell

Haskell har ligeledes off-side-reglen , dvs. at den har en todimensionssyntaks, hvor indrykning er meningsfuld til at definere blokke (selvom en alternativ syntaks bruger krøllede seler og semikoloner). Haskell er et deklarativt sprog, der er udsagn, men erklæringer inden for et Haskell-script. Eksempel:

let c_1 = 1
    c_2 = 2
in
    f x y = c_1 * x + c_2 * y

kan skrives i en linje som:

let {c_1=1;c_2=2} in f x y = c_1 * x + c_2 * y

Haskell tilskynder til brug af læsefærdig programmering , hvor udvidet tekst forklarer kodens oprindelse. I literate Haskell-scripts (navngivet med lhsudvidelsen) er alt en kommentar undtagen blokke markeret som kode. Programmet kan skrives i LaTeX , i så fald codemarkerer miljøet, hvad der er kode. Hvert aktivt kodeafsnit kan også markeres ved at gå foran og slutte det med en tom linje og starte hver kodelinje med et tegn større end et mellemrum. Her et eksempel ved hjælp af LaTeX markup:

The function \verb+isValidDate+ test if date is valid
\begin{code}
isValidDate :: Date -> Bool
isValidDate date = hh>=0  && mm>=0 && ss>=0
                 && hh<24 && mm<60 && ss<60
 where (hh,mm,ss) = fromDate date
\end{code}
observe that in this case the overloaded function is \verb+fromDate :: Date -> (Int,Int,Int)+.

Og et eksempel ved hjælp af almindelig tekst:

The function isValidDate test if date is valid

> isValidDate :: Date -> Bool
> isValidDate date = hh>=0  && mm>=0 && ss>=0
>                  && hh<24 && mm<60 && ss<60
>  where (hh,mm,ss) = fromDate date

observe that in this case the overloaded function is fromDate :: Date -> (Int,Int,Int).

Lodret justering

Det er ofte nyttigt at justere lignende elementer lodret, for at gøre typografiske bugs mere tydelige. Sammenligne:

$search = array('a', 'b', 'c', 'd', 'e');
$replacement = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value = 0;
$anothervalue = 1;
$yetanothervalue = 2;

med:

$search      = array('a',   'b',   'c',   'd',   'e');
$replacement = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value           = 0;
$anothervalue    = 1;
$yetanothervalue = 2;

Sidstnævnte eksempel gør to ting intuitivt klare, som ikke var klare i den førstnævnte:

  • søge- og erstatningsudtrykkene er relaterede og matcher hinanden: de er ikke diskrete variabler;
  • der er et mere søgeudtryk, end der er erstatningsudtryk. Hvis dette er en fejl, er det nu mere sandsynligt, at den bliver set.

Bemærk dog, at der er argumenter mod lodret justering:

  • Inter-line falske afhængigheder ; tabelformatering skaber afhængigheder på tværs af linjer. For eksempel, hvis en identifikator med et langt navn føjes til et tabellayout, skal kolonnebredden muligvis øges for at imødekomme den. Dette tvinger en større ændring af kildekoden end nødvendigt, og den væsentlige ændring kan gå tabt i støj. Dette er skadeligt for revisionskontrol, hvor det er vigtigt at undersøge forskelle mellem versioner.
  • sprødhed ; hvis en programmør ikke pænt formaterer bordet, når han foretager en ændring, måske legitimt med det forrige punkt i tankerne, bliver resultatet et rod, der forværres med yderligere sådanne ændringer. Enkle refactoring-operationer, såsom søg-og-erstat, kan også bryde formateringen.
  • Modstand mod modifikation ; tabelformatering kræver mere indsats for at vedligeholde. Dette kan afskrække en programmør fra at foretage en fordelagtig ændring, såsom at tilføje, rette eller forbedre navnet på en identifikator, fordi det ødelægger formateringen.
  • Afhængighed af skrifttype med monoafstand ; tabelformatering forudsætter, at editoren bruger en skrifttype med fast bredde. Mange moderne kodeditorer understøtter proportionale skrifttyper, og programmøren foretrækker muligvis at bruge en proportional font til læsbarhed.
  • Værktøjsafhængighed ; noget af bestræbelserne på at opretholde tilpasningen kan afhjælpes med værktøjer (f.eks. en kildekodeditor, der understøtter elastiske tabstops ), selvom det skaber en tillid til sådanne værktøjer.

For eksempel, hvis der udføres en simpel refactoring-handling på ovenstående kode, der omdøber variablerne "$ erstatning" til "$ r" og "$ en anden værdi" til "$ a", vil den resulterende kode se sådan ud:

$search      = array('a',   'b',   'c',   'd',   'e');
$r = array('foo', 'bar', 'baz', 'quux');

// Another example:

$value           = 0;
$a    = 1;
$yetanothervalue = 2;

Den oprindelige sekventielle formatering vil stadig se fint ud efter en sådan ændring:

$search = array('a', 'b', 'c', 'd', 'e');
$r = array('foo', 'bar', 'baz', 'quux');

// Another example:
 
$value = 0;
$a = 1;
$yetanothervalue = 2;

Pladser

I de situationer, hvor der kræves noget hvidt rum, er grammatikken på de fleste sprog i frit format ikke bekymret over det beløb, der vises. Stil relateret til hvidt rum bruges ofte til at forbedre læsbarheden . Der er i øjeblikket ingen kendte hårde fakta (konklusioner fra undersøgelser) om, hvilke af de hvide rumstilarter, der har den bedste læsbarhed.

Sammenlign for eksempel følgende syntaktisk ækvivalente eksempler på C-kode:

int i;
for(i=0;i<10;++i){
    printf("%d",i*i+i);
}

imod

int i;
for (i = 0; i < 10; ++i) {
    printf("%d", i * i + i);
}

Faner

Brug af faner til at skabe hvidt rum giver særlige problemer, når der ikke tages tilstrækkelig omhu, fordi placeringen af ​​tabuleringspunktet kan være forskelligt afhængigt af de anvendte værktøjer og endda brugerens præferencer.

Som et eksempel foretrækker en programmør tabulatorstop på fire og har deres værktøjssæt konfigureret på denne måde og bruger disse til at formatere deres kode.

int     ix;     // Index to scan array
long    sum;    // Accumulator for sum

En anden programmør foretrækker fanestop på otte, og deres værktøjssæt er konfigureret på denne måde. Når en anden undersøger den oprindelige persons kode, kan de meget vel have svært ved at læse den.

int             ix;             // Index to scan array
long    sum;    // Accumulator for sum

En udbredt løsning på dette problem kan omfatte at forbyde brugen af ​​faner til justering eller regler for, hvordan fanestop skal indstilles. Bemærk, at faner fungerer fint, forudsat at de bruges konsekvent, begrænset til logisk indrykning og ikke bruges til justering:

class MyClass {
	int foobar(
		int qux, // first parameter
		int quux); // second parameter
	int foobar2(
		int qux, // first parameter
		int quux, // second parameter
		int quuux); // third parameter
};

Se også

Referencer

eksterne links