Bør krøllete bukseseler vises på sin egen linje? [lukket]
On februar 14, 2021 by adminKommentarer
- Jeg finner " == true " mer distraherende enn valget av avstivning.
- @Dan: Jeg tror at det å alltid forklare det betingede uttrykket hjelper sterkt til klarhet.
- Den eneste grunnen til at dette saken ville være om din IDE / editor støtter ikke ' t støtter samsvar med krøllete brakettgjenkjenning.
- @ leeand00: noen av oss skriver fortsatt ut kompleks / ukjent kode for å studere / kommentere det. En god pen skriver demper imidlertid de fleste problemene.
- trist spørsmålet er lukket. Etter en stund med innrykkbasert syntaksbruk, byttet jeg til (kanskje rart) en annen selerstruktur. Som din første, men lukkende seler i den siste linjen. (etter kodelinje)
Svar
Da jeg var student pleide jeg å sette krøllete bukseseler på det samme linje, slik at det blir færre linjer, og koden blir skrevet ut på færre sider. Å se på et enkelt braketttegn som er skrevet ut som det eneste i en linje, er irriterende. (miljø, papiravfall)
Men når du koder store applikasjoner, er det mulig å betale for noen linjer med bare bukseseler i dem, med tanke på «gruppering» -følelsen det gir.
Uansett hvilken stil du velger , vær konsekvent slik at det ikke blir en overhead for din egen hjerne å behandle flere stiler i relaterte kodestykker . I forskjellige scenarier (som ovenfor) vil jeg si at det er greit å bruke forskjellige stiler, det er lettere å «bytte kontekst» på høyt nivå.
Kommentarer
- På den annen side er avstiveren på den nye linjen en ANSI-STANDARD, K & R er ikke. Men det fine med standarder er at det er så mange forskjellige (se også uncyclopedia.wikia.com/wiki/AAAAAAAA ! på uncyclopedia).
- " det er færre linjer " Jeg har Terabyte med plass og mange piksler. Hvorfor bør jeg bry meg om å bruke flere linjer?
- @ 12431234123412341234123: I tror han mener fordi noen skriver ut koden for kodegjennomgang. Og hver ikke helt nødvendige ny linje er bortkastet papir, eller en km ² av skog som er bortkastet i skala. don ' t skriv det ut (jeg absolutt ikke ' t) så er ANSI mye bedre enn K & R. Også, alle som har tenkt å skrive ut, bør sannsynligvis bruke en automatisk kodeformatering – så dette bør være et spørsmål om verktøy, ikke en kodestil.
- Jeg er enig i at du skal være konsekvent, jeg ' Jeg har brukt krøllete bukseseler på nye linjer i årevis, men jeg må blande på den andre måten i koden min, for eksempel når jeg ringer til funksjoner, anonyme funksjoner, objektlitteratur osv. Eventuelle uttrykksbaserte språk / anonym kode gjør parenteser på samme linje mye enklere
Svar
Du bør aldri gjøre den tredje metoden.
Skimping på seler kan spare deg for noen tastetrykk første gang, men neste koderen som kommer sammen, legger til noe til den andre klausulen din uten å legge merke til at blokken mangler seler vil være i for mye smerte.
Skriv koden din for andre mennesker.
Kommentarer
- Jeg skulle ønske jeg visste hvor den lille biten av visdom oppsto. Fordi det å skrive koden din til folk som ikke vant ' å lese den, er omtrent så meningsløs som du kan få …
- Den andre programmereren kan legge til sin egen seler når han legger til noe. Han ' er ikke dum, og i en kodekonvensjon som oppfordrer til å utelate seler for enkle ting som dette, vet han ' å se ut.
- Valgfrie bukseseler er ikke valgfrie. Det er få verre designbeslutninger som ble tatt i C og overført til etterkommerne. At det lever videre på et så nylig språk som C # får meg til å bli raseri.
- Det betyr ikke ' t uansett hvor smart du er eller hvor inngrodd kodingsstandarden rundt enkeltlinje utelatt curlies er: hvis du ' Hvis du ønsker å løse et problem eller en feil, vil du sannsynligvis savne at curlies ble utelatt. Og for totalt to sekunder arbeid, er det virkelig så ille å være eksplisitt?
- Det ' er en fordel med stil # 3 som du ' mangler alle: Du får mer kode på skjermen samtidig.
Svar
I lang tid argumenterte jeg for at de var likeverdige, eller så veldig nær den mulige gevinsten ved å ta det riktige valget var langt, langt under kostnaden for å krangle om det.
Å være konsekvent er imidlertid viktig . Så jeg sa la oss snu en mynt og gå videre til å skrive kode.
Jeg har sett programmerere motstå forandring som dette før. Kom over det! Jeg har byttet mange ganger i karrieren min. Jeg bruker til og med forskjellige stiler i C # enn i PowerShell.
For noen år siden jobbet jeg med et team (~ 20 utviklere) som bestemte seg for å be om input, og deretter ta en beslutning, og håndheve det på tvers av hele kodebasen. Vi har 1 uke på oss til å bestemme oss.
Massevis av stønn & øye -rulling. Mye av «Jeg liker min måte, fordi den er bedre», men ingen substans.
Da vi studerte de finere punktene i spørsmålet, spurte noen hvordan vi skulle takle dette problemet i brace-on-the -samme linje-stil:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Merk at det ikke er umiddelbart åpenbart hvor parameterlisten slutter, og kroppen begynner. Sammenlign med:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Vi leste litt om hvordan folk rundt om i verden hadde taklet dette problemet, og fant mønsteret for å legge til en tom linje etter det åpne brace:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Hvis du skal lage et visuelt brudd, kan du like godt gjøre det med en brace. Da blir dine visuelle pauser også konsistente .
Rediger : To alternativer til «ekstra blank linje» -løsning når du bruker K & R:
1 / Innrykk funksjonsargumentene annerledes enn funksjonselementet
2 / Sett det første argumentet på samme linje som funksjonsnavnet og juster ytterligere argumenter på nye linjer til det første argumentet
Eksempler:
1 /
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
2 /
void MyFunction(int parameterOne, int parameterTwo) { int localOne, int localTwo }
/ Rediger
Jeg hevder fortsatt at konsistens er viktigere enn andre hensyn, men hvis vi ikke har en etablert presedens , så er avstivning på neste linje veien å gå.
Kommentarer
- FYI, jeg høres kanskje ut som en fornuftig person, men jeg ' er faktisk en nøtt. For enkle, enkeltlinjede blokker vil jeg verken bruke bukseseler eller nye linjer, og gjør ' hvis (foo) bar () ' alle linje. Jeg prøver å gjøre koden min enkel nok til at den ' ikke er et problem.
- Kom hit for å legge ut akkurat dette. Tonnevis av mennesker som holder åpningsbøylen på samme linje følger den opp med en blank linje (spesielt i begynnelsen av klasser og metoder) fordi ellers ' s vanskelig å skille klassen / metodens overskrift fra kroppen. Vel, hvis du ' uansett kommer til å bruke en ekstra linje, kan du like godt sette braketten der og få den ekstra fordelen av at innrykk blir lettere å se.
- Jeg ' har ikke sett den tomme linjen – Jeg ' er mer kjent med dobbeltinnrykk av parametrene for MyFunction () når de kommer over på en annen linje.
- Å bryte ut parametrene til flere slike linjer er vanvittig.
- Funksjonsparameteren " " argumentet er en rød sild. Åpenbart burde argumentene være dobbelt ment. Ikke noe problem å skille den fra følgende kode.
Svar
Kardinalreglene er:
- Følg prosjektets eksisterende kodingsstandard.
- Hvis det ikke er noen kodingsstandard og du redigerer en eksisterende kodebase som eies av noen andre – vær i samsvar med stilen til eksisterende kode, uansett hvor mye du liker / ikke liker den.
- Hvis du jobber med et grønt feltprosjekt – diskuter med andre teammedlemmer, og kom til enighet om en formell eller uformell kodingsstandard.
- Hvis du jobber med et grøntfeltprosjekt som eneste utvikler – bestem deg selv, og vær så hensynsløs konsekvent .
Selv om du ikke har noen eksterne begrensninger for deg, er det (IMO) best å se etter en eksisterende (mye brukt) kodingsstandard eller stilretningslinje, og prøv å følge den. Hvis du ruller din egen stil, er det en god sjanse for at du kommer til å angre om noen år.
Til slutt er en stil som er implementert / implementerbar ved hjelp av eksisterende stilkontrollere og kodeformaterere bedre enn en som må «håndheves» manuelt.
Kommentarer
- Dette svaret fortjener flere stemmer.
- konsistens er nøkkel
Svar
Fordelen med den første metoden er at den er mer vertikalt kompakt , slik at du får plass til mer kode på skjermen din, og det er derfor jeg foretrekker det. Det eneste argumentet jeg hørte til fordel for den andre metoden er at det gjør det lettere å koble åpnings- og lukkeparenteser, men de fleste IDE har hurtigtast for det, og det er faktisk en falsk uttalelse – i stedet for å koble en åpningsbrakett til en lukkende brakett, kan du koble en lukkebrakett til «start av blokk» -uttrykket (hvis, ellers, for en stund) på samme innrykknivå, så det er like enkelt å bestemme hvor starten på blokken er.
Jeg ser ingen grunn til å kaste bort en hel linje bare for en brakett når den foregående for / mens / hvis konstruksjon allerede visuelt indikerer starten på en blokk.
Når det er sagt, tror jeg at lukkebraketten skal være i sin egen linje fordi vi trenger noe for å indikere slutten på en blokk og dens innrykkstruktur på en synlig måte.
Kommentarer
- Nei … Jeg ' sier hvorfor redusere mengden kode som kan passer på skjermen ved å gjøre noe som ikke ' ikke legger til koden ' s klarhet?
- Når jeg begynte å kode Jeg likte hver brace på sin egen linje, nå foretrekker jeg den første metoden
- Det er en enorm mengde forskning som går helt tilbake til den tidlige dampalderen (Weinberg, " Psykologi ved dataprogrammering "), som viser at programmeringsforståelse faller av DRAMATISK når mengden kode som må vises er mer enn man kan se på en gang (dvs. en skjermbildet, en skriverside). Dette fenomenet argumenterer STERKT for å se på vertikal plass som en verdifull ressurs, som ikke skal kastes bort uten omhu, og dermed foretrekkes den første metoden.
- LOL @ " å kaste bort et HELE linjen ". HERREGUD! Ikke det!! = P
- @Julio På college favoriserte jeg metode 1 sterkt, og kunne ikke ' tåle å lese metode 2. Etter å ha gått på jobb hos et selskap som bruker C # , der standarden er metode 2, har jeg ' kommet like godt til det. Jeg kan nå lese eller bruke begge; ingen av dem plager meg. Mennesker som har en sterk motsatt reaksjon på den ene eller den andre, reagerer generelt på noe de ikke er kjent med.
Svar
Jeg foretrekker
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
fremfor
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
fordi linjen you.postAnswer();
er mye lettere å lese og finne ved første øyekast. På den andre måten blandes den inn med linjen over den (you.hasAnswer()
), slik at øynene mine må fokusere mer for å lese den.
Kommentarer
- Dette gjelder helt til programmet ditt overskrider skjermens høyde. 😉
- @ weberc2 Jeg tror at når programmet ditt overstiger skjermhøyden, vil to linjer mindre ' ikke endre seg mye.
- for 10 år siden, ville jeg ha blitt enig om skjermplass. I dag bruker jeg en 1920 * 1200 skjerm. Det passet MYE kode, mer enn hjernen min kan behandle på en gang. Den første metoden lar meg trekke meg tilbake og se det forskjellige omfanget som åpnes / lukkes uten å måtte lese det.
- Jeg kunne aldri forstå hvorfor jeg foretrakk denne metoden, men det ' s for akkurat dette.
- @Mageek Dette er forsinket, men det ' er ikke 2 linjer, det ' s 2 linjer for hvert omfang. At ' s O (N), ikke O (1). Jeg føler meg ikke ' så sterkt om det; det ' er viktigere at du velger en stil som gjør lange parameterlister lesbare.
Svar
Jeg foretrekker den første metoden. Seler er absolutt ikke verdt en egen linje.
Saken er at seler ikke er viktige. De er bare syntaktisk søppel , noe som er absolutt unødvendig å forstå hva koden er til, for dens formål og måten den er implementert på. De er bare en hyllest til gamle stil C-lignende språk der visuell gruppering av operatører var umulig på grunn av lav tilgjengelig skjermplass.
Det er språk (Python, Haskell, Ruby) som er OK uten bukseseler i det hele tatt. Dette bekrefter bare at seler er søppel, og bør ikke fortjener en linje for dem når det er mulig:
if (you.hasAnswer()){ you.postAnswer(); }else{ you.doSomething(); }
Kommentarer
- Jeg vet ikke ' Jeg vet ikke om Haskell eller Ruby, men Python er mellomromssensitiv og det er derfor det ikke krever ' seler eller andre avgrensere for å betegne blokker. Selene er ikke bare syntaktisk støy; de tjener et faktisk formål.
- @Robert, I C må du gjøre både mellomrom og seler. I Python bør du bare gjøre mellomrom. Hva er bedre?
- @Pavel, i C ' trenger du ikke ' t å gjøre hvitt tempo.
- @ KenBloom C-programmer uten mellomrom er umulige å lese. Så du må gjøre dem uansett.
- Uansett om seler er en god idé eller ikke, bruker ikke bare språket som ' ikke bruker dem ' t virker som et argument for eller imot dem. Det antyder bare at det er mulig å ha et språk uten dem, ikke at det er et godt eller dårlig språkdesign.
Svar
Bruk Python og gå bort fra argumentet helt.
Kommentarer
- +1
SyntaxError: not a chance
- Dette er rett og slett ikke et alternativ for de aller fleste prosjekter. I tillegg har innrykk-for-gruppering det ' s andel av problemene.
- @Bryan, jeg skjønner at dette ikke er ' t veldig praktisk. Jeg trodde bare det var et synspunkt som måtte være der ute, sterkere enn bare en kommentar. Og jeg ' har aldri møtt problemene forårsaket av innrykk du antyder, sannsynligvis fordi jeg ikke ' ikke blander tabulatorer og mellomrom.
- Bruk Go og sidestep argumentet helt (pluss statisk skriving, hastighet og en kompilator!) 🙂
- Trykk deretter mellomromstasten en for mange ganger og se kompilatoren / tolk le på deg. Det vil ikke skje ' på de fleste avstivede språk.
Svar
Plasseringen til krøllete bukseseler bør være
metadata
kan konfigureres i IDE av programmereren. På den måten ser de irriterende selene i all kode, uansett forfatter, likt ut.
Kommentarer
- Helt enig. Det ' s presentasjon og ikke data.
- Problemet er at hvis du lar alle stille sine egne ting, blir ting veldig rotete når forpliktelser er gjort.
- @Andy: At ' er nøyaktig poenget, IDE vil endre hvordan de ser ut, men bare i IDE! Den faktiske kilden blir ikke berørt. For versjonskontroll kan du legge til kroker som oversetter innstillingen for krøllete bukseseler til en vanlig situasjon, slik at alle sjekker koden på samme måte.
- @klaar Hver moderne IDE i ' vi har brukt vil endre faner til mellomrom og flytte klammeparenteser til sin egen linje eller slutten av " åpningen " linje; Jeg ' er ikke sikker på hvorfor du tror kilden ikke er ' t berørt i disse tilfellene, og det er grunnen til kommentaren min. Det blir vanligvis endret av IDE-ene, avhengig av utviklerinnstillingene, noe som betyr at under en kommisjon vil jeg ' se mange endringer som bare er støy når tannreguleringene flyttes til deres egen linje, dermed skjuler den FAKTISKE endringen noen gjorde.
- @Andy: Er ikke ' t der muligheten til å bruke kroker som konverterer disse avvikene med hensyn til hvitt område og seler til en enhetlig standard oppon commit, for å omgå støyproblemet du beskrev? Uansett, et riktig versjonssystem bør overskride små ting som mellomrom eller andre meningsløse ting.
Svar
Jeg foretrekker den første fordi det er vanskeligere for meg å se feilen i dette eksemplet.
if (value > maximum); { dosomething(); }
enn det er i dette eksemplet
if (value > maximum); { dosomething(); }
; {
ser bare mer galt ut for meg enn en linje som slutter med ;
så det er mer sannsynlig at jeg legger merke til det.
Kommentarer
- Du gir et godt argument, men personlig har dette bare noen gang skjedde med meg en gang i løpet av mine 5 år programmering. Jeg kunne ikke ' t finne ut hvorfor det ikke ' t ble utført, la det ut på SO og noen påpekte meg raskt semikolonet. Hver gang det fortettes å bruke den ene linjen mindre, synes jeg det er vanskeligere å lese.
- "; {" ser ut som en slags blinkende gretten ansikt eller kanskje en person med bart.
- +1 Flott eksempel som svar: veldig subtil feil, lett oversett. Tankevekkende også på layout som viser dette.
- Selvfølgelig vil enhver anstendig IDE flagge den tomme kontrollerklæringen, og enhver anstendig kompilator vil gi en advarsel.
- @Dunk argument (som jeg er veldig enig i) er at så mange mennesker bruker tolket språk i disse dager (JavaScript, PHP, et al.) at mange " programmerere " ville ikke ' ikke kjent en kompilator fra en dobbel latte.
Svar
Det kommer an.
Hvis jeg koder i Javascript eller jQuery, bruker jeg den første formen:
jQuery(function($) { if ($ instanceOf jQuery) { alert("$ is the jQuery object!"); } });
Men hvis jeg koder i C #, bruker jeg den andre formen, fordi det er den kanoniske måten å gjøre det på C #.
public int CalculateAge(DateTime birthDate, DateTime now) { int age = now.Year - birthDate.Year; if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day)) age--; return age; }
Merk at eksempelet ditt kan skrives
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
i C #.
Kommentarer
- Det kan skrives på mange slike språk, fordi en blokkuttrykk er en uttalelse. Legger til! 🙂
- I henhold til " Framework Design Guidelines " " kanonisk måte " er å plassere åpningsbøylen på samme linje (dvs. den første formen). Bare si ' …
- @Uwe: Kanskje. Men Microsoft vedtok " justerte seler " tilnærming for alle sine MSDN C # -eksempler, og det ' er bakt inn i Visual Studio, så …
- @Uwe: At ' s Cwalina ' s bok og den ' heter forferdelig, da den er mye mer enn det. FDG på MSDN har ingenting å si på det. Også lurer jeg på hvorfor Framework Design Retningslinjene sier noe om C # koding praksis?
- Du bør faktisk sette krøllete bukseseler på samme linje i Javascript. Du kan forårsake feil hvis krøllete bukseseler er på sin egen linje. Se for eksempel encosia.com/…
Svar
Jeg foretrekker en liten variant av 1)
if (you.hasAnswer()) { you.postAnswer(); } // note the break here else { you.doSomething(); }
Hvorfor?
-
Jeg tror alltid å sette bukseseler på sin egen linje reduserer lesbarheten. Jeg kan bare plassere en viss mengde kildekode på skjermen min. Bracket style 2) gjør heave-algoritmer med mange nestede løkker og conditionals smertefullt lange.
-
Jeg vil imidlertid at
else
skal starte på en ny linje fordiif
ogelse
hører sammen, visuelt. Hvis det er en brakett foranelse
, er det mye vanskeligere å få øye på hva som hører til hva. -
3 ) diskvalifiserer seg selv. Vi vet alle hvilke dårlige ting som kan skje hvis du utelater parentesene og glemmer det.
Kommentarer
- Jeg har sett denne rundt der jeg jobber. Det ' er interessant.
- Jeg liker også denne stilen bedre, da den lar meg legge kommentarer over
else
linje når det er nødvendig, og / eller legg en tom linje mellom if-blokken og den andre blokken for å få ting til å se mindre proppfulle ut. Brakettstil nr. 2 gjør ingenting annet enn å fjerne handlingene fra forholdene. Når det er sagt, er min favoritt definitivt python ' s ingen brakettstil 🙂 - Hvis det er viktig å maksimere antall kodelinjer på skjermen, er det bare å gjøre unna med nye linjer helt. Du ' vil være i stand til å få mange linjer på en skjerm. Jeg foretrekker å ikke ha noe som får meg til å ta en pause og tenke mens jeg leser, dvs. min definisjon av mer lesbar. Med selene ignorerer tankene mine. Uten selene må tankene mine stoppe og justere kontrollblokkene. Ikke en lang pause, men ikke desto mindre en pause.
- Ja, hvis og ellers hører sammen, MEN så gjør det {og} og som} er på en egen linje, bør {være på en separat linje linje også. " Jeg kan bare plassere en viss mengde kildekode på skjermen min " Og at ' s nøyaktig hvorfor å si 3) ville være " diskvalifisere seg selv " er ikke noe alternativ i det hele tatt. Etter et tiår med å jobbe med 3) har jeg ikke glemt å legge til parentes når jeg legger til en ny linje med kode, aldri, og jeg kjenner heller ikke noen som noen gang har hatt. Hvis jeg må justere koden til folk, hvem kan ' ikke lese ordentlig, hvor slutter det? Slutt å bruke visse språkfunksjoner, fordi noen av kodene leserne kanskje ikke forstår dem?
Svar
Jeg leste et sted at forfatterne av en eller annen bok ville ha koden sin formatert slik:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Men plassbegrensninger fra utgiveren deres betydde at de måtte bruke dette:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Nå vet jeg ikke om det stemmer (slik jeg ikke finner det lenger), men sistnevnte stil er veldig utbredt i bøker.
På et personlig nivå foretrekker jeg parentesene på en separat linje som:
a) de indikerer et nytt omfang
b) det er lettere å få øye på når du har fått en uoverensstemmelse (selv om dette er mindre av et problem i en IDE som fremhever feil for deg).
Kommentarer
- … Det andre alternativet letter også begge poengene dine (med innrykk alene som tjener formålet med bøylen / innrykkskombinasjon). 🙂
Svar
Ah, One True Brace Style .
Den har alt som er nødvendig for en hellig W ay – til og med en profet (Richard «min vei eller motorveien» Stallman).
Fyren tok så feil med så mange ting, men GNU er spot-on når det gjelder seler.
[Oppdatering] Jeg har sett lyset, og tilber nå Allman
Kommentarer
- Jeg ser ikke ' t ser poenget med GNU-stilen, bortsett fra at den modellerer lisp-kode. Virker som mye arbeid til liten nytte.
- Jeg vet ikke om noen som bruker GNU-stilen. 1TBS hele veien.
- Du kan ' t gjøre noe verre enn to fordypningsnivåer per blokk, bortsett fra lisp-stil, selvfølgelig, det sier seg selv.
- +1 for lenken om avstivningsstiler. Det viser at uansett hvilken stil du har, er mange flotte mennesker uenige med deg.
- @RobertHarvey Det er ikke noe ekstra arbeid, hvis det er det, bruker du ikke ' riktig verktøy for å skrive kode eller dint konfigurere den riktig. Fordelen er mye mer lesbar kode, du ser hver feil i parentes veldig raskt, og du kan enkelt lese bare koden fra mens du ignorerer underblokker.
Svar
Andre eksempel, jeg er veldig stor på lesbarhet. Jeg kan ikke stå og se på om blokkerer på en annen måte = (
Kommentarer
- Forskning indikerer at den ' er lettere å lese kompakt kode når en kodebase overstiger skjermhøyden.
- @ weberc2 , kan du gi DOI til disse forskningsoppgavene?
Svar
Enkelt svar: hva er lettere å feilsøke?
// Case 1: void dummyFunction() { for (i = 0; i != 10; ++i) { if (i <= 10) std::cout << "i is: " << i << "\n"; std::cout << 10 - i << " steps remaining\n"; // Some hard work here // which is really hard // and does take some screen estate } else std::cout << "We"ll never get there"; } } // COMPILER ERROR HERE // Case 2: void dummyFunction() { for (i = 0; i != 10; ++i) if (i <= 10) { std::cout << "i is: " << i << "\n"; std::cout << 10 - i << " steps remaining\n"; // Some hard work here // which is really hard // and does take some screen estate } else std::cout << "We"ll never get there\n"; } } // COMPILER ERROR HERE
I hvilket tilfelle diagnostiserte du problemet først?
Jeg bryr meg ikke så mye om personlige preferanser (det er mange andre stiler, inkludert whitesmith og al.) og jeg bryr meg ikke så mye … så lenge det ikke hindrer min evne til å lese koden og feilsøke det.
A s til «bortkastet» -argumentet, jeg kjøper ikke det: Jeg pleier å legge til tomme linjer mellom logiske grupper uansett for å gjøre programmet tydeligere …
Kommentarer
- De er begge like enkle å feilsøke, hovedsakelig siden det ' er en kort kodeblokk. Innrykkingen er konsekvent, noe som gjør det enkelt å visualisere de faktiske kodeblokkene.
- @Htbaa: faktisk 🙂 Så hvorfor bry seg?
- @MatthieuM. Den første blokken gir mer mening for meg, fordi de nye linjene (i den andre blokken) mellom funksjonssignaturen, for-setningen og if-setningen får meg til å tro at de ikke er relatert, men de er tydeligvis ' t. Tomme linjer skal skille ikke-relaterte biter av kode; kode som ' er nær andre kodelinjer, betyr at de faktisk er i slekt. Dette er alt ' imo ' selvfølgelig, men jeg lurte på hva poenget ditt var. EDIT: også enhver riktig IDE vil legge merke til at noen klammeparametre mangler og gi deg en smule feil når du tolker koden din.
- Jeg vil påpeke at disse to kodeseksjonene er helt forskjellige. Du vil ha kompilatorfeil på forskjellige punkter i koden. Den første ville ha en kompilatorfeil på " annet " og den siste krøllete. Den andre ville bare ha en kompilatorfeil på den siste krøllingen.
Svar
Ikke at noen vil legge merke til, men det er grunnen til at seler hører til samme linje som den betingede (bortsett fra veldig lange betingelser, men det er en kant case):
I C er dette en gyldig konstruksjon:
while(true); { char c; getchar(); //Wait for input }
Rask! Hva gjør denne koden? Hvis du svarte » uendelig løkke som ber om innspill «, du tar feil! Det kommer ikke engang til inngangen. Den blir fanget av while(true)
. Legg merke til det semikolonet på slutten.Dette mønsteret er faktisk mer vanlig at det virker som det burde være; C krever at du deklarerer variablene dine i begynnelsen av en blokk, og derfor ble en ny startet.
En kodelinje er en tanke. Bukseseler er en del av tanken som inneholder betinget eller sløyfe. Derfor hører de hjemme på samme linje.
Kommentarer
- Dette er uten tvil det beste argumentet for K & R-stil jeg har sett, resten er latterlige med i dag ' s IDE-systemer med støtte for kodefelling. Dette gjelder bare språk i C-stil som støtter
;
blokkeringsender. Dette er også grunnen til at jeg forakter dette blokkeringssystemet som IMHO er utdatert og Go-språket beviser det. Jeg har sett dette problemet mange ganger, men ikke i dette scenariet. Det skjer vanligvis der de har tenkt å legge til noe i utsagnet og glemme det.
Svar
Jeg liker første metode. Det virker bedre IMO, og det er mer kompakt, som jeg liker.
EDIT: Ah, en tredje. Jeg liker den best når det er mulig, da den er enda mindre / penere.
Svar
Du kan skrive det:
you.hasAnswer() ? you.postAnswer() : you.doSomething();
Til svar på spørsmålet; Jeg pleide å foretrekke krøllete bukseseler på sin egen linje, men for å unngå å måtte tenke på feil fra automatisk innføring av semikolon i nettlesere begynte jeg å bruke egyptisk stil for javascript. Og da jeg kodet java i formørkelse, hadde jeg ingen interesse i å bekjempe (eller konfigurere) standard stagestil, så jeg gikk også med egyptiske i så fall. Nå har jeg det bra med begge deler.
Kommentarer
- skal brukes slik,
postAnswer()
ogdoSomething()
skal returnere verdi for ternær operatør, noe som ofte ikke er tilfelle: de kan veldig godt returnere ugyldige (ingen verdi). og også (i det minste i c #) resultat av?:
bør tilordnes til en eller annen variabel
Svar
Nesten alle svarene her sier vi noen variasjoner på «Hva du enn gjør, hold deg til enten en eller to».
Så jeg tenkte på det et øyeblikk, og måtte innrømme at jeg bare ikke ser det som så viktig . Kan noen ærlig si meg at følgende er vanskelig å følge?
int foo(int a, Bar b) { int c = 0; while(a != c) { if(b.value[a] == c) { c = CONST_A; } c++; } return c; }
Jeg er ikke sikker på noen andre … men jeg har absolutt ingen problemer mentalt å bytte frem og tilbake mellom stiler. Det tok meg noen øyeblikk å finne ut hva koden gjorde, men det er resultatet av at jeg bare tilfeldig har skrevet C-lignende syntaks. 🙂
Etter min ikke så ydmyke mening er åpning av seler nesten helt irrelevant for kodelesbarhet. Det er noen få hjørnesaker som er oppført ovenfor der den ene eller den andre stilen gjør en forskjell, men for det meste renser fornuftig bruk av blanke linjer det opp. mer strukturert skjema 1 og et modifisert skjema 3. (C ++)
// blank line is required here if (x) { //This blank line is required y = z; } // blank line is required here too, unless this line is only another "}" if (x) y = z; //allowed if (x) y = z; // forbidden
Jeg er nysgjerrig på om de som sterkt foretrekker skjema 2 vil finne denne versjonen av skjema 1 bedre, bare fordi den tomme linjen gir en sterkere visuell seperasjon.
Kommentarer
- Som eksempelet ditt viser, er innrykk så viktig enn tannregulering for lesbar Faktisk, noen språk gjør innrykk til den eneste måten å hekke utsagn på!
- Ok, jeg synes ærlig talt at du er inkonsekvent eksempel vanskelig å lese. Ikke VIRKELIG vanskelig, men vanskeligere enn hvis det var konsekvent.
- Jeg er enig med Almo. Det er ikke et tilfelle av " er det veldig vanskelig " . Det er et tilfelle av " det er definitivt vanskeligere ", selv om det ikke er vanskelig. Så hvorfor gjøre ting vanskeligere? I " leketøy " eksempler folk gir, er det selvfølgelig liten forskjell. Etter min erfaring, når jeg arver stygg kode fra noen andre og de brukte metode 1, blir det ganske ofte nødvendig å fortsette og gjøre den om til metode 2 bare for å kunne følge logikken. På grunn av det faktum at det ofte blir nødvendig; det svarer automatisk på spørsmålet om hvilken metode som er bedre og lettere å forstå.
- @Dunk: Jeg kan ikke fatte koden som vil bli merkbart forbedret ved å bytte slike irrelevante detaljer rundt.
- @jkerian -Vis tydeligvis har du ikke ' ikke arvet mye kode fra andre som lenge har forlatt prosjektet eller selskapet. Jeg kan ' ikke skjønne at jeg ikke kommer i den situasjonen av noen med noen års erfaring. Men igjen, alle ' arbeidssituasjoner er forskjellige. Hvis du må gjøre " formell " kodevurderinger, gjør formatering en stor forskjell. Å kunne lese koden naturlig er veldig viktig.Klart jeg kan ta pause og tenke å matche bukseseler, men det bremser prosessen. En måte krever ikke pause, de andre gjør det. At ' derfor jeg ikke ' ikke ser hvorfor et annet valg kan anbefales.
Svar
Jeg er overrasket over at dette ikke har blitt reist ennå. Jeg foretrekker den andre tilnærmingen fordi den lar deg velge blokken lettere.
Når seler begynner og slutter på samme kolonne og på sin egen linje, kan du velge fra margen eller med markøren på kolonne 0. Dette tilsvarer vanligvis et mer sjenerøst område med musevalg eller færre tastetrykk med tastaturvalg.
Jeg jobbet opprinnelig med seler på samme linje som den betingede, men da jeg byttet, fant jeg at den akselererte hastigheten jeg jobbet med. Det er ikke natt og dag selvfølgelig, men det er noe som vil bremse deg litt når du arbeider med seler ved siden av betingelsene dine.
Kommentarer
- Gamle tidtakere som meg bruker tre tastetrykk for å velge blokken uansett hvor de forbannede seler er.
Svar
Jeg liker personlig den andre måten.
Måten jeg skal demonstrere er imidlertid etter min mening best fordi det gir størst jobbsikkerhet! En medstudent fra universitetet mitt ba meg om hjelp med leksene sine, og slik så koden hans ut. Hele programmet så ut som en enkelt blokk. Det interessante er at 95% av feilene i programmet han lagde kom fra feil samsvar med seler. De øvrige 5% var tydelige når bøylene ble matchet.
while(1){ i=0; printf("Enter coded text:\n"); while((s=getchar())!="\n"){ if(i%1==0){ start=(char*)realloc(input,(i+1)*sizeof(char)); if(start==NULL){ printf("Memory allocation failed!"); exit(1);} input=start;} input[i++]=s;} start=(char*)realloc(input,(i+1)*sizeof(char)); if(start==NULL){ printf("Memory allocation failed!!!"); exit(1);} input=start; input[i]="\0"; puts(input);
Kommentarer
- Dårlig, dårlig Jeg mener forferdelig, forferdelig eksempel. Problemet er ikke selene! Det ' er den vanvittige fordypningen!
- @Martinho Fernandes Jeg trodde at plassering av seler og innrykk går sammen …
- ikke nødvendigvis. .. gjør riktig innrykk på ovennevnte og bytt så tilfeldig brace-stiler, du ' vil finne at det ' er forståelig.
- Å tenke på dette motiverte faktisk mitt eget svar på dette spørsmålet.
- " 95% av feilene i programmet han laget kom fra uoverensstemmende klammeparenteser " – bare på tolket språk, ikke kompilert.
Svar
Min personlige preferanse er den første metoden, sannsynligvis fordi det er slik jeg først lærte PHP.
For en-linjers if
uttalelser, Jeg bruker
if (you.hasAnswer()) you.postAnswer();
Hvis det ikke er you.postAnswer();
men noe en mye lenger, for eksempel you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
Jeg vil sannsynligvis gå tilbake til fi første type:
if (you.hasAnswer) { you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType); }
Jeg vil aldri bruke linjeskift, og jeg vil aldri bruke denne metoden hvis det også er en else
uttalelse.
if (you.hasAnswer()) you.postAnswer(); else you.doSomething()
er en teoretisk mulighet, men ikke en jeg noensinne vil bruke. Dette må gjøres om til
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Svar
De burde ikke; første metoden for meg.
Når jeg ser på den andre, på grunn av de ubrukte linjene (de som bare har bukseseler på den, bortsett fra den aller siste lukkerbøylen), føles det som om den bryter kontinuiteten til koden. Jeg kan ikke lese det så raskt fordi jeg trenger å ta spesiell oppmerksomhet til tomme linjer som vanligvis betyr en separasjon i kodeformål eller noe sånt, men i ingen tilfelle «tilhører denne linjen en krøllete klammeparentes» (som bare gjentar betydningen av innrykk).
Uansett, akkurat som når du skriver tekst … er det overflødig å legge til en innrykk i begynnelsen av et avsnitt hvis det er en tom linje før den (dobbelt tegn på avsnittendring), der er ikke nødvendig å kaste bort linjer for seler når vi er ordentlig innrykkede.
I tillegg tillater det, som allerede nevnt, plass til mer kode på skjermen, noe som ellers er litt kontraproduktivt.
Svar
Det avhenger av plattform / språk / konvensjoner
I Java:
void someMethod() { if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); } }
I C #
void someMethod() { if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); } }
I C:
void someMethod() { if (you_hasAnswer()) { you.postAnswer(); } else { you_doSomething(); } }
Jeg hater når Java-gutter bruker stilen deres i C # -kode og omvendt.
Kommentarer
- C-stilen al måter irriterte meg. Vær konsekvent!
Svar
Alt jeg kan si er at hvis du er en fan av metode nr. 3 , vil du bli forfulgt av alle IDE-kodeformaterere på jorden.
Svar
Jeg bruker den første metoden bare fordi den er mer kompakt og tillater mer kode på skjermen. Selv har jeg aldri hatt noe problem med å parre bukseseler (jeg skriver dem alltid ut, sammen med if
utsagnet før jeg la til tilstanden , og de fleste miljøer lar deg hoppe til den tilhørende avstiveren).
Hvis du trengte å parre bukseseler visuelt, vil jeg foretrekke den andre metoden. Men det tillater mindre kode om gangen, noe som krever at du blar mer. Og det, i det minste for meg, har større innvirkning på å lese kode enn å ha pent justerte seler. Jeg hater å bla. Så igjen, hvis du trenger å bla over en enkelt if
uttalelse, er den mest sannsynlig for stor og trenger refactoring.
Men; det viktigste av alt er konsistens. Bruk det ene eller det andre – aldri begge deler!
Svar
Da jeg først lærte programmering klokka 12, satte jeg seler på neste linje fordi Microsoft-kodingsveiledningene er slik. Jeg indrykket også med 4-plassers TABS den gangen.
Etter noen år lærte jeg Java og JavaScript, og så flere bukseseler på samme linje-kode, så jeg endret. Jeg begynte også å fordype med 2-mellomrom.
Kommentarer
- +1, -1. Hvorfor ville du IKKE slå inn med faner, ettersom hvilken som helst redaktør kan justere fanelengden til din vilkårlige lengde? Ellers leder du mange av oss som liker ekte innrykk klokka 8 for å forbanne koden.
Svar
Det er et fjerde alternativ som holder klammeparentesene justert, men ikke kaster bort plass:
if (you.hasAnswer()) { you.postAnswer(); i.readAnswer(); } else { you.doSomething(); }
Det eneste problemet er at de fleste IDEs autoformater kveler på dette.
Kommentarer
- … som de fleste programmerere som ville kvele seg over dette.
- Det virker fryktelig. Tenk på ekstra innsats du må gjennom hvis du vil sette inn en linje øverst, eller fjerne topplinjen. Du kan ' t bare slette linjen og gå videre, du må huske å sette inn krøllbøylen på nytt.
- lol dette er kjempebra! 🙂 bedre enn første stil!
- Tilsynelatende har den til og med et navn. Horstman Syyle er nevnt i wikipedia . Jeg ' har jobbet med en kodebase som dette, det ' er virkelig ikke dårlig å bruk.
Svar
Alt avhenger av deg så lenge du ikke jobber med et prosjekt der noen kodebegrensninger eller noen standarder er satt av prosjektlederen som alle programmerere som jobber med det prosjektet må følge mens de kodes.
Jeg foretrekker personlig den første metoden.
Jeg fikk ikke det du vil vise etter den tredje metoden?
Er det ikke feil måte? For eksempel vurdere en situasjon som ..
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
Hva om noen vil legge til noen flere utsagn i hvis blokkerer?
Hvis du i så fall bruker den tredje metoden, vil kompilatoren kaste syntaksfeilen.
if (you.hasAnswer()) you.postAnswer1(); you.postAnswer2(); else you.doSomething();
Kommentarer
- Enda verre ville det være hvis noen kom og gjorde: if (you.hasAnswer ()) you.postAnswer (); annet du. gjør noe (); you.doSomethingElse (); – det ' en oppskrift på subtile bugs som øyet lett kan glide over, og kompilatoren vil ikke ' ikke hjelpe enten
- @FinnNk: Akkurat!
- Hvis noen vil legge til et nytt utsagn, kan de sette inn selene selv. Enhver programmerer som er verdt hans salt, burde virkelig kunne finne ut av det.
- Jeg ønsket å si at hans tredje metode er feil.
- @ Robert Harvey, jeg ' har sett veldig erfarne kodere savner å legge til seler når du endrer eksisterende kode. Jeg tror problemet er at innrykk er et mye sterkere ledetråd til mening enn seler (spesielt siden det er flere stagestiler,) så det ' er ganske lett å overse den manglende bøylen innrykk ser ut som det du forventer.
Legg igjen en kommentar