Apakah tidak disarankan untuk membuat fungsi yang pada dasarnya mengubah nama fungsi bawaan?

40

Saya bingung tentang fungsi min dan maks, dalam konteks tertentu.

Dalam satu konteks, saat Anda menggunakan fungsi untuk mengambil dua nilai yang lebih besar atau lebih kecil, tidak ada masalah. Sebagai contoh,

//how many autographed CD's can I give out?
int howManyAutographs(int CDs, int Cases, int Pens)
{
    //if no pens, then I cannot sign any autographs
    if (Pens == 0)
        return 0;

    //I cannot give away a CD without a case or a case without a CD
    return min(CDs, Cases);
}

Mudah. Tetapi dalam konteks lain, saya bingung. Jika saya mencoba menetapkan maksimum atau minimum, saya mendapatkannya mundur.

//return the sum, with a maximum of 255
int cappedSumWRONG(int x, int y)
{
    return max(x + y, 255); //nope, this is wrong
}

//return the sum, with a maximum of 255
int cappedSumCORRECT(int x, int y)
{
    return min(x + y, 255); //much better, but counter-intuitive to my mind
}

Apakah tidak disarankan untuk membuat fungsi saya sendiri sebagai berikut?

//return x, with a maximum of max
int maximize(int x, int max)
{
    return min(x, max);
}

//return x, with a minimum of min
int minimize(int x, int min)
{
    return max(x, min)
}

Jelas, menggunakan builtin akan lebih cepat tetapi ini sepertinya mikro optimasi yang tidak perlu bagi saya. Apakah ada alasan lain mengapa hal ini tidak disarankan? Bagaimana dengan proyek kelompok?

Devsman
sumber
72
Jika min dan maks merusak keterbacaan Anda, pertimbangkan untuk bertukar kemudian keluar untuk "jika" secara teratur. Terkadang ada baiknya menulis sedikit lebih banyak kode agar lebih mudah dibaca.
T. Sar - Pasang kembali Monica
23
dengan satu posting singkat Anda telah menghancurkan seluruh konsep "coding bersih". Saya salut kepada Anda, Tuan!
Ewan
21
Mungkin Anda dapat mempertimbangkan C ++ 11 std::clampfungsi atau sesuatu yang serupa.
rwong
15
Mungkin nama yang lebih baik adalah up_to(untuk min) dan at_least(untuk max)? Saya pikir mereka menyampaikan maknanya lebih baik daripada minimize, dll. Meskipun mungkin perlu beberapa saat untuk menyadari mengapa mereka berubah-ubah.
Warbo
59
mindan maxdan juga minimizedan maximizesama sekali nama yang salah untuk fungsi yang ingin Anda tulis. Default mindan maxlebih masuk akal. Anda sebenarnya HAMPIR memiliki nama fungsi yang tepat. Operasi ini disebut penjepitan atau pembatasan dan Anda telah menulis dua fungsi pembatasan. Saya sarankan capUpperBounddan capLowBound. Saya tidak perlu menjelaskan kepada siapa pun yang melakukan itu, sudah jelas.
slebetman

Jawaban:

120

Seperti yang telah disebutkan orang lain: jangan membuat fungsi dengan nama yang mirip dengan yang dibangun, perpustakaan standar atau fungsi yang banyak digunakan tetapi mengubah perilakunya. Dimungkinkan untuk membiasakan diri dengan konvensi penamaan bahkan jika itu tidak masuk akal bagi Anda pada pandangan pertama tetapi tidak mungkin untuk alasan tentang fungsi kode Anda setelah Anda memperkenalkan fungsi-fungsi lain yang melakukan hal yang sama tetapi memiliki nama mereka bertukar.

