Jest to nieco kontrowersyjny temat i myślę, że jest tyle opinii, ile jest programistów. Ale ze względu na to chcę wiedzieć, jakie są powszechne praktyki w biznesie (lub w miejscach pracy).
W moim miejscu pracy mamy ścisłe wytyczne dotyczące kodowania. Jedna z nich poświęcona jest magicznym ciągom znaków / liczbom. Mówi (dla C #):
Nie używaj wartości literalnych, ani liczbowych, ani ciągów znaków w kodzie innym niż definiowanie stałych symbolicznych. Użyj następującego wzorca, aby zdefiniować stałe:
public class Whatever { public static readonly Color PapayaWhip = new Color(0xFFEFD5); public const int MaxNumberOfWheels = 18; }
Istnieją wyjątki: wartości 0, 1 i null prawie zawsze można bezpiecznie stosować. Bardzo często wartości 2 i -1 są również OK. Ciągi przeznaczone do rejestrowania lub śledzenia są wyłączone z tej reguły. Literały są dozwolone, gdy ich znaczenie jest jasne z kontekstu i nie podlega przyszłym zmianom.
mean = (a + b) / 2; // okay
WaitMilliseconds(waitTimeInSeconds * 1000); // clear enough
Idealną sytuacją byłby jakiś oficjalny artykuł badawczy pokazujący wpływ na czytelność / łatwość konserwacji kodu, gdy:
- Magiczne liczby / ciągi znaków są wszędzie
- Magiczne ciągi / liczby są zastępowane ciągłymi deklaracjami w rozsądny sposób (lub w różnych stopniach zasięgu) - i proszę nie krzycz na mnie za używanie „rozsądnie”, wiem, że każdy ma inne pojęcie, co to „rozsądnie”
- Liczby magiczne / liczby są zastępowane w nadmiarze i tam, gdzie nie musiałyby być (patrz mój przykład poniżej)
Chciałbym to zrobić, aby mieć pewne naukowe argumenty podczas kłótni z jednym z moich kolegów, który dąży do tego, aby zadeklarować stałe, takie jak:
private const char SemiColon = ';';
private const char Space = ' ';
private const int NumberTen = 10;
Innym przykładem może być (a ten jest w JavaScript):
var someNumericDisplay = new NumericDisplay("#Div_ID_Here");
Czy przyklejasz identyfikatory DOM na wierzchu pliku javascript, jeśli ten identyfikator jest używany tylko w jednym miejscu?
Przeczytałem następujące tematy:
StackExchange
StackOverflow
Bytes Społeczność IT
Istnieje wiele innych artykułów, a po ich przeczytaniu pojawiają się pewne wzorce.
Więc moim pytaniem powinno być używanie magicznych ciągów i liczb w naszym kodzie? W szczególności szukam odpowiedzi ekspertów, które w miarę możliwości są poparte referencjami.
NumberTen = 10
Jest to bezcelowe, ponieważ liczba 10 nie zostanie ponownie zdefiniowana. MaxRetryCount = 10
W tym momencie możemy chcieć zmienić maksymalną liczbę ponownych prób. private const char SemiColon = ';';
Głupi. private const char LineTerminator = ';'
; Mądry.