-
Ordning i fil
Sträva efter att ordna medlemmar i en fil enligt StyleCop regel SA1201: ElementsMustAppearInTheCorrectOrder.Två saker kan man fokusera på:
- Sortera metoder i bokstavsordning och placera alla publika först.
- Sortera medlemmar i klasser i bokstavsordning.
-
Klasser läggs i separata filer
-
Tomrader mellan element
Ha alltid en tomrad mellan element. Det gäller såväl mellan metoder som kodblock. Ett block kan vara ettif
-uttryck ellerforeach
osv. -
Flera tomrader
Undvik flera tomrader på rad. -
En deklaration per rad
Undvik att deklarera flera variabler på en och samma rad.❌ UNDVIK:
int i = 2, j = 3;
✅ GÖR SÅ HÄR:
int i = 2; int j = 3;
-
Regioner
Undvik att använda regioner. -
Hämtning, beräkning och kontroll
Undvik tomrad mellan datahämtning eller beräkningar, och det villkorsuttryck som ska kontrollera resultatet.❌ UNDVIK:
var siteConfigurationPage = ContentHelper.GetSiteConfigurationPage() as ConsumerSiteConfigurationPage; if (siteConfigurationPage == null) return string.Empty;
✅ GÖR SÅ HÄR:
var siteConfigurationPage = ContentHelper.GetSiteConfigurationPage() as ConsumerSiteConfigurationPage; if (siteConfigurationPage == null) return string.Empty;
-
Tomrad innan sista retur-uttrycket
Sträva efter att ha en tomrad innan det sista retur-uttrycket i metoder, det gäller framförallt när metoden är lite längre och mer komplicerad.❌ UNDVIK:
// Placeholder.
✅ GÖR SÅ HÄR:
// Placeholder.
-
Indrag
- Använd fyra (4) mellanslag istället för tabb i filer.
- Använd inte enstaka mellanslag för att marginaljustera uttryck. Många varierande radstarter i koden gör att helheten blir svårare att läsa.
I exemplet nedan används fem olika indrag i det övre exemplet och två i det undre.
❌ UNDVIK:
public ResultType ArbitraryMethodName(FirstArgumentType firstParameter, SecondArgumentType secondParameter, ThirdArgumentType thirdParameter) { LocalVariableType localVariable = method(firstParameter, secondParameter defaultIfZero: 100); if (localVariable.IsSomething(thirdParameter, SomeConstant)) { DoSomethingWith(localVariable); } return localVariable.GetSomething(); }
✅ GÖR SÅ HÄR:
public ResultType ArbitraryMethodName( FirstArgumentType firstParameter, SecondArgumentType secondParameter, ThirdArgumentType thirdParameter) { LocalVariableType localVariable = method(firstParameter, secondParameter, defaultIfZero: 100); if (localVariable.IsSomething(thirdParameter, SomeConstant)) { DoSomethingWith(localVariable); } return localVariable.GetSomething(); }
-
Radbryningar
Om inte ett uttryck får rum på en rad och det inte är möjligt att refaktorera för att göra den kortare, följ dessa generella principer:- Bryt före logiska operatorer (såsom
&&
,||
etc). - Bryt efter alla andra operatorer (såsom
+
,-
etc). - Bryt efter komma.
- Gör alltid indrag efter radbrytning.
- Bryt före logiska operatorer (såsom
-
Radbrytningar i metodsignaturer
Om raden tenderar att bli längre än praxis kan det vara mer lättläst att dela upp metodsnamnet på en rad och parametrar på nästa. Följ också konvention med indrag.❌ UNDVIK:
public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
❌ UNDVIK:
public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
✅ GÖR SÅ HÄR:
public override IAsyncResult BeginWrite( byte[] buffer, int offset, int count, AsyncCallback callback, object state)
✅ ELLER GÖR SÅ HÄR:
public override IAsyncResult BeginWrite( byte[] buffer, int offset, int count, AsyncCallback callback, object state)
-
Radbrytningar i metodanrop
Använd ungefär samma principer vid metodanrop som vid metodssignaturer.❌ UNDVIK:
var compareResult = string.Compare(string1, string2, StringComparison.OrdinalIgnoreCase);
✅ GÖR SÅ HÄR:
var compareResult = string.Compare( string1, string2, StringComparison.OrdinalIgnoreCase);
✅ ELLER GÖR SÅ HÄR:
var compareResult = string.Compare( string1, string2, StringComparison.OrdinalIgnoreCase);
✅ ELLER GÖR SÅ HÄR:
var compareResult = string.Compare( string1, string2, StringComparison.OrdinalIgnoreCase);
-
Radbrytningar av ternary operatorn
Får uttrycket plats på en rad och är läsbart, behåll det så. I annat fall, dela upp raderna så att de börjar med?
respektive:
.ℹ EXEMPEL:
int result = condition ? SomeFunction1() : SomeFunction2();
Just i detta exempel, när uttrycket är kort, är det bättre att placera allt på en rad.
ℹ EXEMPEL TVÅ:
int result = condition ? SomeFunction1() : SomeFunction2();
-
Radbrytningar av LINQ med metodsyntax
Får uttrycket plats på en rad och är läsbart, behåll det så. I annat fall, dela upp raderna så att de börjar med.
och extension-metod namnet. Undvik att dela upp lambda-yttryck så långt det går.❌ UNDVIK:
var nameAndOrderIds = customers .Where(c => c.Country == "Sweden") .SelectMany(o => o.Orders) .Where(y => y.OrderDate.Year == 2017) .Select(oi => new { oi.Customer.Name, oi.OrderID });
✅ GÖR SÅ HÄR:
var nameAndOrderIds = customers .Where(c => c.Country == "Sweden") .SelectMany(o => o.Orders) .Where(y => y.OrderDate.Year == 2017) .Select(oi => new { oi.Customer.Name, oi.OrderID });
-
Radbrytningar av LINQ med frågesyntax
Får uttrycket plats på en rad och är läsbart, behåll det så. I annat fall, placerafrom
på en egen rad.❌ UNDVIK:
var categoryProducts = from category in categories join p in products on category.ID equals p.CategoryID into prodGroups orderby category.Name select new { Category = category.Name, Products = from prodGroup in prodGroups orderby prodGroup.Name select prodGroup };
✅ GÖR SÅ HÄR:
var categoryProducts = from category in categories join p in products on category.ID equals p.CategoryID into prodGroups orderby category.Name select new { Category = category.Name, Products = from prodGroup in prodGroups orderby prodGroup.Name select prodGroup };
-
Klasser
Försök hålla klasser så små som möjligt. Använd "Single Responsibility Principal" för att avgöra storleken. Principen säger att varje objekt ska ett ansvar och att ansvaret bör vara helt inkapslat i klassen. -
Metoder
Undvik metoder som är längre än 15-20 rader. Men, det är bara ett riktmärke. Det kan finnas skäl till att en metod är längre än så. -
Parametrar
Antal parametrar i metodsignaturer bör vara runt fyra (4). Om det blir fler, skapa en s.k. "wrapper"-klass istället som används som parameter. Använd konstruktorn i wrapper-klassen framför att objektinitialisera den. -
Radbredd
Sätt radbredden till maximum om 120 tecken.Ju längre kodrader är ju mer distraktion utsätts du för i det ögonblick du ska börja läsa nästa rad. Se exempel nedan.
Så här tänker ofta utvecklare när de skriver kod (rader kan vara lika långa som skärmen är bredd)
Så här brukar människor föredra att läsa text (kortare rader som i böcker)