Alih-alih "membebani" nama-nama yang digunakan oleh perpustakaan standar, gunakan nama baru yang menyampaikan dengan tepat apa yang Anda maksud. Dalam kasus Anda, Anda tidak benar-benar tertarik pada "minimum". Sebaliknya, Anda ingin membatasi nilai. Secara matematis, ini adalah operasi yang sama tetapi secara semantik tidak cukup. Jadi mengapa bukan sekadar fungsi

int cap(int value, int limit) { return (value > limit) ? limit : value; }

yang melakukan apa yang dibutuhkan dan mengatakannya dari namanya. (Anda juga bisa menerapkan capdalam hal minseperti yang ditunjukkan pada timster 's jawaban ).

Nama fungsi lain yang sering digunakan adalah clamp. Dibutuhkan tiga argumen dan "klem" nilai yang disediakan ke dalam interval yang ditentukan oleh dua nilai lainnya.

int clamp(int value, int lower, int upper) {
    assert(lower <= upper);  // precondition check
    if (value < lower) return lower;
    else if (value > upper) return upper;
    else return value;
}

Jika Anda menggunakan nama fungsi yang dikenal secara umum, setiap orang baru yang bergabung dengan tim Anda (termasuk masa depan Anda kembali ke kode setelah beberapa saat) akan dengan cepat memahami apa yang sedang terjadi alih-alih mengutuk Anda karena telah membingungkan mereka dengan melanggar mereka harapan tentang nama fungsi yang mereka pikir tahu.

5gon12eder
sumber
2
Anda juga bisa menamainya getValueNotBiggerThan (x, limit) ini adalah pendekatan yang tepat, dan dengan kompiler yang layak, fungsinya akan digarisbawahi dan kode mesin yang dihasilkan akan persis sama dengan menggunakan built-in
Falco
20
@ Falco Saya akan mengatakan bahwa "topi" hampir merupakan sinonim untuk "mendapatkan nilai tidak lebih besar dari" tapi saya tidak akan mengecat gudang sepeda hari ini. ;-)
5gon12eder
1
clampdigunakan secara luas dalam semua jenis pemrosesan sinyal dan operasi serupa (pemrosesan gambar, dll), jadi itulah yang akan saya lakukan juga. Meskipun saya tidak akan mengatakan itu membutuhkan batas atas dan bawah: Saya sudah sering melihatnya hanya untuk satu arah juga.
Voo
1
Akan disebutkan clampjuga. Dan jika itu ditulis dengan benar, Anda bisa menggunakan batas infinity / infinity negatif ketika Anda hanya ingin itu terikat pada satu arah. Misalnya, untuk memastikan bahwa angka tidak lebih besar dari 255 (tetapi tidak ada batas bawah), Anda akan menggunakan clamp(myNumber, -Infinity, 255).
Kat
115

Jika Anda membuat fungsi seperti itu di mana minimize(4, 10)mengembalikan 10 , maka saya akan mengatakan bahwa tidak disarankan karena sesama programmer Anda dapat mencekik Anda.

(Oke, mungkin mereka tidak akan benar-benar mencekikmu sampai mati, tapi serius ... Jangan lakukan itu.)

Telastyn
sumber
2
Juga sepenuhnya mungkin adalah bahwa ketika Anda kembali bekerja pada kode ini dalam beberapa tahun, Anda sendiri akan menghabiskan beberapa jam mencoba untuk mencari tahu mengapa angka Anda salah ketika Anda memanggil meminimalkan ...
Paddy
Aww ... jawaban ini dulunya memiliki komentar yang sangat keren (dan sangat terpilih). (Itu juga komentar pertama pada jawabannya, yang membantu aliran humor.)
TOOGAM
Saya tetap ingin mendapatkan kartu punch dan mencoret DO NOT(dari "JANGAN Spindle, Lipat, atau Mutilate"). Seseorang yang menerapkan sesuatu seperti ini akan menerima kartu.
Clockwork-Muse
26

Mengasingkan suatu fungsi baik-baik saja, tetapi jangan mencoba mengubah arti dari istilah yang ada

