đây có thể là đổ xe đạp , nhưng có lẽ tôi đang thiếu điều gì đó thú vị...
Nếu một lớp khởi tạo một thành viêngiá trị
至 std::numeric_limits::infinity()
Sau đó muốn kiểm tra xem val đã được thay đổi thành thứ gì đó hợp lệ (+/- inf không hợp lệ ở đây hay chưa), sự đánh đổi của 3 cách tiếp cận này là gì và tôi có bỏ lỡ bất kỳ cách thú vị nào khác để giải quyết vấn đề này không. (Const đã bị xóa để dễ đọc trong các ví dụ.)
bool IsInit() { return MinX != std::numeric_limits::infinity() } // a
bool IsInit() { return !std::isinf(MinX); } // b
bool IsInit() { return std::isfinite(MinX); // c
Mã hiện tại là C++03, nhưng các tùy chọn sẽ thay đổi như thế nào với C++11, C++14 và C++17. Ví dụ: sử dụng C++17, mã này có thể chỉ là std::tùy chọn giá trị
.Hoặc nếu +/-inf có sẵn trong tương lai, liệu NaN yên tĩnh có phải là lựa chọn an toàn hơn không?
Đây là những gì xuất hiện khi tôi đọc bản vá cho mã này:
Để dễ tham khảo:
Sắp xếp liên quan:
Việc sử dụng các giá trị đặc biệt này làm cờ khởi tạo chỉ hoạt động nếu biến không thể nhận được giá trị đặc biệt. Theo toán học, không khó để có được vô cực vì tràn cũng có được. Vì vậy, điều này có thể có vấn đề. Nếu hằng số duy nhất là người dùng không thể đặt giá trị dấu phẩy động này thành giá trị này thì việc sử dụng NaN yên tĩnh nếu có sẽ dễ dàng hơn.
Trong ba phương thức, chỉ có phương thức "a" khớp chính xác với giá trị ban đầu. Vì vậy, đây là cách tiếp cận chính xác nhất nếu bất biến là phương pháp chỉ biểu thị giá trị khởi tạo. Tất nhiên, không có phương pháp nào trong số này có tác dụng bảo vệ bất biến ngay từ đầu, tôi quan tâm hơn đến việc: liệu bất biến đó có thể được thực thi một cách hiệu quả hay không.
Mặc dù đây không phải là trang web đánh giá mã nhưng chỉ cần liên kết các chỉnh sửa mã tới OGREnvelope
Còn về lớp trên github (hình như chỉ là AABB thôi), mình nghĩ có một số điểm cần lưu ý:
IsInit
- dựa trên mã của nó - dường như nhằm trả về xem AABB có thực sự được người dùng đặt hay không. Không phải là nó ở trong một vị trí mà có thể nói rằng nó là IsInit
Trạng thái/giá trị ban đầu được đề xuất (và khiến tôi tin tưởng). Cá nhân tôi thích Có hợp lệ
Một cái tên như vậy cho bài kiểm tra này.
- Về bản chất thực sự của các bất biến, bản thân các biên tập viên dường như nhận ra rằng AABB hợp lệ sẽ không bao giờ có
MinX
. lớn hơn MaxX
Cũng không phải giá trị của Y
lớn hơn MaxY
.Nói cách khác, chúng không bao giờ được đảo ngược trong AABB hợp lệ. MinX
Luôn luôn nhỏ hơn hoặc bằng MaxX
(Tương tự với các biến Y tối thiểu và tối đa).
- Việc sử dụng các giá trị vô cực ngược như bây giờ giúp: (a) dễ dàng tăng AABB hơn để bao gồm các AABB khác (được chỉnh sửa để thể hiện ý tôi bằng cách giảm các dòng mã từ 14 xuống 4 (b) giúp dễ xử lý hơn); hơn là sử dụng
tối đa()
Phạm vi AABB hiệu quả rộng hơn. Và thấp nhất()
Giá trị (giá trị) xem.
MinX
sự thật, MaxX
, Y
, MaxY
Các biến thành viên có thể truy cập công khai có nghĩa là IsInit
Bản thân các bất biến chỉ mang tính chất tư vấn vì không có sự đóng gói để bảo vệ các bất biến.
Trong bối cảnh rộng hơn của việc lưu ý những điều này, NaN là không phù hợp. Bất biến không bao giờ đúngMinX != std::numeric_limits::infinity()
.Và IsInit
(được triển khai trong mã này) tốt nhất là không đầy đủ. nơi nó được đổi tên thành một cái gì đó như Có hợp lệ
Trong ngữ cảnh của , thì cách triển khai nhất quán hợp lý hơn là:
bool IsValid() const
{
return !std::isnan(MinX) && !std::isnan(MinY) && MinX <= MaxX && MinY <= MaxY;
}
Với việc triển khai này, AABB hiệu quả sẽ được OGREnvelope
Các giá trị đều là số hợp lệ (không có NaN) và giá trị tối thiểu phải nhỏ hơn hoặc bằng giá trị tối đa tương ứng của X và Y.
Tôi là một lập trình viên xuất sắc, rất giỏi!