Düşünmek:
1. Dil
∞ kullanmak azami bir çözüm olabilir.
C # 'da var int.MaxValue
, ama senin durumunda kullanamazsın. int.MaxValue
maksimum tamsayı, 2,147,483,647'dir. Kodunuzda, bir şey patlamaya başlamadan önce maksimum bir baskı gibi, maksimum bir değere sahip olursanız, 2.147.483.647'yi kullanmanın bir anlamı yoktur.
2. Çerçeve
.NET Framework bu noktada oldukça tutarsız ve sihirli değerlerin kullanımı eleştirilebilir.
Örneğin, "Hello".IndexOf("Z")
bir sihirli değer döndürür -1
. Bu belki de (bunu yapar?) Kolaylaştırır sonucu işlemek için:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
özel bir yapı kullanmak yerine:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
ama hiç sezgisel değil. Neden -1
ve değil -123
? Yeni başlayanlar ayrıca yanlışlıkla 0
"Bulunamadı" anlamına da gelebilir ya da sadece yanlış yazım yapabilir (position >= 0)
.
3. Bağlam
Kodunuz ağ soketlerinde zaman aşımları ile ilgiliyse, tutarlı olma uğruna herkes tarafından on yıllarca kullanılan bir şeyin kullanılması kötü bir fikir değildir . Özellikle, 0
bir zaman aşımı için çok açık: sıfır olamaz bir değer. Bu durumda özel bir sınıf kullanmak işlerin anlaşılmasını zorlaştırabilir:
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; }
}
- Doğru
Duration
ise 0 olarak ayarlayabilir miyim IsTimeoutEnabled
?
- Eğer
IsTimeoutEnabled
yanlış ise Duration
100'e set edersem ne olur ?
Bu birden fazla hataya yol açabilir. Aşağıdaki kod parçasını hayal edin:
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();
İşlem on saniye boyunca devam eder. Timeout
Sınıfın dökümanlarını okumadan bu kodda neyin yanlış olduğunu görebiliyor musunuz?
Sonuç
null
Değerin burada olmadığı fikrini iyi ifade eder. Sağlanmadı. Müsait değil. Ne sayı, ne de sıfır / boş dize veya hiç. Maksimum veya minimum değerler için kullanmayın.
int.MaxValue
dilin kendisi ile yakından ilgilidir. Kullanmayın int.MaxValue
maksimum hız limiti için Vehicle
bir uçağın, vs. sınıf veya maksimum kabul edilebilir bir hızda
-1
Kodunuzdaki gibi sihirli değerlerden kaçının . Yanıltıcılar ve kodlarda hatalara yol açarlar.
Belirlenen minimum / maksimum değerlerle, daha basit bir şekilde kendi sınıfınızı oluşturun. Örneğin VehicleSpeed
olabilir VehicleSpeed.MaxValue
.
Daha önce herhangi bir kılavuza uymayın ve çoğu insan tarafından bu alana kod yazarken kullanılan, çok özel bir alanda yıllarca süren genel bir kuralsa, sihirli değerleri kullanmayın.
Yaklaşımları karıştırmayı unutma. Örneğin:
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.
İnity Sonsuzluğu içeren kendi türünüzü oluşturabilirsiniz. Burada int
yalnızca yerel türden bahsediyorum .