Tidak apa-apa untuk membuat alias fungsi - perpustakaan umum melakukan itu sepanjang waktu .

Namun, itu ide yang buruk untuk menggunakan istilah dengan cara yang bertentangan dengan penggunaan umum, seperti contoh Anda di mana untuk pikiran Anda max dan min harus dibalik. Ini membingungkan bagi programmer lain, dan Anda akan merugikan diri sendiri dengan melatih diri Anda untuk terus menafsirkan istilah-istilah ini dengan cara yang tidak standar.

Jadi dalam kasus Anda, tinggalkan bahasa "mininum / maksimum" yang Anda anggap membingungkan dan buat kode Anda sendiri, mudah dimengerti.

Refactoring contoh Anda:

int apply_upper_bound(int x, int y)
{
    return min(x, y);
}


int apply_lower_bound(int x, int y)
{
    return max(x, y)
}

Sebagai bonus tambahan, setiap kali Anda melihat kode ini, Anda akan mengingatkan diri sendiri bagaimana min dan max digunakan dalam bahasa pemrograman Anda. Akhirnya, akan masuk akal di kepala Anda.

Tim Grant
sumber
4
Saya pikir Anda telah salah memahami penerapan mindan maxyang membingungkan OP. Ini saat mindigunakan untuk menetapkan batas atas tetap pada beberapa nilai. get_lower_valueakan sama berlawanan dengan intuisi dalam aplikasi ini. Jika saya memilih nama alternatif untuk operasi ini, saya akan menyebutnya supremum , meskipun saya tidak yakin berapa banyak programmer yang akan segera memahaminya.
leftaroundabout
3
@leftaroundabout: supremum dari set {1, 2} adalah 2, jadi jangan gunakan nama supremumuntuk fungsi get_lower_valueyang didefinisikan di atas hanya untuk memanggil min. Itu menyebabkan programmer berikutnya persis masalah yang sama seperti memanggilnya maximise. Saya sarankan menyebutnya apply_upper_bound, tapi saya tidak yakin itu sempurna. Ini masih aneh karena ia bekerja sama di mana saja di sekitar Anda meletakkan parameter, tetapi namanya menyiratkan bahwa salah satu parameter adalah "nilai" dan yang lainnya adalah "terikat", dan bahwa mereka entah bagaimana berbeda.
Steve Jessop
1
Saya pikir Anda pada dasarnya mengandalkan pembaca untuk tidak terlalu terbiasa dengan kata supremum, sehingga mereka mengambil makna Anda daripada makna bahasa Inggris. Tidak masalah untuk mendefinisikan jargon lokal ke kode Anda, tetapi jenis pertanyaannya adalah apa yang dilakukan ketika jargon yang Anda inginkan secara langsung bertentangan dengan makna yang sudah akrab, dan saya rasa saya pikir Anda masih melakukan itu (untuk beberapa versi "Bahasa Inggris" yang hanya relevan bagi mereka yang telah mempelajari mata pelajaran STEM)
Steve Jessop
3
Kebijakan "Mengasingkan fungsi ini baik-baik saja, tetapi jangan mencoba mengubah arti dari istilah yang ada" sempurna dan dinyatakan dengan indah. Kedua, gagasan bahwa Anda tidak boleh mengganti nama dengan cara yang membingungkan sehubungan dengan fungsi bawaan (dan: bahkan jika fungsi bawaan tidak disebutkan / bodoh / membingungkan) adalah ide yang sempurna. Contoh maks / mnt yang muncul di halaman ini, ini kebingungan total heh.
Fattie
1
OK, saya mengedit jawaban untuk menggunakan "apply_upper_bound" yang keduanya sesuai dengan alasan OP dan menghindari terminologi kelebihan muatan. Verbositas bukan masalah. Saya tidak bermaksud untuk menulis nama metode yang sempurna di sini, cukup tetapkan beberapa aturan dasar untuk memberi nama alias. OP dapat mengeditnya untuk apa pun yang menurutnya paling jelas dan ringkas.
Tim Grant
12

