2009-02-05 69 views
23

Tôi thấy rằng tôi thường xuyên viết một hàm mà tôi luôn gọi là "clamp()", đó là loại kết hợp của min()max(). Có một tiêu chuẩn, "kinh điển" tên cho chức năng này?Có tên "chuẩn" cho hàm kết hợp min() và max() không?

Nó luôn luôn trông giống như sau:

function clamp($val, $lower, $upper) 
{ 
    if ($val < $lower) 
    return $lower; 
    else if ($val > $upper) 
    return $upper; 
    else 
    return $val; 
} 

Hoặc đơn giản là sử dụng built-in min()max() chức năng:

function clamp($val, $lower, $upper) 
{ 
    return max($lower, min($upper, $val)); 
} 

Biến thể tồn tại: Bạn cũng có thể kiểm tra đầu vào không hợp lệ, nơi lower > upper, và ném một ngoại lệ hoặc đảo ngược đầu vào. Hoặc bạn có thể bỏ qua thứ tự của các đầu vào và gọi nó là hàm trung bình-ba, nhưng điều đó có thể gây nhầm lẫn.

+0

Tôi muốn tránh cho các tham số của bạn có cùng tên với các hàm được sử dụng, đặc biệt khi chúng không được sử dụng trong các cặp phù hợp (ví dụ: $ min được sử dụng với max() và ngược lại). Có lẽ là $ lower và $ upper, thay vào đó. –

+0

@ BenBlank: ý tưởng hay. chỉnh sửa các câu hỏi – Kip

+0

Tôi sử dụng tên InRange() nhưng bình luận của tôi không phải là về tên, nó là về thứ tự của các tham số. Tôi tìm thấy nó dễ dàng hơn để đọc: InRange (min, giá trị, tối đa) hơn (giá trị, min, max) –

Trả lời

35

kẹp là một cái tên tốt.

Hãy để chúng tôi làm cho nó trở thành tiêu chuẩn.

+2

Dường như là tiêu chuẩn (ít nhất là trong đồ họa) đã có: http://en.wikipedia.org/wiki/Clamping_%28graphics%29 –

+0

Hmm .. có lẽ tôi đã chọn "kẹp" tại một số điểm và quên nơi tôi đã nhận từ .. – Kip

+0

Loại tên tuyệt vời sau khi tôi hiểu nó là gì. Cộng một với tiêu chuẩn. – Rodrigo

0

Tôi chỉ muốn đi cho một tên hàm "rangeCheck"

+1

không tốt, rangeCheck âm thanh như nó CHECKS. Nhưng những gì nó làm là THAY ĐỔI các giá trị nằm trong một phạm vi. – Thorsten79

5

Trong một số ngôn ngữ bạn có chức năng giới hạn

num = giới hạn (val, min, max)

3
clip(val, lo, hi) 
0

trung bình

Bởi vì nó khái quát những giá trị hơn.

+1

Đây không phải là tìm thông tin thống kê về tập hợp mẫu. Đó là về việc buộc một số phải nằm trong một phạm vi cụ thể. – MSN

+2

@MSN: kỹ thuật trung bình (val, min, max) sẽ làm điều tương tự như kẹp (val, min, max). cộng với, thứ tự của các tham số đến trung bình() sẽ không thành vấn đề. nhưng điều đó không rõ ràng ngay lập tức (ít nhất, nó không phải với tôi). – Kip

+0

Trung bình có lợi thế là tự mô tả. Bạn lấy lại phần tử trung bình. Ví dụ: "kẹp" có ném ngoại lệ nếu min của tôi nhỏ hơn số tối đa của tôi không? Trong trường hợp đó, đối số nào là min? Đầu tiên hay thứ hai? Những chi tiết này có thể thay đổi từ nơi này sang nơi khác. –

1

Chúng tôi sử dụng pin tại đây. Trên thực tế, chúng tôi sử dụng pin cho các phạm vi đơn giản và clamp cho các nội dung khác.

0

Điều gì về bị ràng buộc?

bound(min, val, max) 

Hoặc constrain?

constrain(val, min, max) 
0

Bạn nghĩ gì về những thứ như InRangeClosestTo (Number, RangeLowerBound, RangeUpperBound), hoặc ClosestInRange (Number, LowerBoundOfRange, UpperBoundOfRange)? Họ có nghĩa là 'Hãy cho tôi yếu tố của phạm vi gần nhất với con số', như tôi hy vọng là hiển nhiên.

Khái niệm này là chính xác hơn một kẹp mà vâng có hai mặt nhưng không nhiều hơn, hoặc một Hạn chế hoặc ràng buộc mà có thể không muốn quay trở lại bất cứ điều gì nếu số không nằm trong phạm vi,

Đối với tôi họ rõ ràng hơn những phần còn lại tôi thấy; mặc dù nó có thể mất một vài giây để hiểu chúng, bạn chỉ cần phải lý do về tên, và ít nhất có một cái nhìn ngắn gọn tại các bình luận để xác nhận; và nó đẹp khi bạn thấy nó chính xác như thế nào (nó chính xác, đúng không?).

Bạn có thể chỉ có nghi ngờ về việc phạm vi có bao gồm hay không, nhưng tôi nghĩ hầu hết mọi người sẽ cho rằng nó được bao gồm chính xác. Hoặc bạn có thể sử dụng InInclRangeClosestTo và InExclRangeClosestTo, mặc dù tôi không thấy nhiều công dụng cho các phạm vi độc quyền.

Tất nhiên bạn cần có IDE tự động hoàn thành nếu bạn muốn sử dụng chúng.

Các vấn đề liên quan