Xem xét:
Ngôn ngữ
Khung,
Bối cảnh.
1. Ngôn ngữ
Sử dụng có thể là một giải pháp tối đa.
JavaScript, ví dụ, có một vô cùng. C # không¹.
Ada, ví dụ, có phạm vi. C # không.
Trong C #, có int.MaxValue
, nhưng bạn không thể sử dụng nó trong trường hợp của bạn. int.MaxValue
là số nguyên tối đa, 2.147.483.647. Nếu trong mã của bạn, bạn có giá trị tối đa của một cái gì đó, như áp lực tối đa được chấp nhận trước khi một thứ gì đó phát nổ, sử dụng 2.147.483.647 không có ý nghĩa.
2. Khung
.NET Framework không nhất quán ở điểm này và việc sử dụng các giá trị ma thuật của nó có thể bị chỉ trích.
Ví dụ, "Hello".IndexOf("Z")
trả về một giá trị ma thuật -1
. Nó có thể làm cho nó dễ dàng hơn (phải không?) Để thao túng kết quả:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
thay vì sử dụng cấu trúc tùy chỉnh:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
nhưng không trực quan chút nào Tại sao -1
và không -123
? Một người mới bắt đầu cũng có thể nhầm tưởng rằng điều đó 0
có nghĩa là "Không tìm thấy" quá hoặc chỉ gõ nhầm (position >= 0)
.
3. Bối cảnh
Nếu mã của bạn liên quan đến thời gian chờ trong ổ cắm mạng, sử dụng thứ gì đó được mọi người sử dụng trong nhiều thập kỷ vì mục đích nhất quán không phải là ý tưởng tồi . Đặc biệt, 0
trong một khoảng thời gian chờ rất rõ ràng: đó là một giá trị không thể bằng không. Sử dụng một lớp tùy chỉnh trong trường hợp này có thể khiến mọi thứ trở nên khó hiểu hơn:
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; }
}
- Tôi có thể đặt
Duration
thành 0 nếu IsTimeoutEnabled
là đúng không?
- Nếu
IsTimeoutEnabled
sai, điều gì xảy ra nếu tôi đặt Duration
thành 100?
Điều này có thể dẫn đến nhiều sai lầm. Hãy tưởng tượng đoạn mã sau:
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();
Các hoạt động trong mười giây. Bạn có thể thấy những gì sai với mã này, mà không cần đọc tài liệu của Timeout
lớp không?
Phần kết luận
null
thể hiện tốt ý tưởng rằng giá trị không có ở đây. Nó không được cung cấp. Không có sẵn. Đó không phải là một số, cũng không phải là một chuỗi 0 / trống hoặc bất cứ điều gì. Đừng sử dụng nó cho các giá trị tối đa hoặc tối thiểu.
int.MaxValue
có liên quan mạnh mẽ đến chính ngôn ngữ. Không sử dụng int.MaxValue
cho giới hạn tốc độ tối đa của Vehicle
lớp hoặc tốc độ tối đa chấp nhận được đối với máy bay, v.v.
Tránh các giá trị ma thuật như -1
trong mã của bạn. Chúng gây hiểu lầm và dẫn đến sai lầm trong mã.
Tạo lớp của riêng bạn, điều này sẽ đơn giản hơn, với các giá trị tối thiểu / tối đa được chỉ định. Ví dụ VehicleSpeed
có thể có VehicleSpeed.MaxValue
.
Không tuân theo bất kỳ hướng dẫn nào trước đây và sử dụng các giá trị ma thuật nếu đó là quy ước chung trong nhiều thập kỷ trong một lĩnh vực rất cụ thể, được sử dụng bởi hầu hết mọi người viết mã trong lĩnh vực này.
Đừng quên kết hợp các phương pháp. Ví dụ:
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.
Bạn có thể tạo loại của riêng bạn bao gồm vô cực. Ở đây, tôi chỉ nói về int
loại bản địa .