Saya suka pertanyaan ini. Mari kita jatuhkan itu.

1: Haruskah Anda membungkus satu baris kode?

Ya, saya bisa memikirkan banyak contoh di mana Anda mungkin melakukan ini. Mungkin Anda menerapkan parameter yang diketik atau menyembunyikan implementasi konkret di belakang sebuah antarmuka. Dalam contoh Anda, Anda pada dasarnya menyembunyikan panggilan metode statis.

Selain itu Anda dapat melakukan banyak hal dalam satu baris hari ini.

2: Apakah nama 'Min' dan 'Max' membingungkan

Iya nih! Mereka benar-benar! Seorang guru pengkodean yang bersih akan menamainya dengan nama "FunctionWhichReturnsTheLargestOfItsParameters" atau sesuatu. Untungnya kami memiliki dokumentasi dan (jika Anda beruntung) IntelliSense dan komentar untuk membantu kami agar siapa pun yang bingung dengan namanya dapat membaca tentang apa yang seharusnya mereka lakukan.

3: Jika Anda sendiri mengubah nama mereka menjadi sesuatu yang lain.

Yup, lakukanlah. Misalnya, Anda dapat memiliki:

class Employee
{
    int NumberOfHolidayDaysIShouldHave(int daysInLue, int maxAllowableHolidayDays)
    {
         // Return the number of days in lue, but keep the value under the max allowable holiday days!
         // Don't use max, you fool!!
         return Math.Max(daysInLue, maxAllowableHolidayDays)
    }
}

Itu menambah makna, dan penelepon tidak harus atau ingin tahu bagaimana menghitung nilai.

4: Jika Anda mengganti nama "min" menjadi "memaksimalkan"

Tidak!! kamu gila?! Tapi ya, pertanyaan tersebut menggarisbawahi poin bahwa orang yang berbeda membaca makna yang berbeda menjadi nama fungsi dan objek. Apa yang satu orang temukan jelas dan konvensional yang lain menemukan buram dan membingungkan. Itu sebabnya kami punya komentar. Anda sebaiknya menulis:

// Add x and y, but don't let it go over 255
s = min(x + y, 255);

Lalu ketika seseorang membaca

// Add x and y, but don't let it go over 255
s = max(x + y, 255);

mereka tahu Anda membuat kesalahan.

Ewan
sumber
6
Lucu! Dalam contoh Anda, Anda telah membuat kesalahan yang tepat terkait dengan op: Anda ingin jumlah liburan tidak lebih besar dari maxHolidays diizinkan, jadi Anda tidak perlu (a, b)
Falco
14
Jika kode bersih benar-benar menunjukkan bahwa nama-nama menggelikan seperti itu FunctionWhichReturnsTheLargestOfItsParametersadalah hal yang baik, saya tidak ingin bagian dari itu.
David Hammen
1
@ Falco lol oops !!!
Ewan
4
@ Davidvidam: itu tidak benar-benar, karena tidak ada gaya pemrograman nyata menempatkan kutil FunctionWhichReturnsdi depan setiap fungsi (yang tidak membuang pengecualian atau mengakhiri). Anda bisa berakhir dengan getMinimum, getLarger(atau getLargestdengan lebih dari 2 input), dengan mengikuti saran nyata di sepanjang baris bahwa (a) fungsi murni dan / atau "pengambil" harus menggunakan kutil get, (b) kata bahasa Inggris tidak boleh disingkat menjadi nama. Jelas itu terlalu bertele-tele bagi mereka yang memutuskan untuk memanggil fungsi-fungsi tersebut max.
Steve Jessop
1
ya, lihat komentar @ Falco. saya tidak bisa benar-benar memperbaikinya setelah itu!
Ewan
4

