Kokį kiečiausią programavimo triuką mokate?
Nu tai pradėsiu nuo tokio gana paprasto pavyzdžio.
Čia yra (by far) dažniausiai naudojama iš mano asmeninės bibliotekos funkcijų.
Pilnoje formoje (Scala) ji atrodo taip:
Bet čia viskas atrodo žymiai sudėtingiau, nei iš tiesų yra (dėl generic klasės naudojimo ir klaidų tikrinimo).
Jei skaičiuojate vien Double tipo skaičiais, ir nebijote gauti division by zero klaidą, galima supaprastinti iki tokios formos:
Funkcija daro labai paprastą dalyką. Paima skaičių value ir jį "normalizuoja" iš intervalo [oldMin; oldMax] į [min; max].
Pvz:
Visai paprasta funkcija, kurią naudoju beveik kiekvieną kartą, kai reikia kažką skaičiuoti. Pvz., verčiant iš vienų vienetų į kitus, perskaičiuojant spalvų komponentus, keičiant koordinačių mastelį ir pan.
Čia yra (by far) dažniausiai naudojama iš mano asmeninės bibliotekos funkcijų.
Pilnoje formoje (Scala) ji atrodo taip:
Code: Select all
def normalize[A](value: A, oldMin: A, oldMax: A, min: A, max: A)
(implicit num: Fractional[A]): A = {
require(!num.equiv(oldMax, oldMin), "oldMax cannot be equal to oldMin")
min + (value - oldMin) * (max - min) / (oldMax - oldMin)
}
Jei skaičiuojate vien Double tipo skaičiais, ir nebijote gauti division by zero klaidą, galima supaprastinti iki tokios formos:
Code: Select all
def normalize(value: Double, oldMin: Double, oldMax: Double, min: Double, max: Double): Double = {
min + (value - oldMin) * (max - min) / (oldMax - oldMin)
}
Funkcija daro labai paprastą dalyką. Paima skaičių value ir jį "normalizuoja" iš intervalo [oldMin; oldMax] į [min; max].
Pvz:
Code: Select all
scala> normalize(0.5, 0.0, 1.0, 2.0, 4.0)
res2: Double = 3.0
Code: Select all
while (true) {
mail("geriausias@draugas.lt", "Su šv. Kalėdom!", "Sveikinu!!!");
}
- naudojant C++, yra tokių ir kitokių klaidų gaudymo automatinis mechanizmas (catch). Tiesa, kartais tenka ir pačiam "pagaudyti", jei nori išskirtinės reakcijos.Vilius wrote: ↑2018-04-03 16:27Jei skaičiuojate vien Double tipo skaičiais, ir nebijote gauti division by zero klaidą, galima supaprastinti iki tokios formos:Code: Select all
def normalize(value: Double, oldMin: Double, oldMax: Double, min: Double, max: Double): Double = { min + (value - oldMin) * (max - min) / (oldMax - oldMin) }
- gaila, bet "true" jau pasibaigė..
Paaiškinimas: atėjo atėjistas į laisvus serverius ir uždraudė tokį "true"!
Code: Select all
if ("atėjo atėjistas į laisvus serverius ir uždraudė tokį true!" instanceof MedinisBajeris) {
throw new ThreadDeath();
}
Kol kas nesu aptikęs nieko kiečiau už šitą triuką (radau lolphp reddite):
Compute exponents easily with this one weird trick!
https://3v4l.org/QdXOv
Compute exponents easily with this one weird trick!
https://3v4l.org/QdXOv
Sejanus, taip ir nesupratau kaip veikia tas tavo PHP pavyzdys.. Bet man labiau patinka praktiški programavimo triukai.
Šiaip visa Scalos kolekcijų biblioteka yra beveik meno kūrinys. Tačiau kiečiausias triukas, kurį moku padaryti jų pagalba yra šis.
Iš pradžių paprastas pavyzdys be mano triuko:
Čia kol kas nieko sudėtingo - tiesiog pereiname visus sąrašo someList elementus, ir su jais atliekame operaciją doSomethingWith. Čia man patinka gana lakoniška ir stebėtinai lanksti Scalos "foreach" interpretacija, bet tai galima padaryti ir su bet kuria kita programavimo kalba.
Tačiau yra viena problema. Šis kodas naudotų tik vieną procesoriaus threadą, kas yra truputį neefektyvu, kai pvz. mano procesorius gali lygiagrečiai vykdyti 8 threadus. Aišku, daugumoje programavimo kalbų būtų įmanoma kažkaip padalinti tą sąrašą, ir paleisti tuos gabalus ant atskirų threadų. Tačiau Scala gali tai padaryti nepaprastai lakoniškai - tiesiog panaudoja par metodą va taip:
Dabar mūsų kodas išnaudos visus procesoriaus threadus, kas daugumoje kompiuterių leis pagreitinti skaičiavimus iki kelių kartų.
Aišku, reikia būti atsargiam, kad doSomethingWith nenaudotų bendrų resursų su kitais threadais, ar ko nors neužlockintų, bet su trupučiu patirties galima nesunkiai to išvengti.
Aš šį triuką naudoju taip dažnai, kad net nebepamenu, kada paskutinį kartą esu rašęs paralelines programas įprastiniais būdais.
Šiaip visa Scalos kolekcijų biblioteka yra beveik meno kūrinys. Tačiau kiečiausias triukas, kurį moku padaryti jų pagalba yra šis.
Iš pradžių paprastas pavyzdys be mano triuko:
Code: Select all
someList.foreach { element =>
doSomethingWith(element)
}
Tačiau yra viena problema. Šis kodas naudotų tik vieną procesoriaus threadą, kas yra truputį neefektyvu, kai pvz. mano procesorius gali lygiagrečiai vykdyti 8 threadus. Aišku, daugumoje programavimo kalbų būtų įmanoma kažkaip padalinti tą sąrašą, ir paleisti tuos gabalus ant atskirų threadų. Tačiau Scala gali tai padaryti nepaprastai lakoniškai - tiesiog panaudoja par metodą va taip:
Code: Select all
someList.par.foreach { element =>
doSomethingWith(element)
}
Aišku, reikia būti atsargiam, kad doSomethingWith nenaudotų bendrų resursų su kitais threadais, ar ko nors neužlockintų, bet su trupučiu patirties galima nesunkiai to išvengti.
Aš šį triuką naudoju taip dažnai, kad net nebepamenu, kada paskutinį kartą esu rašęs paralelines programas įprastiniais būdais.
Tas mano pavyzdys buvo šiaip, pasišaipymas iš PHP. Ir iš triukų.
Iš duotų pavyzdžių tai atrodo, kad tu triukais laikai kažkokių programavimo kalbos featurų žinojimą ir protingą naudojimą. Man programavimo triukai visada asocijuodavosi su kažkokiu side effectų ar nedokumentuotų featurų smartassišku išnaudojimu kur reikia ir ypač kur nereikia. Iš serijos „žiūrėkit visi kaip moku!“ Ir už tokius triukus dažniausiai autoriams norėtųsi nagus nudaužyti. O kai debuginimui sugaišti 2+ valandas tai ir dar ką nors nudaužyti. Bet čia vėl gi labiau PHP „featuras“, dauguma kitų populiarių sistemų neturi net iš toli tokio kiekio side effectų, kuriuos visi smartassai galėtų išnaudoti savo triukams.
Iš duotų pavyzdžių tai atrodo, kad tu triukais laikai kažkokių programavimo kalbos featurų žinojimą ir protingą naudojimą. Man programavimo triukai visada asocijuodavosi su kažkokiu side effectų ar nedokumentuotų featurų smartassišku išnaudojimu kur reikia ir ypač kur nereikia. Iš serijos „žiūrėkit visi kaip moku!“ Ir už tokius triukus dažniausiai autoriams norėtųsi nagus nudaužyti. O kai debuginimui sugaišti 2+ valandas tai ir dar ką nors nudaužyti. Bet čia vėl gi labiau PHP „featuras“, dauguma kitų populiarių sistemų neturi net iš toli tokio kiekio side effectų, kuriuos visi smartassai galėtų išnaudoti savo triukams.