Rozważać:
Język,
Struktura,
Kontekst.
1. Język
Użycie ∞ może być rozwiązaniem dla maksimum.
W języku C # istnieje int.MaxValue
, ale nie można go użyć w twoim przypadku. int.MaxValue
to maksymalna liczba całkowita, 2 147 483 647. Jeśli w kodzie masz maksymalną wartość czegoś, na przykład maksymalną akceptowaną presję, zanim coś wybuchnie, użycie 2 147 483 647 nie ma sensu.
2. Ramy
.NET Framework jest dość niespójny w tym punkcie, a jego użycie magicznych wartości można skrytykować.
Na przykład "Hello".IndexOf("Z")
zwraca magiczną wartość -1
. To może łatwiej (prawda?), Aby manipulować wynik:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
zamiast używać niestandardowej struktury:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
ale wcale nie jest intuicyjny. Dlaczego -1
nie -123
? Początkujący może również błędnie pomyśleć, że 0
oznacza to również „Nie znaleziono” lub po prostu pomylił się (position >= 0)
.
3. Kontekst
Jeśli twój kod jest związany z przekroczeniem limitu czasu w gniazdach sieciowych, używanie czegoś, z czego wszyscy korzystali przez dziesięciolecia w celu zachowania spójności, nie jest złym pomysłem . Zwłaszcza, 0
że limit czasu jest bardzo jasny: jest to wartość, która nie może wynosić zero. Zastosowanie niestandardowej klasy w tym przypadku może utrudnić zrozumienie:
class Timeout
{
// A value indicating whether there is a timeout.
public bool IsTimeoutEnabled { get; set; }
// The duration of the timeout, in milliseconds.
public int Duration { get; set; }
}
- Czy mogę ustawić
Duration
na 0, jeśli IsTimeoutEnabled
jest to prawda?
- Jeśli
IsTimeoutEnabled
jest to fałsz, co się stanie, jeśli ustawię wartość Duration
100?
Może to prowadzić do wielu błędów. Wyobraź sobie następujący fragment kodu:
this.currentOperation.Timeout = new Timeout
{
// Set the timeout to 200 ms.; we don't want this operation to be longer than that.
Duration = 200,
};
this.currentOperation.Run();
Operacja trwa przez dziesięć sekund. Czy widzisz, co jest nie tak z tym kodem, bez czytania dokumentacji Timeout
klasy?
Wniosek
null
dobrze wyraża pogląd, że wartości tu nie ma. Nie jest pod warunkiem. Niedostępne. Nie jest to ani liczba, ani ciąg zerowy / pusty, czy cokolwiek innego. Nie używaj go do maksymalnych lub minimalnych wartości.
int.MaxValue
jest ściśle związany z samym językiem. Nie należy stosować int.MaxValue
ograniczenia prędkości maksymalnej w Vehicle
klasie lub maksymalnej dopuszczalnej prędkości dla statku powietrznego itp.
Unikaj magicznych wartości jak -1
w kodzie. Wprowadzają w błąd i prowadzą do błędów w kodzie.
Utwórz własną klasę, która byłaby prostsza, z określonymi wartościami minimalnymi / maksymalnymi. Na przykład VehicleSpeed
może mieć VehicleSpeed.MaxValue
.
Nie postępuj zgodnie z poprzednimi wytycznymi i używaj magicznych wartości, jeśli jest to ogólna konwencja od dziesięcioleci w bardzo konkretnej dziedzinie, używana przez większość ludzi piszących kod w tym polu.
Nie zapomnij mieszać podejść. Na przykład:
class DnsQuery
{
public const int NoTimeout = 0;
public int Timeout { get; set; }
}
this.query.Timeout = 0; // For people who are familiar with timeouts set to zero.
// or
this.query.Timeout = DnsQuery.NoTimeout; // For other people.
¹ Możesz stworzyć swój własny typ, który zawiera nieskończoność. Tutaj mówię tylko o rodzimym int
typie.