Tidak ada . Jangan membuat fungsi dengan nama sangat mirip dengan fungsi built-in, tetapi yang sebenarnya sebaliknya . Ini mungkin tampak intuitif bagi Anda, tetapi akan sangat membingungkan bagi pengembang lain, dan bahkan bagi diri Anda sendiri suatu saat nanti ketika Anda memiliki lebih banyak pengalaman.

Arti dari max"maksimum", tetapi pemahaman "intuitif" Anda adalah sesuatu seperti "maksimum". Tapi ini hanyalah pemahaman yang salah tentang fungsi, dan mengubah nama dari maxmenjadi maximumtidak mengkomunikasikan interpretasi Anda yang berbeda. Bahkan jika Anda sangat percaya bahwa perancang bahasa membuat kesalahan, jangan lakukan hal seperti ini.

Tetapi mengubah nama menjadi cap(x, limit)seperti yang disarankan akan baik-baik saja, karena itu jelas mengomunikasikan niat, bahkan jika itu hanya membungkus min.

JacquesB
sumber
3

Apa yang mungkin membingungkan Anda adalah menggunakan Capped dalam nama fungsi Anda atau pemahaman Anda tentang apa arti menempatkan topi. Ini adalah pembatas dan tidak memerlukan banyak hal.

Jika Anda ditanya yang terendah, terkecil, atau paling awal, apakah Anda merasa Max adalah fungsi yang tepat?

Biarkan minimal dan maks sendiri. Tulis tes sehingga setidaknya Anda akan memperbaikinya untuk kedua kalinya.

Jika Anda diharuskan untuk menggunakan fungsi-fungsi ini begitu banyak dalam proyek Anda, Anda akan menemukan semacam petunjuk untuk membantu Anda mengklarifikasi mana yang akan digunakan. Seperti <atau>, bagian mulut yang lebar menghadapi nilai yang lebih besar.

JeffO
sumber
1
+1 untuk kemungkinan kebingungan istilah sebagai masalah mendasar. Saya pikir kebingungan dimulai pada komentar "kembalikan jumlahnya, dengan maksimal 255", jadi dia pikir maxfungsinya lebih tepat, tetapi secara logika bijaksana minadalah hal yang sebenarnya dia cari.
Revenant
2

Untuk menjawab pertanyaan Anda: Apakah ada alasan lain mengapa hal ini tidak disarankan? Bagaimana dengan proyek kelompok? Masuk akal jika Anda menginginkan fungsi Anda sendiri, yang tidak masalah. Pastikan mereka berada di kelas pembantu Anda sendiri dan tidak mudah dipanggil untuk orang lain kecuali mereka mengimpornya. (Joes.Utilities.)

Tetapi untuk melihat kembali masalah Anda, pada dasarnya saya malah berpikir:

return (input >= 255) ? 255 : input;

Anda menjadi bingung karena Anda mencoba menerapkan logika otak Anda ke fungsi-fungsi min / max ini. Alih-alih hanya berbicara dalam bahasa Inggris. ifyang inputadalah greater than or equal to 255 then return 255sebaliknya returnyang input.

Yang mana:

if (input >= 255) {
   255 
} else {
   input
}

Pendapat saya. Anda menggunakan fungsi max \ min untuk alasan yang salah, kecepatan hal-hal ini dapat diabaikan. Lakukan apa yang masuk akal.

Layak7
sumber
1
Salah satu rekan kerja senior saya selalu berkata "Biarkan komputer melakukan pemikiran untuk Anda".
1

Sementara saya mengerti masalah Anda, saya akan enggan melakukan ini. Akan lebih baik untuk mengebor ke dalam tengkorak Anda apa yang dilakukan min () dan max ().

