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.MaxValue
adalah 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 -1
dan tidak -123
? Seorang pemula juga mungkin secara keliru berpikir bahwa itu 0
berarti "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, 0
untuk 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
Duration
ke 0 jika IsTimeoutEnabled
itu benar?
- Jika
IsTimeoutEnabled
salah, apa yang terjadi jika saya menetapkan Duration
ke 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 Timeout
kelas?
Kesimpulan
null
mengungkapkan 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.MaxValue
sangat terkait dengan bahasa itu sendiri. Jangan gunakan int.MaxValue
untuk batas kecepatan maksimum Vehicle
kelas atau kecepatan maksimum yang dapat diterima untuk pesawat terbang, dll.
Hindari nilai-nilai ajaib seperti -1
dalam kode Anda. Mereka menyesatkan dan menyebabkan kesalahan dalam kode.
Buat kelas Anda sendiri yang akan lebih mudah, dengan nilai minimum / maksimum yang ditentukan. Misalnya VehicleSpeed
bisa 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 int
tipe asli saja.