Ska lockiga hängslen visas på sin egen linje? [stängd]
On februari 14, 2021 by adminKommentarer
- Jag tycker att " == true " mer distraherande än valet av stagplacering.
- @Dan: Jag tror att det alltid hjälper till att tydligt förklara det villkorliga uttrycket.
- Den enda anledningen till att detta skulle saken skulle vara om din IDE / editor stöder inte ' t stöd för matchning av lockigt parentesigenkänning.
- @ leeand00: några av oss skriver fortfarande ut komplex / obekant kod för att studera / kommentera det. En bra vacker skrivare mildrar dock de flesta problemen.
- tyvärr är frågan stängd. Efter en tid av indentbaserad syntaxanvändning bytte jag till (kanske konstigt) en annan hängslen struktur. Gilla din första men stängande stag i den sista raden av block. (efter kodraden)
Svar
När jag var student brukade jag sätta lockiga hängslen på samma så att det blir färre rader och koden skrivs ut på färre sidor. Att titta på ett enda fäste som skrivs ut som det enda i en rad är irriterande. (miljö, papperssvinn)
Men när man kodar stora applikationer, är det möjligt att vissa rader med endast hängslen är överkomliga, med tanke på den ”grupperingskänsla” det ger.
Vilken stil du än väljer , var konsekvent så att det inte blir en overhead för din egen hjärna att bearbeta flera stilar i relaterade bitar av kod . I olika scenarier (som ovan) skulle jag säga att det är okej att använda olika stilar, det är lättare att ”byta sammanhang” på hög nivå.
Kommentarer
- Å andra sidan är stödet på den nya linjen ett ANSI-STANDARD, K & R är inte. Men det fina med standarder är att det finns så många olika (se även uncyclopedia.wikia.com/wiki/AAAAAAAAA ! på uncyclopedia).
- " det finns färre rader " Jag har Terabyte med utrymme och massor av pixlar. Varför skulle jag bry mig om att använda fler rader?
- @ 12431234123412341234123: I tror att han menar för att vissa människor skriver ut koden för granskning av koden. Och varje inte absolut nödvändig ny linje är bortkastat papper, eller en km ² av skog som går till spillo i skala. Men om du don ' t skriv ut det (jag vet verkligen inte ' t) då är ANSI mycket bättre än K & R. Alla som tänker skriva ut bör förmodligen använda en automatiserad kodformatör – så det här bör vara en fråga om verktyg, inte en kodningsstil.
- Jag håller med om att du ska hålla konsekvent, jag ' har använt lockiga hängslen på nya rader i flera år, men jag måste blanda i det andra sättet i min kod, till exempel när jag ringer till funktioner, anonyma funktioner, objektlitteratur etc. Alla uttrycksbaserade språk / anonym kod gör parenteser på samma rad mycket enklare
Svar
Du ska aldrig göra den tredje metoden.
Om du sparar på hängslen kan du spara några tangenttryckningar första gången, men nästa kodare som kommer tillsammans, lägger till något till din annars klausul utan att märka att blocket saknas hängslen kommer att vara i för mycket smärta.
Skriv din kod för andra människor.
Kommentarer
- Jag önskar att jag visste var den lilla visheten härstammar. Eftersom det är ungefär så meningslöst att skriva din kod för personer som inte kommer att vinna ' …
- Den andra programmeraren kan lägga till sin egen hängslen när han lägger till något. Han ' är inte dum, och i en kodningskonvention som uppmuntrar att utelämna hängslen för enkla saker som denna, vet han ' att se ut.
- Valfria hängslen är inte valfria. Det finns få värre designbeslut som togs i C och överfördes till dess ättlingar. Att det lever på ett språk som är så nyligen som C # gör mig raseri.
- Det betyder inte ' det spelar ingen roll hur smart du är eller hur ingrodd kodningsstandarden runt en rad utelämnade curlies är: om du ' när du vill lösa ett problem eller fel, kommer du troligen att missa att curlies utelämnades. Och för totalt två sekunder arbete, är det verkligen så dåligt att vara tydlig?
- Det ' är en fördel med stil # 3 som du ' alla saknas: Du får mer kod på skärmen på en gång.
Svar
Under lång tid hävdade jag att de hade lika värde, eller så mycket nära lika att den möjliga vinsten genom att göra rätt val var långt, långt under kostnaden för att argumentera om det.
Att vara konsekvent är dock viktigt . Så jag sa låt oss vända ett mynt och gå vidare till att skriva kod.
Jag har sett programmerare motstå förändringar så här tidigare. Släpp det! Jag har bytt många gånger under min karriär. Jag använder till och med andra stilar i min C # än i min PowerShell.
För några år sedan arbetade jag på ett team (~ 20 utvecklare) som bestämde sig för att be om mata in och sedan fatta ett beslut och sedan genomdriva det i hela kodbasen. Vi skulle ha en vecka att bestämma.
Massor av stön & öga -rullande. Massor av ”Jag gillar mitt sätt, för det är bättre” men inget ämne.
När vi studerade de finare punkterna i frågan frågade någon hur man skulle hantera denna fråga i brace-on-the -same-line style:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Observera att det inte är direkt uppenbart var parameterlistan slutar och kroppen börjar. Jämför med:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Vi läste lite om hur människor runt om i världen hade hanterat detta problem och hittade mönstret för att lägga till en tom rad efter det öppna stag:
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
Om du ska göra en visuell paus kan du lika gärna göra det med en stag. Då blir dina visuella brott konsekvent också .
Redigera : Två alternativ till ”extra blank linje” -lösning när du använder K & R:
1 / Indrag funktionsargumenten annorlunda än funktionens kropp
2 / Lägg det första argumentet på samma rad som funktionsnamnet och anpassa ytterligare argument på nya rader till det första argumentet
Exempel:
1 /
void MyFunction( int parameterOne, int parameterTwo) { int localOne, int localTwo }
2 /
void MyFunction(int parameterOne, int parameterTwo) { int localOne, int localTwo }
/ Redigera
Jag hävdar fortfarande att konsistens är viktigare än andra överväganden, men om vi inte har en etablerat prejudikat , då är klämma på nästa rad vägen att gå.
Kommentarer
- FYI, jag kanske låter som en rimlig person, men jag ' jag är faktiskt en nötter. För enkla enradiga block använder jag varken hängslen eller nya rader, vilket gör ' om (foo) bar () ' alla linje. Jag strävar efter att göra min kod så enkel att den ' inte är ett problem.
- Kom hit för att posta exakt detta. Massor av människor som håller öppningsstaget på samma rad följer upp det med en tom linje (speciellt i början av klasser och metoder) för annars ' är svårt att separera rubriken klass / metod från kroppen. Tja, om du ' ändå ska använda en extra linje, kan du lika gärna sätta staget där och få den extra fördelen att indraget blir lättare att se.
- Jag ' har inte sett den tomma raden – Jag ' är mer bekant med dubbel indrag av parametrarna för MyFunction () när de avviker till en annan rad.
- Att bryta ut parametrarna till flera sådana rader är galet.
- Funktionen " " argumentet är en röd sill. Uppenbarligen bör argumenten vara dubbla avsedda. Inget problem alls att skilja den från följande kod.
Svar
Kardinalreglerna är:
- Följ projektets befintliga kodningsstandard.
- Om det inte finns någon kodningsstandard och du redigerar en befintlig kodbas som ägs av någon annan – var förenlig med stilen på befintlig kod, oavsett hur mycket du gillar / ogillar den.
- Om du arbetar med ett grönt fältprojekt – diskutera med andra teammedlemmar och bli överens om en formell eller informell kodningsstandard.
- Om du arbetar med ett grönt fältprojekt som den enda utvecklaren – bestäm dig själv och var hänsynslöst konsekvent .
Även om du inte har några externa begränsningar för dig, är det (IMO) bäst att leta efter en befintlig (allmänt använd) kodningsstandard eller stilriktlinje, och försök att följa det. Om du rullar din egen stil är det goda chanser att du kommer att ångra den om några år.
Slutligen är en stil som är implementerad / implementerbar med befintliga stilkontroller och kodformatörer bättre än en som måste ”verkställas” manuellt.
Kommentarer
- Detta svar förtjänar fler röster.
- konsistens är nyckeln
Svar
Fördelen med den första metoden är att den är mer vertikalt kompakt , så att du kan placera mer kod på din skärm, och det är därför jag föredrar det. Det enda argumentet jag hörde för den andra metoden är att det gör det lättare att para ihop öppnings- och stängningsfästen, men de flesta IDE har kortkommando för det, och det är faktiskt ett falskt uttalande – istället för att para ihop en öppningsfäste till en stängningsfäste kan du para ihop en stängningsfäste till ”början av block” -uttrycket (om, annars för en stund) på samma indragningsnivå, så det är lika lätt att bestämma där blockets början är.
Jag ser ingen anledning att slösa bort en hel linje bara för en parentes när föregående för / medan / om konstruktionen redan visuellt visar början på ett block.
Som sagt, jag tror att stängningsfästet borde vara i sin egen linje eftersom vi behöver något för att visa slutet på ett block och dess indragningsstruktur på ett synligt sätt.
Kommentarer
- Nej … Jag ' säger varför minska mängden kod som kan passar på din skärm genom att göra något som inte ' inte lägger till koden ' s tydlighet?
- När jag började koda Jag gillade varje stag på sin egen linje, nu föredrar jag den första metoden
- Det finns en enorm mängd forskning som går hela vägen tillbaka till tidig ångålder (Weinberg, " Psykologi för datorprogrammering "), som visar att programmerarens förståelse faller av DRAMATISKT när mängden kod som måste ses är mer än vad som kan ses på en gång (dvs. en skärm, en skrivarsida). Detta fenomen argumenterar STARKT för att se vertikalt utrymme som en värdefull resurs, som inte ska slösas bort utan kostnad, och därför föredras den första metoden.
- LOL @ " slösar bort ett HELA raden ". HERREGUD! Inte det!! = P
- @Julio På college gillade jag metod 1 starkt och kunde inte ' inte stå för att läsa metod 2. Efter att ha arbetat på ett företag som använder C # , där standarden är metod 2, jag ' har kommit så bra lika bra. Jag kan nu läsa eller använda antingen; ingen stör mig. Människor som har en starkt motsatt reaktion på den ena eller den andra reagerar i allmänhet på något som de inte känner till.
Svar
Jag föredrar
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
framför
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
eftersom raden you.postAnswer();
är mycket lättare att läsa och hitta vid första anblicken. På andra sätt blandas det in med raden ovanför (you.hasAnswer()
), vilket gör att mina ögon måste fokusera mer för att läsa det.
Kommentarer
- Detta gäller tills ditt program överstiger skärmens höjd. 😉
- @ weberc2 Jag tror att när ditt program överstiger skärmens höjd, kommer två rader mindre att vinna ' t ändras mycket.
- för 10 år sedan skulle jag ha kommit överens om skärmutrymme. Idag använder jag en 1920 * 1200-skärm. Det passade MYCKET kod, mer än min hjärna kan bearbeta på en gång. Den första metoden gör det möjligt för mig att dra tillbaka och se olika omfång öppna / stänga utan att behöva läsa den.
- Jag kunde aldrig förstå varför jag föredrog den här metoden men den ' s för exakt detta.
- @Mageek Detta är försenat, men det ' är inte två rader, det ' s 2 rader för varje omfång. Att ' s O (N), inte O (1). Jag känner inte ' faktiskt så starkt om det; det ' är viktigare att du väljer en stil som gör att långa parameterlistor kan läsas.
Svar
Jag föredrar den första metoden. Hängslen är helt inte värda en separat rad.
Saken är att hängslen inte är viktiga. De är bara syntaktiskt papperskorgen , vilket är absolut onödigt för att förstå vad koden är till för, dess syfte och hur det implementeras. De är bara en hyllning till gamla C-liknande språk där visuell gruppering av operatörer var omöjlig på grund av lågt tillgängligt skärmutrymme.
Det finns språk (Python, Haskell, Ruby) som är OK utan hängslen alls. Detta bekräftar bara att hängslen är papperskorgen och bör inte förtjänar en rad för dem när det är möjligt:
if (you.hasAnswer()){ you.postAnswer(); }else{ you.doSomething(); }
Kommentarer
- Jag vet inte ' jag vet inte om Haskell eller Ruby, men Python är känsligt för mellanslag, varför det inte ' t kräver hängslen eller andra avgränsare för att beteckna block. Hängslen är inte bara syntaktiskt brus; de tjänar ett verkligt syfte.
- @Robert, I C måste du göra både mellanslag och hängslen. I Python ska du bara göra mellanslag. Vilket är bättre?
- @Pavel, i C ' behöver du inte ' du behöver göra en blanksteg.
- @ KenBloom C-program utan blanksteg är omöjliga att läsa. Så du måste göra dem ändå.
- Oavsett om hängslen är en bra idé eller inte, bara existensen av språk som inte ' inte använder dem ' t verkar som ett argument för eller emot dem. Det antyder bara att det är möjligt att ha ett språk utan dem, inte att det är en bra eller dålig språkdesign.
Svar
Använd Python och gå bort argumentet helt.
Kommentarer
- +1
SyntaxError: not a chance
- Detta är helt enkelt inte ett alternativ för de allra flesta projekt. Plus, indrag-för-gruppering har det ' s andel av problem.
- @Bryan, jag inser att detta inte är ' t mycket praktiskt. Jag trodde bara att det var en synvinkel som behövde vara ute, starkare än bara en kommentar. Och jag ' har aldrig stött på de problem som orsakas av indrag som du antyder, troligen för att jag inte ' blandar flikar och mellanslag.
- Använd Go och sidsteg argumentet helt (plus statisk skrivning, hastighet och en kompilator!) 🙂
- Tryck sedan på mellanslagstangenten en för många gånger och se kompilatorn / tolkan skratta på dig. ' händer inte på de flesta avstängda språk.
Svar
Positionen för lockiga hängslen ska vara
metadata
konfigurerbar i IDE av programmeraren. På det sättet ser de irriterande hängslen i all kod, oavsett författare, likadana ut.
Kommentarer
- Helt överens. Det ' s presentation och inte data.
- Problemet är att om du låter alla ställa in sina egna saker blir det rörigt väldigt snabbt när åtaganden görs. li>
- @Andy: Att ' är exakt punkten, IDE kommer att ändra hur de ser ut, men bara i IDE! Den faktiska källan kommer inte att beröras. För versionskontroll kan du lägga till krokar som översätter inställningen för lockiga hängslen till en vanlig situation, så att alla kontrollerar koden på samma sätt.
- @klaar Varje modern IDE i ' vi har använt kommer att ändra flikar till mellanslag och flytta hakparenteser till sin egen rad eller slutet av " öppning " linje; Jag ' är inte säker på varför du tror att källan inte ' inte rörde i dessa fall, och det är anledningen till min kommentar. Det ÄR vanligtvis ändrat av IDE: erna beroende på utvecklarens inställningar, vilket betyder att under en kommission kommer jag ' att se massor av förändringar som bara är buller när hängslen flyttades till din egen linje, vilket döljer den FAKTISKA förändringen som någon gjorde.
- @Andy: Är inte ' det finns möjligheten att använda krokar som omvandlar dessa avvikelser angående blanksteg och hängslen till en enhetlig standard uppon commit, för att kringgå det bullerproblem som du beskrev? Hur som helst bör ett ordentligt versioneringssystem överskrida småsaker som vitt utrymme eller andra meningslösa saker.
Svar
Jag föredrar det första eftersom det är svårare för mig att se felet i detta exempel.
if (value > maximum); { dosomething(); }
än det är i det här exemplet
if (value > maximum); { dosomething(); }
; {
ser bara mer fel ut för mig än en rad som slutar med ;
så det är mer troligt att jag märker det.
Kommentarer
- Du ger ett bra argument, men personligen har detta bara någonsin hände mig en gång under min femårs programmering. Jag kunde inte ' t räkna ut varför det inte ' t körde, publicerade det på SO och någon påpekade snabbt halvkolonet för mig. Men varje gång det kondenseras att använda den 1 mindre raden, tycker jag att det är svårare att läsa.
- "; {" ser ut som en typ av blinkande vresigt ansikte eller kanske en person med mustasch.
- +1 Bra exempel som svar: mycket subtilt misstag, lätt förbises. Tankeväckande också för layout som visar detta.
- Naturligtvis kommer alla anständiga IDE att flagga det tomma kontrolluttrycket och alla anständiga kompilatorer kommer att utfärda en varning.
- @Dunk Den enda felet i din argument (som jag starkt håller med) är att så många människor använder tolkade språk i dessa dagar (JavaScript, PHP, et al) att många " programmerare " skulle inte kunna ' känner inte en kompilator från en dubbel latte.
Svar
Det beror.
Om jag kodar i Javascript eller jQuery använder jag den första formen:
jQuery(function($) { if ($ instanceOf jQuery) { alert("$ is the jQuery object!"); } });
Men om jag kodar i C # använder jag den andra formen, för det är det kanoniska sättet att göra det 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; }
Observera att ditt exempel kan skrivas
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
i C #.
Kommentarer
- Det kan skrivas på många sådana språk, för ett block-uttalande är ett uttalande. Lägger till! 🙂
- Enligt " Riktlinjer för ramkonstruktion " " kanoniskt sätt " är att placera öppningsstaget på samma linje (dvs. den första formen). Säg bara ' …
- @Uwe: Kanske. Men Microsoft antog " inriktade hängslen " -metoden för alla dess MSDN C # -exempel, och det ' s bakade i Visual Studio, så …
- @Uwe: Att ' s Cwalina ' s bok och den ' heter fruktansvärt eftersom den är mycket mer än så. FDG på MSDN har inget att säga om det. Jag undrar också, varför skulle Framework Design Riktlinjerna säga något om C # kodning praxis?
- Du borde faktiskt sätta lockiga hängslen på samma rad i Javascript. Du kan orsaka fel om lockiga hängslen är på sin egen linje. Se till exempel encosia.com/…
Svar
Jag föredrar en liten variant av 1)
if (you.hasAnswer()) { you.postAnswer(); } // note the break here else { you.doSomething(); }
Varför?
-
Jag tror alltid att sätta hängslen på sin egen linje minskar läsbarheten. Jag kan bara passa en viss mängd källkod på min skärm. Bracket style 2) gör heave-algoritmer med många kapslade loopar och villkor smärtsamt långa.
-
Jag vill dock att
else
ska börja på en ny rad eftersomif
ochelse
hör samman visuellt. Om det finns en fäste framförelse
är det mycket svårare att upptäcka vad som tillhör vad. -
3 ) diskvalificerar sig själv. Vi vet alla vilka dåliga saker som kan hända om du utelämnar parenteserna och glömmer bort det.
Kommentarer
- Jag har sett den här där jag arbetar. Det ' är intressant.
- Jag tycker också om den här stilen bättre, eftersom den tillåter mig att lägga kommentarer ovanför
else
rad vid behov, och / eller lägg en tom linje mellan if-blocket och annars-blocket för att få saker att se mindre trånga ut. Fäste stil # 2 gör inget annat än att distansera handlingarna från förhållandena. Med det sagt är min favorit definitivt python ' s ingen parentesstil 🙂 - Om det är viktigt att maximera antalet kodrader på skärmen är det bara att göra bort med helt nya rader. Du ' kommer att kunna få många rader på en skärm. Jag föredrar att inte ha något som får mig att pausa och tänka medan jag läser, dvs. min definition av mer läsbar. Med hängslen ignorerar mitt sinne dem. Utan hängslen måste mitt sinne pausa och justera kontrollblocken. Inte en lång paus, men en paus ändå.
- Ja, om och annat hör samman, MEN så gör det {och} och eftersom} är på en separat rad, {borde vara på en separat också. " Jag kan bara passa en viss mängd källkod på min skärm " Och att ' s exakt varför att 3) skulle vara " diskvalificerar sig själv " är inget alternativ alls. Efter ett decennium av att arbeta med 3) har jag inte glömt att lägga till parenteser när jag lägger till en ny kodrad, aldrig, och jag känner inte heller någon som någonsin haft. Om jag måste anpassa koden till människor, vem kan ' inte läsa ordentligt, var slutar det? Slutar du använda vissa språkfunktioner, eftersom vissa av koderna kanske inte förstår dem?
Svar
Jag läste någonstans att författarna till någon bok ville ha sin kod formaterad så här:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Men utrymmesbegränsningar från deras utgivare innebar att de var tvungna att använda detta:
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Nu vet jag inte om det är sant (eftersom jag inte kan hitta det mer), men den senare stilen är mycket utbredd i böcker.
På en personlig nivå föredrar jag parenteserna på en separat rad som:
a) de indikerar ett nytt omfång
b) det är lättare att upptäcka när du har en ojämnhet (även om detta är mindre problem i en IDE som belyser fel för dig).
Kommentarer
- … Det andra alternativet underlättar också båda dina poäng (med enbart indrag som tjänar syftet med stag / indragskombination). 🙂
Svar
Ah, One True Brace Style .
Det har allt som behövs för en helig W ay – till och med en profet (Richard ”min väg eller motorvägen” Stallman).
Killen hade så fel om så många saker, men GNU är spot-on när det gäller hängslen.
[Uppdatering] Jag har sett ljuset och tillber nu Allman
Kommentarer
- Jag ser inte ' Jag ser inte punkten i GNU-stilen, förutom att den modellerar lisp-kod. Verkar mycket arbete till liten nytta.
- Jag känner inte till någon som använder GNU-stilen. 1TBS hela vägen.
- Du kan ' t göra sämre än två indragningsnivåer per block, förutom lisp-stil, naturligtvis, det är självklart.
- +1 för länken om stagstilar. Det visar att oavsett din stil, många stora människor håller inte med dig.
- @RobertHarvey Det finns inget extra arbete, om det är så använder du inte ' rätt verktyg för att skriva kod eller dint konfigurera det rätt. Fördelen är mycket mer läsbar kod, du ser alla fel i parentes väldigt snabbt och du kan enkelt läsa bara koden från medan du ignorerar underblock.
Svar
Andra exemplet, jag är väldigt stor på läsbarheten. Jag kan inte stå och titta på om blockerar något annat sätt = (
Kommentarer
- Forskning visar att ' är lättare att läsa kompakt kod när en kodbas överstiger skärmens höjd.
- @ weberc2 , kan du ge DOI: er till dessa forskningspapper?
Svar
Enkelt svar: vad är lättare att felsöka?
// 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 vilket fall diagnostiserade du problemet först?
Jag bryr mig inte så mycket om personliga preferenser (det finns många andra stilar, inklusive whitesmith och al.) och jag bryr mig inte så mycket … så länge det inte hindrar min förmåga att läsa koden och felsöka det.
A s till ”slöseri” -argumentet, jag köper inte det: Jag brukar lägga till tomma rader mellan logiska grupper ändå för att göra programmet tydligare …
Kommentarer
- De är båda lika lätta att felsöka, främst eftersom det ' är ett kort kodblock. Fördjupningen är konsekvent, vilket gör det enkelt att visualisera de faktiska kodblocken.
- @Htbaa: verkligen 🙂 Så varför bry sig?
- @MatthieuM. Det första blocket är mer meningsfullt för mig, eftersom de nya raderna (i det andra blocket) mellan funktionssignaturen, för-uttalandet och if-uttalandet får mig att tro att de inte är relaterade, men de är helt klart >
t. Tomma rader är att separera icke-relaterade bitar av kod; kod som ' ligger nära andra kodrader betyder att de faktiskt är relaterade. Det här är allt ' imo ' naturligtvis, men jag undrade vad din poäng var. REDIGERA: varje korrekt IDE kommer att märka att någon klammer saknas och ge dig en smula fel när du tolkar din kod.
Svar
Inte att någon kommer att märka, men det är därför som hängslen tillhör samma rad som villkorligt (förutom mycket långa villkor, men det är en kant case):
I C är detta en giltig konstruktion:
while(true); { char c; getchar(); //Wait for input }
Snabb! Vad gör den här koden? Om du svarade ” oändlig slinga som ber om inmatning ”, du har fel! Det kommer inte ens till ingången. Det fastnar vid while(true)
. Lägg märke till det semikolonet i slutet.Detta mönster är faktiskt vanligare att det verkar som det borde vara; C kräver att du deklarerar dina variabler i början av ett block, varför en ny startades.
En kodrad är en tanke. Hängslen är en del av tanken som innehåller villkoret eller slingan. Därför hör de till samma rad.
Kommentarer
- Detta är det absolut bästa argumentet för K & R-stil jag har sett, resten är skrattretande med idag ' s IDE-system med kodvikningsstöd. Detta gäller endast C-stil språk som stöder
;
blockändar. Det är också därför jag föraktar detta blockeringssystem som IMHO är föråldrat och Go-språket bevisar det. Jag har sett denna fråga många gånger men inte i det här scenariot. Det händer vanligtvis där de tänker lägga till något i uttalandet och glömmer det.
Svar
Jag gillar första metoden. Det verkar snyggare IMO, och det är mer kompakt, vilket jag gillar.
EDIT: Ah, en tredjedel. Jag gillar den bäst när det är möjligt, eftersom den är ännu mindre / snyggare.
Svar
Du kan skriva det:
you.hasAnswer() ? you.postAnswer() : you.doSomething();
Till svara på frågan; Jag brukade föredra lockiga hängslen på sin egen linje, men för att undvika att tänka på buggar från automatisk infogning av semikolon i webbläsare började jag använda egyptisk stil för javascript. Och när jag kodade java i förmörkelse hade jag inget intresse av att slåss (eller konfigurera) standardstaget, så jag gick också med egyptiska i det fallet. Nu går det bra med båda.
Kommentarer
- som ska användas så,
postAnswer()
ochdoSomething()
ska returnera värde för ternär operatör, vilket ofta inte är fallet: de kan mycket väl returnera ogiltiga (inget värde). och också (åtminstone i c #) resultat av?:
bör tilldelas någon variabel
Svar
Nästan alla svar här säger vi lite variation på ”Vad du än gör, håll fast vid antingen en eller två”.
Så jag tänkte på det ett ögonblick och var tvungen att erkänna att jag bara inte ser det som så viktigt . Kan någon ärligt säga till mig att följande är svårt att följa?
int foo(int a, Bar b) { int c = 0; while(a != c) { if(b.value[a] == c) { c = CONST_A; } c++; } return c; }
Jag är inte säker på någon annan … men jag har absolut inga problem mentalt växla fram och tillbaka mellan stilar. Det tog mig några ögonblick att ta reda på vad koden gjorde, men det är resultatet av att jag bara slumpmässigt skrev C-liknande syntax. 🙂
Enligt min inte så ödmjuka åsikt är öppningsbara hängslen nästan helt irrelevanta för kodläsbarhet. Det finns några hörnfall som listas ovan där den ena stilen eller den andra gör skillnad, men för det mesta rensar användningen av tomma rader av det.
FWIW, våra kodningsstilar på jobbet använder en aning mer strukturerad form 1 och en modifierad 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
Jag är nyfiken på om de som starkt föredrar form 2 skulle hitta denna version av form 1 bättre, bara för att den tomma raden ger en starkare visuell avskiljning.
Kommentarer
- Som ditt exempel visar är indragning så mycket viktigt än hängslen för läsbar Faktum är att vissa språk gör indrag till det enda sättet att hysa uttalanden!
- Okej, jag tycker ärligt talat att du är inkonsekvent svårläst. Inte riktigt svårt, men svårare än om det var konsekvent.
- Jag håller med Almo. Det är inte fallet med " är det verkligen svårt " Det är ett fall av " det är definitivt svårare ", även om det inte är svårt. Så varför göra saker svårare? I " leksak " exempel ger folk naturligtvis liten skillnad. Enligt min erfarenhet, när jag ärver otäck kod från någon annan och de använde metod 1, blir det ganska ofta nödvändigt att fortsätta och förvandla den till metod 2 bara för att kunna följa logiken. På grund av det faktum att det ofta blir nödvändigt; det svarar automatiskt på frågan vilken metod som är bättre och lättare att förstå.
- @Dunk: Jag kan inte förstå koden som skulle förbättras märkbart genom att byta sådana irrelevanta detaljer runt. -Uppenbarligen har du inte ' t ärvt mycket kod från andra som länge har lämnat antingen projektet eller företaget. Jag kan ' inte förstå att jag inte stöter på den situationen av någon med några års erfarenhet. Men sedan är alla ' arbetssituationer olika. Om du måste göra " formell " kodrecensioner, gör formatering en stor skillnad. Att kunna läsa koden är naturligt mycket viktigt.Visst kan jag pausa och tänka att matcha hängslen, men det saktar ner processen. Ett sätt kräver inte paus, de andra gör det. Det är ' varför jag inte ' inte ser varför något annat val kan rekommenderas.
Svar
Jag är förvånad över att detta ännu inte har tagits upp. Jag föredrar det andra tillvägagångssättet eftersom det gör att du lättare kan välja blocket.
När hakparenteserna börjar och slutar i samma kolumn och på sin egen rad kan du välja från marginalen eller med markören på kolumn 0. Detta uppgår i allmänhet till ett mer generöst område med musval eller färre tangenttryckningar med tangentbordsval.
Jag arbetade ursprungligen med hängslen på samma linje som den villkorliga, men när jag bytte fann jag att den accelererade den hastighet som jag arbetade med. Det är förstås inte natt och dag, men det är något som kommer att sakta ner dig när du arbetar med hängslen bredvid dina villkor.
Kommentarer
- Gamla timers som jag använder tre tangenttryckningar för att välja blocket oavsett var jävla hängslen är.
Svar
Jag gillar personligen det andra sättet.
Men hur jag ska demonstrera är enligt min mening bäst eftersom det ger störst arbetssäkerhet! En medstudent från mitt universitet bad mig om hjälp med sina läxor och såg hans kod ut. Hela programmet såg ut som ett enda block. Det intressanta är att 95% av buggarna i programmet han gjorde kom från felaktiga hängslen. De andra 5% var uppenbara när hängslen matchades.
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ålig, dålig Jag menar fruktansvärt, fruktansvärt exempel. Problemet är inte hängslen! Det ' är den galna fördjupningen!
- @Martinho Fernandes Jag trodde att placera hängslen och fördjupning går ihop …
- inte nödvändigtvis. .. gör rätt indragning på ovanstående och byt sedan slumpmässigt stag-stilar, du ' kommer att upptäcka att det ' är förståeligt. li>
- Att tänka på detta motiverade faktiskt mitt eget svar på denna fråga.
- " 95% av buggarna i programmet han gjorde kom från felaktiga hakparenteser " – endast på tolkade språk, inte kompilerade.
Svar
Min personliga preferens är den första metoden, förmodligen för att det är så jag först lärde mig PHP.
För enradiga if
uttalanden, Jag ska använda
if (you.hasAnswer()) you.postAnswer();
Om det inte är you.postAnswer();
utan något som mycket längre, till exempel you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
Jag återgår troligen till fi första typ:
if (you.hasAnswer) { you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType); }
Jag kommer aldrig att använda en radbrytning och jag kommer aldrig använda den här metoden om det också finns en else
uttalande.
if (you.hasAnswer()) you.postAnswer(); else you.doSomething()
är en teoretisk möjlighet, men inte en som jag någonsin skulle använda. Detta måste förvandlas till
if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); }
Svar
De borde inte; första metoden för mig.
När jag tittar på den andra, på grund av de oanvända linjerna (de som bara har hängslen på den, förutom den allra sista stängningen), känns det som att den bryter kontinuiteten i koden. Jag kan inte läsa det så fort eftersom jag måste ägna särskild uppmärksamhet åt tomma rader som vanligtvis betyder en separation i kodändamål eller något liknande, men under inga omständigheter ”hör denna raden till ett lockigt stag” (som bara upprepar betydelsen av indrag).
Hur som helst, precis som när du skriver text … att lägga till en fördjupning i början av ett stycke är överflödig om det finns en tom rad före den (dubbeltecken på styckeändring), där är inget behov av att slösa bort ledningar för hängslen när vi är ordentligt indragna.
Plus, som redan nämnts, gör det möjligt att passa mer kod på skärmen, vilket annars är lite kontraproduktivt.
Svar
Det beror på plattform / språk / 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(); } }
Jag hatar när Java-killar använder sin stil i C # -kod och vice versa.
Kommentarer
- C-stil al sätt irriterade mig. Var konsekvent!
Svar
Allt jag kan säga är att om du är ett fan av metod # 3 , du kommer att förföljas av alla IDE-kodformatörer på jorden.
Svar
Jag använder den första metoden helt enkelt för att det är mer kompakt och tillåter mer kod på skärmen. Jag har själv aldrig haft problem med att para ihop hängslen (jag skriver alltid ut dem tillsammans med uttalandet if
innan jag lägger till villkoret , och i de flesta miljöer kan du hoppa till matchande stöd.
Om du behövde para ihop hängslen visuellt, föredrar jag den andra metoden. Men det tillåter mindre kod samtidigt som kräver att du bläddrar mer. Och det har åtminstone för mig en större inverkan på att läsa kod än att ha snyggt inriktade hängslen. Jag hatar att rulla. Återigen, om du behöver bläddra över ett enda if
uttalande, är det troligtvis för stort och behöver omarbetas.
Men; det viktigaste av allt är konsistens. Använd det ena eller det andra – aldrig båda!
Svar
När jag först lärde mig programmering klockan 12 satte jag hängslen på nästa rad eftersom Microsofts kodningshandledning är så. Jag indragade också med 4-mellanslags TABS den tiden.
Efter några år lärde jag mig Java och JavaScript och såg fler hängslen på samma linje-kod, så jag ändrade. Jag började också göra indrag med 2-mellanslag Rymden.
Kommentarer
- +1, -1. Varför skulle du INTE fördjupa dig med flikar eftersom någon redaktör kan justera fliklängden till din godtyckliga längd? Annars leder du många av oss som gillar sanna indrag vid 8 för att förbanna din kod.
Svar
Det finns ett fjärde alternativ som håller hängslen inriktade men inte slösar bort utrymme:
if (you.hasAnswer()) { you.postAnswer(); i.readAnswer(); } else { you.doSomething(); }
Det enda problemet är att de flesta IDE: s autoformatörer kväver på detta.
Kommentarer
- … liksom de flesta programmerare som skulle kväva detta.
- Det verkar fruktansvärt. Tänk på extra ansträngning du måste gå igenom om du vill infoga en rad högst upp eller ta bort den översta raden. Du kan ' inte bara ta bort raden och gå vidare, du måste komma ihåg för att sätta in den lockiga hängaren igen.
- lol det är fantastiskt! 🙂 bättre än första stilen!
- Tydligen har den till och med ett namn. Horstman Syyle nämns i wikipedia . Jag ' har arbetat med en kodbas som det här är det ' verkligen inte illa för använd.
Svar
Allt beror på dig så länge du inte arbetar med ett projekt där vissa kodbegränsningar eller vissa standarder har ställts av projektledaren som alla programmerare som arbetar med det projektet måste följa när de kodar.
Jag föredrar personligen den första metoden.
Jag fick inte vad du vill visa med den tredje metoden?
Är det inte fel sätt? Tänk till exempel på en situation som …
if (you.hasAnswer()) you.postAnswer(); else you.doSomething();
Tänk nu om någon vill lägga till några fler uttalanden i om blockera?
Om du i så fall använder den tredje metoden kommer kompilatorn att kasta syntaxfelet.
if (you.hasAnswer()) you.postAnswer1(); you.postAnswer2(); else you.doSomething();
Kommentarer
- Ännu värre skulle vara om någon kom och gjorde: if (you.hasAnswer ()) you.postAnswer (); annars gör du. gör något (); you.doSomethingElse (); – det ' ett recept på subtila buggar som ögat lätt kan glida över och kompilatorn vinner inte ' heller inte
- @FinnNk: Exakt!
- Om någon vill lägga till ett nytt uttalande kan de sätta in hängslen själva. Alla programmerare som är värda sitt salt borde verkligen kunna räkna ut det.
- Jag ville säga att hans tredje metod är fel.
- @Robert Harvey, jag ' har sett mycket erfarna kodare saknar att lägga till hängslen vid modifiering av befintlig kod. Jag tror att problemet är att fördjupning är en mycket starkare ledtråd till mening än hängslen (speciellt eftersom det finns flera stagstilar,) så det ' är ganska lätt att förbise det saknade staget om indrag ser ut som vad du förväntar dig.
Lämna ett svar