Mempertimbangkan:
Bahasa,
Kerangka,
Konteks.
1. Bahasa
Menggunakan ∞ bisa menjadi solusi maksimal.
JavaScript, misalnya, memiliki jumlah tak terbatas. C # tidak¹.
Ada, misalnya, memiliki rentang. C # tidak.
Di C #, ada int.MaxValue, tetapi Anda tidak dapat menggunakannya dalam kasing Anda. int.MaxValueadalah bilangan bulat maksimum, 2.147.483.647. Jika dalam kode Anda, Anda memiliki nilai maksimum sesuatu, seperti tekanan maksimum yang diterima sebelum sesuatu meledak, menggunakan 2.147.483.647 tidak masuk akal.
2. Kerangka Kerja
.NET Framework agak tidak konsisten dalam hal ini, dan penggunaan nilai-nilai ajaibnya dapat dikritik.
Misalnya, "Hello".IndexOf("Z")mengembalikan nilai ajaib -1. Ini mungkin membuat lebih mudah (bukan?) Untuk memanipulasi hasilnya:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
daripada menggunakan struktur khusus:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
tetapi tidak intuitif sama sekali. Kenapa -1dan tidak -123? Seorang pemula juga mungkin secara keliru berpikir bahwa itu 0berarti "Tidak ditemukan" juga atau salah ketik (position >= 0).
3. Konteks
Jika kode Anda terkait dengan timeout di soket jaringan, menggunakan sesuatu yang telah digunakan oleh semua orang selama beberapa dekade demi menjadi konsisten bukanlah ide yang buruk . Terutama, 0untuk batas waktu sangat jelas: ini adalah nilai yang tidak boleh nol. Menggunakan kelas khusus dalam hal ini dapat membuat hal-hal lebih sulit untuk dipahami:
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; }
}
- Dapatkah saya menetapkan
Durationke 0 jika IsTimeoutEnableditu benar?
- Jika
IsTimeoutEnabledsalah, apa yang terjadi jika saya menetapkan Durationke 100?
Ini dapat menyebabkan banyak kesalahan. Bayangkan potongan kode berikut:
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();
Operasi berjalan selama sepuluh detik. Bisakah Anda melihat apa yang salah dengan kode ini, tanpa membaca dokumentasi Timeoutkelas?
Kesimpulan
nullmengungkapkan dengan baik gagasan bahwa nilainya tidak ada di sini. Itu tidak disediakan. Tidak tersedia. Ini bukan angka, atau string nol / kosong atau apa pun. Jangan gunakan untuk nilai maksimum atau minimum.
int.MaxValuesangat terkait dengan bahasa itu sendiri. Jangan gunakan int.MaxValueuntuk batas kecepatan maksimum Vehiclekelas atau kecepatan maksimum yang dapat diterima untuk pesawat terbang, dll.
Hindari nilai-nilai ajaib seperti -1dalam kode Anda. Mereka menyesatkan dan menyebabkan kesalahan dalam kode.
Buat kelas Anda sendiri yang akan lebih mudah, dengan nilai minimum / maksimum yang ditentukan. Misalnya VehicleSpeedbisa punya VehicleSpeed.MaxValue.
Jangan ikuti panduan sebelumnya dan gunakan nilai sihir jika itu adalah konvensi umum selama beberapa dekade dalam bidang yang sangat spesifik, yang digunakan oleh kebanyakan orang menulis kode di bidang ini.
Jangan lupa untuk menggabungkan pendekatan. Sebagai contoh:
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.
¹ Anda dapat membuat tipe Anda sendiri yang mencakup infinity. Di sini, saya berbicara tentang inttipe asli saja.