Kebanyakan programmer tahu apa fungsi min () dan max () - bahkan jika, seperti Anda, mereka kadang-kadang kesulitan dengan intuisi mereka untuk digunakan pada waktu tertentu. Jika saya membaca program dan melihat maks (x, y), saya langsung tahu apa fungsinya. Jika Anda membuat fungsi "alias" Anda sendiri, maka orang lain yang membaca kode Anda tidak akan tahu apa yang dilakukan alias ini. Mereka harus menemukan fungsi Anda. Itu tidak perlu mematahkan aliran membaca dan memaksa pembaca untuk melakukan pemikiran ekstra untuk memahami program Anda.

Jika Anda kesulitan menentukan yang akan digunakan pada titik tertentu, saya katakan, tambahkan komentar yang menjelaskannya. Kemudian jika pembaca yang akan datang juga sama bingungnya, komentar Anda harus jelas. Atau jika Anda salah tetapi komentar menjelaskan apa yang Anda coba lakukan, orang yang mencoba men-debug itu akan memiliki petunjuk.

Setelah Anda alias fungsi karena nama bentrok dengan intuisi Anda ... apakah ini satu-satunya kasus di mana itu masalah? Atau apakah Anda akan alias fungsi lain? Mungkin Anda bingung dengan "membaca" dan merasa lebih mudah untuk menganggapnya sebagai "menerima", Anda mengubah "tambahkan" menjadi "StringTogether", "bulat" menjadi "DropDecimals", dll, dll. Bawa ini ke ekstrem konyol dan program Anda tidak akan bisa dipahami.

Memang, bertahun-tahun yang lalu saya bekerja dengan seorang programmer yang tidak suka semua tanda baca dalam C. Jadi dia menulis banyak makro untuk membuatnya menulis "THEN" bukannya "{" dan "END-IF" bukannya "}" dan lusinan pergantian lainnya. Jadi ketika Anda mencoba membaca programnya, itu bahkan tidak terlihat seperti C lagi, rasanya seperti harus mempelajari bahasa yang sama sekali baru. Saya tidak ingat sekarang apakah "AND" diterjemahkan ke "&" atau "&&" - dan itu intinya. Anda merusak investasi yang dilakukan orang dalam mempelajari bahasa dan perpustakaan.

Yang mengatakan, saya tidak akan mengatakan bahwa fungsi yang tidak melakukan apa-apa selain memanggil fungsi perpustakaan standar tentu buruk. Jika titik fungsi Anda bukan untuk membuat alias, tetapi untuk merangkum perilaku yang kebetulan merupakan fungsi tunggal, ini bisa menjadi baik dan tepat. Maksud saya, jika secara logis dan tak terhindarkan Anda harus melakukan maks pada saat ini dalam program, maka panggil saja max secara langsung. Tetapi jika Anda harus melakukan beberapa perhitungan yang hari ini membutuhkan max, tetapi yang mungkin dimodifikasi di masa depan untuk melakukan sesuatu yang lain, maka fungsi perantara sesuai.

Jay
sumber
0

