Bør krøllede seler vises på deres egen linje? [lukket]
On februar 14, 2021 by adminKommentarer
- Jeg finder " == true " mere distraherende end valget af bøjleplacering.
- @Dan: Jeg tror, at altid at forklare det betingede udtryk i høj grad hjælper med klarhed.
- Den eneste grund til, at dette ville sagen ville være, hvis din IDE / editor understøtter ' t understøtter matchende krøllet parentesgenkendelse.
- @ leeand00: nogle af os udskriver stadig kompleks / ukendt kode for at studere / kommentere det. En god smuk printer afbøder dog de fleste af problemerne.
- trist, spørgsmålet er lukket. Efter et stykke tid med indentbaseret syntaksbrug skiftede jeg til (måske underligt) en anden selerstruktur. Ligesom din første, men lukkende bøjle i den sidste bloklinje. (efter kodelinje)
Svar
Da jeg var elev, plejede jeg at sætte krøllede seler på det samme linje, så der er færre linjer, og koden bliver udskrevet på færre sider. At se på et enkelt parentes-tegn, der er trykt som det eneste på en linje, er irriterende. (miljø, papirspild)
Men når man koder store applikationer, er det muligt at overvinde nogle linjer med kun seler i betragtning af den “gruppering” -følelse, det giver.
Uanset hvilken stil du vælger , være konsekvent så det ikke bliver en overhead for din egen hjerne at behandle flere stilarter i relaterede kodestykker . I forskellige scenarier (som ovenfor) vil jeg sige, at det er okay at bruge forskellige stilarter, det er lettere at “skifte kontekst” på et højt niveau.
Kommentarer
- På den anden side er bøjlen på den nye linje en ANSI-STANDARD, K & R er ikke. Men det skønne ved standarder er, at der er så mange forskellige (se også uncyclopedia.wikia.com/wiki/AAAAAAAA ! på uncyclopedia).
- " der er færre linjer " Jeg har Terabyte plads og masser af pixels. Hvorfor skulle jeg bekymre mig om at bruge flere linjer?
- @ 12431234123412341234123: I tror, han mener, fordi nogle mennesker udskriver koden til gennemgang af koden. Og hver ikke absolut nødvendigt ny linje er spildt papir eller en km ² skov, der spildes i skala. Men hvis du don ' t udskriver det (jeg bestemt ikke ' t) så ANSI er meget bedre end K & R. Enhver, der har til hensigt at udskrive, bør sandsynligvis bruge en automatiseret kodeformatering – så dette bør være et spørgsmål om værktøj, ikke et kodestil.
- Jeg er enig i at du skal være konsekvent, jeg ' Jeg har brugt krøllede seler på nye linjer i årevis, men jeg er nødt til at blande den anden vej i min kode, f.eks. når jeg ringer til funktioner, anonyme funktioner, objektlitteratur osv. Eventuelle ekspressionsbaserede sprog / anonym kode gør parenteser på samme linje meget lettere
Svar
Du skal aldrig udføre den tredje metode.
Skimping på seler sparer dig muligvis et par tastetryk første gang, men den næste koder, der kommer sammen tilføjer noget til din anden klausul uden at lægge mærke til, at blokken mangler seler, der kommer til at få meget smerte.
Skriv din kode til andre mennesker.
Kommentarer
- Jeg ville ønske jeg vidste, hvor den lille visdom stammer fra. Fordi det at skrive din kode til folk, der vandt ' ikke gider at læse, er omtrent så meningsløs som du kan få …
- Den anden programmør kan tilføje sin egen seler, når han tilføjer noget. Han ' er ikke dum, og i en kodningskonvention, der tilskynder til udeladelse af seler til enkle ting som dette, ved han ' at se ud.
- Ekstra seler er ikke valgfri. Der er få dårligere designbeslutninger, der blev taget i C og overført til dens efterkommere. At det lever videre på et sprog, der er så nyt som C #, gør mig raseri.
- Det betyder ikke ' betyder ikke noget, hvor smart du er, eller hvor indgroet kodningsstandarden omkring enkeltlinje udeladt curlies er: hvis du ' Når du ønsker at løse et problem eller en fejl, vil du sandsynligvis savne, at curlies blev udeladt. Og for i alt 2 sekunders arbejde, er det virkelig så slemt at være eksplicit?
- Der ' er en fordel ved stil # 3, at du ' mangler alle: Du får mere kode på din skærm på én gang.
Svar
I lang tid argumenterede jeg for, at de var af samme værdi, eller så meget tæt på lige den mulige gevinst ved at træffe det rigtige valg var langt, langt under omkostningerne ved at diskutere om det.
At være konsekvent er dog vigtigt . Så jeg sagde lad os vende en mønt og gå videre til at skrive kode.
Jeg har set programmører modstå ændringer som denne før. Kom over det! Jeg har skiftet mange gange i min karriere. Jeg bruger endda andre stilarter i min C # end i min PowerShell.
For et par år siden arbejdede jeg på et team (~ 20 udviklere), der besluttede at bede om input, og tag derefter en beslutning, og håndhæv det på tværs af hele kodebasen. Vi ville have 1 uge til at beslutte.
Masser af stønner & eye -rulning. Masser af “Jeg kan godt lide min måde, fordi den er bedre” men intet stof.
Da vi studerede de finere punkter i spørgsmålet, spurgte nogen, hvordan man skulle håndtere dette spørgsmål i brace-on-the -samme linjestil:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Bemærk, at det ikke umiddelbart er tydeligt, hvor parameterlisten slutter, og kroppen begynder. Sammenlign med:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Vi læste lidt om, hvordan folk rundt omkring i verden havde håndteret dette problem og fandt mønsteret for at tilføje en tom linje efter det åbne bøjle:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Hvis du vil lave en visuel pause, kan du lige så godt gøre det med en bøjle. Derefter bliver dine visuelle brud også ensartede .
Rediger : To alternativer til “ekstra blank linje” -løsning, når du bruger K & R:
1 / Indryk funktionsargumenterne forskelligt fra funktionselementet
2 / Sæt det første argument på samme linje som funktionsnavnet og juster yderligere argumenter på nye linjer til det første argument
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 hævder stadig, at konsistens er vigtigere end andre overvejelser, men hvis vi ikke har en etableret præcedens , så er afstivning på næste linje den rigtige vej.
Kommentarer
- FYI, jeg lyder måske som en fornuftig person, men jeg ' er faktisk en møtrik. Til enkle blokke med en linje bruger jeg hverken seler eller nye linjer, hvilket gør ' hvis (foo) bar () ' alle en linje. Jeg stræber efter at gøre min kode enkel nok til, at den ' ikke er et problem.
- Kom her for at sende nøjagtigt dette. Masser af mennesker, der holder åbningsbøjlen på samme linje, følger den op med en blank linje (især i starten af klasser og metoder), fordi det ellers ' er svært at adskille klasse / metodeoverskriften fra kroppen. Nå, hvis du ' alligevel vil bruge en ekstra linje, kan du lige så godt placere bøjlen der og få den ekstra fordel, at indrykket er lettere at se.
- Jeg ' har ikke set den tomme linje – Jeg ' er mere fortrolig med dobbeltindrykning af parametrene til MyFunction () når de kommer over på en anden linje.
- At bryde parametrene ud til flere linjer sådan er vanvittigt.
- Funktionen " " argumentet er en rød sild. Naturligvis skal argumenterne være dobbelt beregnet. Intet problem overhovedet at skelne den fra følgende kode.
Svar
De hovedregler er:
- Følg projektets eksisterende kodningsstandard.
- Hvis der ikke er nogen kodningsstandard, og du redigerer en eksisterende kodebase, der ejes af en anden, skal du være i overensstemmelse med stilen på eksisterende kode, uanset hvor meget du kan lide / ikke kan lide den.
- Hvis du arbejder på et grønt feltprojekt – diskuter med andre teammedlemmer og kom til enighed om en formel eller uformel kodningsstandard.
- Hvis du arbejder på et green-field-projekt som den eneste udvikler – beslut dig selv, og vær derefter hensynsløst konsekvent .
Selvom du ikke har nogen eksterne begrænsninger for dig, er det (IMO) bedst at kigge efter en eksisterende (udbredt) kodningsstandard eller stilretningslinje, og prøv at følge den. Hvis du ruller din egen stil, er der en god chance for, at du kommer til at fortryde det om et par år.
Endelig er en stil, der er implementeret / implementerbar ved hjælp af eksisterende stilkontrol og kodeformater bedre end en der skal “håndhæves” manuelt.
Kommentarer
- Dette svar fortjener flere stemmer.
- konsistens er nøgle
Svar
Fordelen ved den første metode er, at den er mere lodret kompakt , så du kan få mere kode på din skærm, og det er derfor, jeg foretrækker det. Det eneste argument, jeg har hørt til fordel for den anden metode, er, at det gør det lettere at parre åbnings- og lukningsbeslag, men de fleste IDEer har en tastaturgenvej til det, og det er faktisk en falsk erklæring – i stedet for at parre en åbningsbeslag til en lukkebeslag, kan du parre en lukningsbeslag til “start af blok” -udtrykket (hvis ellers i et stykke tid) på det samme indrykningsniveau, så det er lige så let at bestemme hvor starten på blokken er.
Jeg ser ingen grund til at spilde en hel linje bare for en parentes, når den foregående for / while / if konstruktion allerede visuelt indikerer starten på en blok.
Når det er sagt, mener jeg ikke, at lukkebeslaget skal være i sin egen linje, fordi vi har brug for noget for at indikere slutningen af en blok og dens indrykningsstruktur på en synlig måde.
Kommentarer
- Nej … Jeg ' siger hvorfor reducere mængden af kode, der kan passer på din skærm ved at gøre noget, der ikke ' ikke føjer til koden ' s klarhed?
- Når jeg begyndte at kode Jeg kunne godt lide hver bøjle på sin egen linje, nu foretrækker jeg den første metode
- Der er en enorm forskningsenhed, der går helt tilbage til den tidlige damptid (Weinberg, " Psykologi ved computerprogrammering "), der viser, at programmørens forståelse falder DRAMATISK, når den mængde kode, der skal ses, er mere end man kan se på én gang (dvs. en screenful, en printerside). Dette fænomen argumenterer STÆRKT for at se lodret plads som en værdifuld ressource, der ikke skal spildes gratis, og derfor foretrækkes den første metode.
- LOL @ " spild af HELE linjen ". OMG! Ikke det!! = P
- @Julio På college foretrak jeg metode 1 stærkt og kunne ikke ' ikke kunne læse metode 2. Efter at have arbejdet hos et firma, der bruger C # , hvor standarden er metode 2, er jeg ' lige så godt kommet til det. Jeg kan nu læse eller bruge en af dem; ingen af dem generer mig. Mennesker, der reagerer stærkt på en eller anden, reagerer generelt på noget, som de ikke kender.
Svar
Jeg foretrækker
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
frem for
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
fordi linjen you.postAnswer();
er meget lettere at læse og finde ved første øjekast. På den anden måde blandes det ind med linjen over det (you.hasAnswer()
), hvilket får mine øjne til at fokusere mere for at læse det.
Kommentarer
- Dette gælder, indtil dit program overstiger skærmens højde. 😉
- @ weberc2 Jeg tror, at når dit program overstiger skærmens højde, vinder to linjer mindre ' ikke meget.
- for 10 år siden ville jeg have aftalt skærmplads. I dag bruger jeg en 1920 * 1200 skærm. Det passer til MEGET kode, mere end min hjerne kan behandle på én gang. Den første metode giver mig mulighed for at trække tilbage og se det forskellige omfang åbne / lukke uden at skulle læse det.
- Jeg kunne aldrig forstå, hvorfor jeg foretrak denne metode, men det ' s for netop dette.
- @Mageek Dette er forsinket, men det ' er ikke 2 linjer, det ' s 2 linjer for hvert omfang. At ' er O (N), ikke O (1). Jeg føler ' faktisk ikke så stærkt om det; det ' er vigtigere at du vælger en typografi, der gør lange parameterlister læsbare.
Svar
Jeg foretrækker den første metode. Seler er absolut ikke værd at adskille linjen.
Sagen er, at seler ikke er vigtige. De “er bare syntaktisk skrald , hvilket er absolut unødvendigt for at forstå, hvad koden er beregnet til, til dens formål og hvordan det implementeres. De er kun en hyldest til gamle stil C-lignende sprog, hvor visuel gruppering af operatører var umulig på grund af lav tilgængelig plads på skærmen.
Der er sprog (Python, Haskell, Ruby), der overhovedet er OK uden seler. Dette bekræfter kun, at seler er skraldespand og ikke fortjener en linje for dem, når det er muligt:
if (you.hasAnswer()){ you.postAnswer(); }else{ you.doSomething(); }
Kommentarer
- Jeg kender ikke ' ikke om Haskell eller Ruby, men Python er følsomt i mellemrum, hvorfor det ikke kræver ' seler eller andre afgrænsere for at betegne blokke. Seler er ikke kun syntaktisk støj; de tjener et faktisk formål.
- @Robert, i C skal du gøre både mellemrum og seler. I Python skal du kun gøre mellemrum. Hvilket er bedre?
- @Pavel, i C ' behøver du ikke ' behøver at lave et hvidt tempo.
- @KenBloom C-programmer uden mellemrum er umulige at læse. Så du er nødt til at gøre dem alligevel.
- Uanset om seler er en god idé eller ej, er det bare, at der findes sprog, der ikke ' ikke bruger dem ' t virker som et argument for eller imod dem. Det antyder kun, at det er muligt at have et sprog uden dem, ikke at det er et godt eller dårligt sprogdesign.
Svar
Brug Python og sidestep argumentet fuldstændigt.
Kommentarer
- +1
SyntaxError: not a chance
- Dette er simpelthen ikke en mulighed for langt de fleste projekter. Plus, indrykning-til-gruppering har det ' s andel af problemer.
- @Bryan, jeg er klar over, at dette ikke er ' t meget praktisk. Jeg troede bare, det var et synspunkt, der skulle være derude, stærkere end bare en kommentar. Og jeg ' har aldrig stødt på de problemer, der er forårsaget af indrykning, som du antyder, sandsynligvis fordi jeg ikke ' ikke blander faner og mellemrum.
- Brug Go og sidesteg argumentet fuldstændigt (plus statisk tastning, hastighed og en compiler!) 🙂
- Tryk derefter på mellemrumstasten en for mange gange og se compileren / tolken grine på dig. Det vil ikke ske ' på de fleste afstivede sprog.
Svar
Placeringen af krøllede seler skal være
metadata
kan konfigureres i IDE af programmøren. På den måde ser disse irriterende seler i al kode, uanset forfatter, ens ud.
Kommentarer
- Helt enig. Det er ' præsentation og ikke data.
- Problemet er, at hvis du lader alle indstille deres egne, bliver tingene meget rodet, når forpligtelser er udført. li>
- @Andy: At ' er nøjagtigt det punkt, IDE vil ændre, hvordan de ser ud, men kun i IDE! Den aktuelle kilde berøres ikke. Til versionskontrol kan du tilføje kroge, der oversætter uanset indstillingen for krøllede seler til en almindelig situation, så alle kontrollerer koden på samme måde.
- @klaar Hver moderne IDE i ', der er brugt, skifter faner til mellemrum og flytter seler til deres egen linje eller slutningen af " åbning " linje; Jeg ' er ikke sikker på, hvorfor du tror, at kilden ikke er ' t rørt i disse tilfælde, og det er grunden til min kommentar. Det ændres typisk af IDEerne afhængigt af udviklerens indstillinger, hvilket betyder under en forpligtelse I ' Jeg vil se masser af ændringer, der bare er støj, da selerne flyttes til deres egen linje, dermed skjuler den FAKTISKE ændring, som nogen gjorde.
- @Andy: Er ikke ' t der er muligheden for at bruge kroge, der konverterer disse uoverensstemmelser med hensyn til mellemrum og seler til en ensartet standard uppon begå, for at omgå det støjproblem, du beskrev? Uanset hvad skal et ordentligt versioneringssystem overskride små ting som hvidt mellemrum eller andre meningsløse ting.
Svar
Jeg foretrækker det første, fordi det er sværere for mig at se fejlen i dette eksempel.
if (value > maximum); { dosomething(); }
end det er i dette eksempel
if (value > maximum); { dosomething(); }
; {
ser bare mere forkert ud for mig end en linje, der slutter med ;
så jeg er mere tilbøjelige til at lægge mærke til det.
Kommentarer
- Du giver et godt argument, men personligt har dette kun nogensinde skete mig en gang i min 5-årige programmering. Jeg kunne ikke ' t finde ud af, hvorfor det ikke ' t blev udført, sendte det på SO og nogen påpegede mig hurtigt semikolonet. Men hver gang det kondenseres til at bruge den 1 mindre linje, finder jeg det sværere at læse.
- "; {" ligner en slags blinkende grumpy ansigt eller måske en person med overskæg.
- +1 Fantastisk eksempel som svar: meget subtil fejl, let overset. Tankevækkende også på layout, der viser dette.
- Selvfølgelig vil enhver anstændig IDE markere den tomme kontrolerklæring, og enhver anstændig kompilator vil udsende en advarsel.
- @Dunk Den eneste fejl i din argument (som jeg er stærkt enig i) er, at så mange mennesker bruger fortolkede sprog i disse dage (JavaScript, PHP, et al), at mange " programmører " ville ikke ' ikke kende en kompilator fra en dobbelt latte.
Svar
Det afhænger.
Hvis jeg koder i Javascript eller jQuery, bruger jeg den første form:
jQuery(function($) { if ($ instanceOf jQuery) { alert("$ is the jQuery object!"); } });
Men hvis jeg koder i C #, bruger jeg den anden form, fordi det er den kanoniske måde at gøre det på i 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; }
Bemærk at dit eksempel kan skrives
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
i C #.
Kommentarer
- Det kan skrives på mange sprog som det, fordi en blokerklæring er en erklæring. Tilføjer! 🙂
- I henhold til " Retningslinjer for rammedesign " " kanonisk måde " er at placere åbningsbøjlen på samme linje (dvs. den første form). Bare sig i ' …
- @Uwe: Måske. Men Microsoft vedtog " justerede seler " tilgang til alle sine MSDN C # eksempler, og det ' er bagt i Visual Studio, så …
- @Uwe: At ' s Cwalina ' s bog og den ' er forfærdeligt navngivet, da den er meget mere end det. FDG på MSDN har intet at sige om det. Også spekulerer jeg på, hvorfor ville Framework Design Retningslinjerne sige noget om C # kodning praksis?
- Du skal faktisk sætte krøllede seler på samme linje i Javascript. Du kan forårsage fejl, hvis krøllede seler er på deres egen linje. Se f.eks. encosia.com/…
Svar
Jeg foretrækker en lille variant af 1)
if (you.hasAnswer()) { you.postAnswer(); } // note the break here else { you.doSomething(); }
Hvorfor?
-
Jeg tror altid at sætte seler på deres egen linje mindsker læsbarheden. Jeg kan kun placere en vis mængde kildekode på min skærm. Beslagstil 2) gør heave-algoritmer med mange indlejrede sløjfer og betingede smertefulde lange.
-
Jeg vil dog have, at
else
skal starte på en ny linje, fordiif
ogelse
hører sammen visuelt. Hvis der er “et beslag foranelse
, er det meget sværere at få øje på, hvad der hører til hvad. -
3 ) diskvalificerer sig selv. Vi ved alle, hvilke dårlige ting der kan ske, hvis du udelader parenteserne og glemmer det.
Kommentarer
- Jeg har set denne omkring, hvor jeg arbejder. Det ' er interessant.
- Jeg kan også godt lide denne stil, da det giver mig mulighed for at sætte en kommentar over
else
linje, når det er nødvendigt, og / eller sæt en tom linje mellem if-blokken og den anden blok for at få tingene til at se mindre proppet ud. Beslagstil nr. 2 gør intet andet end at fjerne handlingerne fra forholdene. Når det er sagt, er min favorit bestemt python ' er ingen parentesstil 🙂 - Hvis det er vigtigt at maksimere antallet af kodelinjer på skærmen, skal du bare fjerne med helt nye linjer. Du ' vil være i stand til at få mange linjer på en skærm. Jeg foretrækker ikke at have noget, der får mig til at holde pause og tænke, mens jeg læser, dvs. min definition af mere læselig. Med seler ignorerer mit sind dem. Uden seler skal mit sind stoppe og justere kontrolblokkene. Ikke en lang pause, men ikke desto mindre en pause.
- Ja, hvis og ellers hører sammen, MEN også {og} og som} er på en separat linje, skal {være på en separat linje også. " Jeg kan kun passe en vis mængde kildekode på min skærm " Og den ' nøjagtigt hvorfor det at sige 3) ville være " diskvalificere sig selv " er slet ingen mulighed. Efter et årti med at arbejde med 3) har jeg ikke glemt at tilføje parenteser, når jeg tilføjer en ny kodelinje nogensinde, og jeg kender heller ikke nogen, der nogensinde har haft. Hvis jeg er nødt til at tilpasse koden til mennesker, hvem kan ' ikke læse ordentligt, hvor ender det? Stop med at bruge bestemte sprogfunktioner, fordi nogle af koderne måske ikke læser dem?
Svar
Jeg læste et eller andet sted, at forfatterne til en bog ville have deres kode formateret sådan:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Men pladsbegrænsninger fra deres udgiver betød, at de måtte bruge dette:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Nu ved jeg ikke, om det er sandt (som jeg ikke kan finde det mere), men sidstnævnte stil er meget udbredt i bøger.
På et personligt niveau foretrækker jeg parenteserne på en separat linje som:
a) de angiver et nyt omfang
b) det er lettere at få øje på, når du har fået en uoverensstemmelse (selvom dette er mindre af et problem i en IDE, der fremhæver fejl for dig).
Kommentarer
- … Den anden mulighed letter også begge dine point (med indrykket alene, der tjener formålet med bøjlen / indrykningskombination). 🙂
Svar
Ah, One True Brace Style .
Det har alt behov for en hellig W ay – endda en profet (Richard “min vej eller motorvejen” Stallman).
Fyren var så forkert med så mange ting, men GNU er spot-on, når det kommer til seler.
[Opdatering] Jeg har set lyset og tilbeder nu Allman
Kommentarer
- Jeg kan ikke ' ikke se punktet i GNU-stilen, bortset fra at det modellerer lisp-kode. Virker som meget arbejde til lidt fordel.
- Jeg kender ingen, der bruger GNU-stilen. 1TBS hele vejen.
- Du kan ' t gøre noget dårligere end to indrykningsniveauer pr. Blok, bortset fra lisp-stil, selvfølgelig, det siger sig selv.
- +1 for linket til seler. Det viser, at uanset hvad din stil er, er mange store mennesker uenige med dig.
- @RobertHarvey Der er ikke noget ekstra arbejde, hvis det er, bruger du ikke ' rigtige værktøj til at skrive kode eller dint konfigurere det rigtigt. Fordelen er meget mere læsbar kode, du ser enhver fejl i parentes meget hurtigt, og du kan let kun læse koden fra, mens du ignorerer underblokke.
Svar
Andet eksempel, jeg er meget stor på læsbarhed. Jeg kan ikke stå og se på, om blokkerer på en anden måde = (
Kommentarer
- Forskning indikerer, at den ' er lettere at læse kompakt kode, når en kodebase overstiger skærmens højde.
- @ weberc2 , kunne du give DOIer til disse forskningspapirer?
Svar
Simpelt svar: hvad er lettere at debugge?
// 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 tilfælde diagnosticerede du problemet først?
Jeg bryr mig ikke meget om personlige præferencer (der er mange andre stilarter, herunder whitesmith og al.) og jeg bryr mig ikke meget … så længe det ikke hæmmer min evne til at læse koden og debug det.
A s til “spildplads” -argumentet, jeg køber det ikke: Jeg har alligevel tendens til at tilføje tomme linjer mellem logiske grupper for at gøre programmet klarere …
Kommentarer
- De er begge lige så lette at fejle, hovedsageligt da det ' er en kort blok med kode. Indrykket er konsekvent, hvilket gør det nemt at visualisere de faktiske kodeblokke.
- @Htbaa: faktisk 🙂 Så hvorfor gider du det?
- @MatthieuM. Den første blok giver mere mening for mig, fordi de nye linjer (i den anden blok) mellem funktionssignaturen, for-udsagnet og if-udsagnet får mig til at tro, at de ikke er relateret, men de er tydeligvis ikke ' t. Tomme linjer skal adskille ikke-relaterede bit af kode; kode, der ' er tæt på andre kodelinjer, betyder at de faktisk er relaterede. Dette er alt ' imo ' selvfølgelig, men jeg spekulerede på, hvad dit pointe var. REDIGER: også enhver korrekt IDE vil bemærke, at der er manglende klammer, og give dig en smule fejl, når du fortolker din kode.
- Jeg vil gerne påpege, at disse to kodesektioner er helt forskellige. Du ville have kompilatorfejl på forskellige punkter i koden. Den første ville have en kompilatorfejl på " ellers " og den sidste krøllede. Den anden ville kun have en kompilatorfejl på den sidste krøllet.
Svar
Ikke at nogen vil bemærke, men det er derfor, seler hører til samme linje som den betingede (undtagen for meget lange betingelser, men det er en kant case):
I C er dette en gyldig konstruktion:
while(true); { char c; getchar(); //Wait for input }
Hurtigt! Hvad gør denne kode? Hvis du svarede ” uendelig løkke beder om input “, du tager fejl! Det kommer ikke engang til input. Det bliver fanget af while(true)
. Bemærk det semikolon i slutningen.Dette mønster er faktisk mere almindeligt, at det ser ud som det burde være; C kræver, at du erklærer dine variabler i begyndelsen af en blok, hvorfor en ny blev startet.
En kodelinje er en tanke. Seler er en del af tanken, der indeholder den betingede eller loop. Derfor hører de til på samme linje.
Kommentarer
- Dette er langt det bedste argument for K & R-stil jeg har set, resten er latterligt med i dag ' s IDE-systemer med understøttelse af kodefoldning. Dette gælder kun for sprog i C-stil, der understøtter
;
blokender. Dette er også grunden til, at jeg foragter dette blokafslutningssystem, som IMHO er forældet, og Go-sproget beviser det. Jeg har set dette problem mange gange, men ikke i dette scenarie. Det sker normalt, hvor de har til hensigt at tilføje noget til udsagnet og glemme det.
Svar
Jeg kan godt lide første metode. Det virker pænere IMO, og det er mere kompakt, som jeg kan lide.
REDIGER: Ah, en tredjedel. Jeg kan godt lide den ene, når det er muligt, da den er endnu mindre / pænere.
Svar
Du kan skrive det:
you.hasAnswer() ? you.postAnswer() : you.doSomething();
Til svar på spørgsmålet; Jeg plejede at foretrække krøllede seler på deres egen linje, men for at undgå at skulle tænke på fejl fra automatisk semikolonindsættelse i browsere begyndte jeg at bruge egyptisk stil til javascript. Og når jeg kodede java i formørkelse, havde jeg ingen interesse i at bekæmpe (eller konfigurere) standardstivestilen, så jeg gik også med egyptiske i så fald. Nu har jeg det godt med begge.
Kommentarer
- der skal bruges sådan,
postAnswer()
ogdoSomething()
skal returnere værdi for ternær operatør, hvilket ofte ikke er tilfældet: de kan meget vel returnere ugyldige (ingen værdi). og også (i det mindste i c #) resultat af?:
skal tildeles en eller anden variabel
Svar
Næsten alle svar her siger vi en eller anden variation på “Uanset hvad du gør, hold dig til enten en eller to”.
Så jeg tænkte over det et øjeblik og måtte indrømme, at jeg bare ikke ser det som det vigtige . Kan nogen ærligt fortælle mig, at følgende er svært at 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å nogen anden … men jeg har absolut ingen problemer mentalt skifte frem og tilbage mellem stilarter. Det tog mig et øjeblik at finde ud af, hvad koden gjorde, men det er resultatet af, at jeg bare tilfældigt har skrevet C-lignende syntaks. 🙂
Efter min ikke-ydmyge mening er åbningsbøjler næsten fuldstændig irrelevante for kodelæsbarhed. Der er nogle få hjørnesager, der er anført ovenfor, hvor den ene eller den anden stil gør en forskel, men for det meste renser den brug af tomme linjer det op.
FWIW, vores kodningsstile på arbejdspladsen bruger en smule mere struktureret form 1 og en modificeret form 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 nysgerrig efter, om de, der stærkt foretrækker form 2, ville finde denne version af form 1 bedre, bare fordi den tomme linje giver en stærkere visuel adskillelse.
Kommentarer
- Som dit eksempel viser, er indrykning så meget vigtig end seler for læsbar Faktisk gør nogle sprog indrykning til den eneste måde at redde udsagn på!
- Ok, jeg synes ærligt, at du er inkonsekvent eksempel svær at læse. Ikke rigtig hårdt, men sværere end hvis det var konsekvent.
- Jeg er enig med Almo. Det er ikke tilfældet med " er det virkelig svært " Det er et tilfælde af " det er bestemt sværere ", selvom det ikke er svært. Så hvorfor gøre tingene sværere? I " legetøj " eksempler giver folk selvfølgelig, der er lille forskel. Efter min erfaring, når jeg arver grim kode fra en anden, og de brugte metode 1, bliver det ganske ofte nødvendigt at gå videre og gøre det til metode 2 bare for at kunne følge logikken. På grund af det faktum, at det ofte bliver nødvendigt; det besvarer automatisk spørgsmålet om, hvilken metode der er bedre og lettere at forstå.
- @Dunk: Jeg kan ikke finde ud af, hvilken kode der ville blive markant forbedret ved at bytte sådanne irrelevante detaljer rundt.
- @jkerian -Synligvis har du ikke ' ikke arvet meget kode fra andre, der længe har forladt enten projektet eller virksomheden. Jeg kan ' ikke forstå, at jeg ikke løber ind i den situation af nogen med nogle års erfaring. Men så igen, alle ' s arbejdssituation er anderledes. Hvis du skal foretage " formel " kodevurderinger, gør formatering en stor forskel. At være i stand til at læse koden naturligt er meget vigtigt.Sikker på, at jeg kan pause og tænke at matche seler, men det bremser processen. En måde kræver ikke pause, de andre gør. At ' hvorfor jeg ikke ' ikke kan se, hvorfor et andet valg kan anbefales.
Svar
Jeg er overrasket over, at dette endnu ikke er rejst. Jeg foretrækker den anden tilgang, fordi det giver dig mulighed for lettere at vælge blokken.
Når seler begynder og slutter i den samme kolonne og på deres egen linje, kan du vælge fra margenen eller med markøren på kolonne 0. Dette svarer generelt til et mere generøst område med musevalg eller færre tastetryk med tastaturvalg.
Jeg arbejdede oprindeligt med seler på samme linje som den betingede, men da jeg skiftede, fandt jeg, at det fremskyndede den hastighed, hvormed jeg arbejdede. Det er ikke nat og dag selvfølgelig, men det er noget, der vil bremse dig lidt, mens du arbejder med seler ved siden af dine betingede.
Kommentarer
- Gamle timere som mig bruger tre tastetryk til at vælge blokken, uanset hvor de forbandede seler er.
Svar
Personligt kan jeg godt lide den anden vej.
Den måde, jeg vil demonstrere på, er dog efter min mening bedst, fordi det resulterer i størst jobsikkerhed! En medstuderende fra mit universitet bad mig om hjælp til sine lektier, og sådan så hans kode ud. Hele programmet lignede en enkelt blok. Det interessante er, at 95% af fejlene i det program, han lavede, kom fra uoverensstemmende seler. De øvrige 5% var tydelige, når selerne blev 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 forfærdeligt, forfærdeligt eksempel. Problemet er ikke seler! Det ' er den skøre indrykning!
- @Martinho Fernandes Jeg troede, at placering af seler og indrykning går sammen …
- ikke nødvendigvis. .. gør korrekt indrykning på ovenstående og skift derefter tilfældigt stagestil, du ' finder ud af, at det ' er forståeligt. li>
- Faktisk motiverede det at tænke på dette mit eget svar på dette spørgsmål.
- " 95% af fejlene i det program, han lavede, kom fra uoverensstemmende seler " – kun på fortolkede sprog, ikke kompileret.
Svar
Min personlige præference er den første metode, sandsynligvis fordi det er sådan, jeg først lærte PHP.
For <-id = "d36762e8af">
-udtalelser med en linje, Jeg bruger
if (you.hasAnswer()) you.postAnswer();
Hvis det ikke er you.postAnswer();
men noget en meget længere, såsom you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
Jeg vender sandsynligvis tilbage til fi første type:
if (you.hasAnswer) { you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType); }
Jeg bruger aldrig en linjeskift, og jeg vil aldrig bruge denne metode, hvis der også er en else
udsagn.
if (you.hasAnswer()) you.postAnswer(); else you.doSomething()
er en teoretisk mulighed, men ikke en, jeg nogensinde vil bruge. Dette skal omdannes til
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Svar
De burde ikke; første metode for mig.
Når jeg ser på den anden på grund af de ubrugte linjer (dem der kun har seler på den, bortset fra den sidste lukkebøjle), føles det som om det bryder kontinuiteten af koden. Jeg kan ikke læse det så hurtigt, fordi jeg er nødt til at være særlig opmærksom på tomme linjer, der normalt betyder en adskillelse i kodeformål eller noget lignende, men under ingen omstændigheder “denne linje tilhører en krøllet bøjle” (som kun gentager meningen af indrykning).
Under alle omstændigheder, ligesom når du skriver tekst … tilføjelse af en indrykning i begyndelsen af et afsnit er overflødig, hvis der er en tom linje før den (dobbelt tegn på ændring af afsnit), der er det ikke nødvendigt at spilde linjer til seler, når vi er ordentligt indrykket.
Plus, som allerede nævnt, giver det mulighed for at placere mere kode på skærmen, hvilket ellers er lidt kontraproduktivt.
Svar
Det afhænger af platformen / sprog / konventioner
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 hader, når Java-fyre bruger deres stil i C # -kode og omvendt.
Kommentarer
- C-stil al måder irriterede mig. Vær konsekvent!
Svar
Alt hvad jeg kan sige er, at hvis du er fan af metode nr. 3 , vil du blive forfulgt af enhver IDE-kodeformater på jorden.
Svar
Jeg bruger den første metode simpelthen fordi det er mere kompakt og tillader mere kode på skærmen. Jeg har aldrig selv haft problemer med at parre seler (jeg skriver dem altid sammen med if
-udtalelsen, før jeg tilføjede betingelsen , og de fleste miljøer giver dig mulighed for at springe til den matchende bøjle).
Hvis du behøvede at parre bøjler visuelt, så foretrækker jeg den anden metode. Men det tillader mindre kode ad gangen, hvilket kræver, at du ruller mere. Og det har i det mindste for mig en større indvirkning på læsning af kode end at have pænt justerede seler. Jeg hader at rulle. Så igen, hvis du har brug for at rulle over en enkelt if
udsagn, er den højst sandsynligt for stor og skal omarbejdes.
Men; det vigtigste af alt er konsistens. Brug det ene eller det andet – aldrig begge dele!
Svar
Da jeg først lærte programmering kl. 12, satte jeg seler på den næste linje, fordi Microsoft kodning tutorials er sådan. Jeg indrykkede også med 4-plads TABS dengang.
Efter et par år lærte jeg Java og JavaScript og så flere seler-på-samme-linjekode, så jeg ændrede mig. Jeg begyndte også at indrykke med mellemrum med 2 mellemrum.
Kommentarer
- +1, -1. Hvorfor ville du IKKE indrykke med faner, da enhver editor kan justere fanelængden til din vilkårlige længde? Ellers leder du mange af os, der kan lide sande indrykninger ved 8 for at forbande din kode.
Svar
Der er en 4. mulighed, der holder seler justeret, men ikke spilder plads:
if (you.hasAnswer()) { you.postAnswer(); i.readAnswer(); } else { you.doSomething(); }
Det eneste problem er, at de fleste IDEs autoformater kvæler ved dette.
Kommentarer
- … ligesom de fleste programmører, der ville kvæle ved dette.
- Det virker forfærdeligt. Tænk på ekstra indsats, du skal gennemgå, hvis du vil indsætte en linje øverst eller fjerne den øverste linje. Du kan ' ikke bare slette linjen og gå videre, du skal huske at genindsætte den krøllede bøjle.
- lol dette er fantastisk! 🙂 bedre end første stil!
- Det har tilsyneladende endda et navn. Horstman Syyle er nævnt i wikipedia . Jeg ' har arbejdet med en codebase som dette, det ' er virkelig ikke dårligt at brug.
Svar
Det hele afhænger af dig, så længe du ikke arbejder på et projekt, hvor nogle kodningsbegrænsninger eller nogle standarder er sat af projektlederen, som alle programmører, der arbejder på det projekt, skal følge under kodning.
Jeg foretrækker personligt den første metode.
Jeg forstod heller ikke, hvad du vil vise ved 3. metode?
Er det ikke en forkert måde? For eksempel overvej en situation som ..
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
Hvad nu hvis nogen vil tilføje nogle flere udsagn i hvis blokerer?
I så fald hvis du bruger den 3. metode, vil compileren kaste syntaksfejlen.
if (you.hasAnswer()) you.postAnswer1(); you.postAnswer2(); else you.doSomething();
Kommentarer
- Endnu værre ville være, hvis nogen kom sammen og gjorde: if (you.hasAnswer ()) you.postAnswer (); ellers skal du gøre noget (); you.doSomethingElse (); – det ' en opskrift på subtile bugs, som øjet let kan glide over, og compileren vinder ' heller ikke noget
- @FinnNk: Præcis!
- Hvis nogen vil tilføje endnu en erklæring, kan de selv sætte selerne i. Enhver programmør, der er hans salt værd, burde virkelig kunne finde ud af det.
- Jeg ville gerne sige, at hans 3. metode er forkert.
- @ Robert Harvey, jeg ' har set meget erfarne kodere savner at tilføje seler under ændring af eksisterende kode. Jeg tror, problemet er, at indrykning er et meget stærkere ledetråd til mening end seler (især da der er flere stivestilarter,) så det ' er ret let at overse den manglende bøjle, hvis indrykning ligner det, du forventer.
Skriv et svar