Tidak apa-apa untuk mengganti nama fungsi bawaan asalkan nama baru membuat kode Anda jauh lebih jelas dan tidak akan ketinggalan dipahami oleh siapa pun. (Jika Anda menggunakan C / C ++ jangan gunakan #define karena membuat sulit untuk melihat apa yang sedang terjadi.) Nama fungsi harus bertindak seperti komentar yang menjelaskan apa yang dilakukan kode panggilan dan mengapa itu dilakukan untuk .

Anda bukan satu-satunya orang yang memiliki masalah ini dengan min dan max, namun saya belum melihat solusi umum yang bagus yang bekerja di semua domain. Saya pikir satu masalah dengan penamaan fungsi-fungsi ini adalah bahwa kedua argumen memiliki makna logis yang berbeda, tetapi disajikan sebagai maknanya sama.

Jika bahasa Anda memungkinkan, Anda bisa mencoba

return  calculatedDiscount.ButNoMoreThen(maxAllowedDiscount)

return  CDsInStocked.ButNoMoreThen(CasesInStock)
Ian
sumber
0

Tidak.

Anda tidak menulis pembungkus Anda. Nama-nama pembungkus itu tidak terlalu signifikan.

Apa yang Anda coba lakukan adalah kode kebingungan. Anda menciptakan lapisan tambahan yang melayani 2 tujuan:

  1. Orang lain tidak dapat memahami kode Anda.
  2. Anda tidak pernah belajar memahami kode orang lain.

Dengan menyembunyikan hal-hal yang membuat Anda tidak nyaman, Anda hanya menyakiti kode Anda sekarang dan diri Anda sendiri di masa depan. Anda tidak dapat tumbuh dengan tinggal di zona nyaman Anda. Yang Anda butuhkan adalah belajar bagaimana mindan maxbekerja.

Agent_L
sumber
-1

Tidak apa-apa, dan tidak terlalu berlawanan dengan intuisi untuk menggunakan Min, Max untuk mengendalikan lebih dan undershoot. Ini juga dilakukan dengan menggunakan:

  • lantai () dan langit-langit ()
  • penjepit, batas, batas
  • dan tentu saja mod dengan pemotongan urutan tinggi.

Dalam firmware tanggal kembali lebih jauh dari MMX, yang itu sendiri sebelum grafis 3D modern yang bergantung pada extensivley ini.

Mengganti fungsi standar industri bahkan secara lokal akan membuat saya khawatir, nama turunannya mungkin lebih baik. Siswa C ++ mungkin kelebihan beban karena kelasnya yang tidak jelas.

mckenzm
sumber
Maaf, ada apa dengan MMX?
Tobia Tesan
Saya sedang memikirkan "nilai jenuh", di mana hasilnya dibatasi pada batas. Idenya adalah kode bisa lebih sederhana jika tidak harus menyertakan tes batas dan melimpah (dalam grafik untuk menghindari bersepeda atau menjadi positif dengan melakukan perjalanan melewati batas negatif). PSUBSB / PSUBSW. Saya mengakui bahwa mekanismenya mungkin tidak sama, tetapi efek dan maksud fungsinya adalah.
mckenzm
-1

Tidak apa-apa dalam beberapa kasus, tetapi tidak dalam contoh Anda, karena ada cara yang lebih baik untuk kata itu:
saturate, clamp, clip, dll

Mehrdad
sumber
-1

Saya lebih suka membuat fungsi generik bernama 'terikat'

//Assumes lower_bound <= upper_bound
template <typename T>
T bounded(T value, T lower_bound, T upper_bound){
    if (value < lower_bound)
        return lower_bound;
    if (value > upper_bound)
        return upper_bound;
    return value;
}

//Checks an upper (by default) or lower bound
template <typename T>
T bounded(T value, T bound, bool is_upper_bound = true){
    if (is_upper_bound){
        if (value > bound)
            return bound;
    }
    else {
        if (value < bound)
            return bound;
    }
    return value;
}

atau dengan penggunaan 'min' dan 'max'

//Assumes lower_bound <= upper_bound
template <typename T>
T bounded(T value, T lower_bound, T upper_bound){
    return max(min(value, upper_bound), lower_bound);
}

//Checks an upper (by default) or lower bound
template <typename T>
T bounded(T value, T bound, bool is_upper_bound = true){
    if (is_upper_bound)
        return min(value, bound);
    else
        return max(value, bound);
}
David Ferrer
sumber
-1

Bagaimana dengan memanggil fungsi Anda:

atmost(x,255): kembalikan paling rendah dari x atau 255 paling banyak.

atleast(10,x): kembalikan yang lebih tinggi dari x atau setidaknya 10.

Bulrush
sumber
-1

min(x+y, MAX_VALUE); akan membawa makna lebih dari myCustomFunction(x, y);

Jadi jawabannya adalah YA, itu tidak disarankan . Ini hanya berfungsi sebagai alias untuk bahasa otak Anda.

Percikan
sumber