تربیت - Kotlin
Publié le 12 May 2022
ذہنی نقشہ

فنکشنل پروگرامنگ
اس کتاب سے مشقیں لی گئی ہیں:
ٹوٹوریلز کے ذریعے کاتلن میں فنکشنل پروگرامنگ
ماسیمو کارلی نے لکھا
ریپو: https://github.com/kodecocodes/fpk-materials
سینٹکس
پہلا پروگرام ٹیسٹ
مفاهیم: اسکرین ڈسپلے، فنکشن
پہلا پروگرام ٹیسٹ:https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/FirstProgramTest.kt[( empty )]+
ConcatFunctionTest
مفہومات: مِمیری، متغیر، قيمة، کائنہ، فانکشن کی توسیع
ExampleUnitTest:https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/ConcatFunctionTest.kt[مصدر](Empty)
BirthdayMessageTestOutput
تصورات: مجموعیتی، لوپ
کاتلن کا تعارف
سالگرہ پیغام ٹیسٹ آؤٹ :https://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/programming/BirthdayMessageTestOutput.kt[مصدر]+
کotlin کا کورس
جاوے میں کالجیکشنز پر ٹوٹوریال
کلیکشن انٹرفیسز کا دل
تصویر:../../img/0036_training_kotlin_post/colls-coreInterfaces.gif[Collections]
فوادlı بنیادیات
اعلانی X امری طریقہ
package functional
import kotlin.test.Test
import kotlin.test.assertEquals
class DeclarativeTests {
val input = listOf(
"123", "abc", "1ds", "987", "abdf", "1d3", "de1", "88", "101"
)
fun imperativeSum(list: List<String>): Int {
var sum = 0
for (item in list) {
try {
sum += item.toInt()
} catch (_: NumberFormatException) {
}
}
return sum
}
@Test
fun `test imperative approach`() {
imperativeSum(input).run {
println("Sum $this")
assertEquals(1299, this)
}
}
fun isValidNumber(s: String) = try {
s.toInt()
true
} catch (_: NumberFormatException) {
false
}
fun declarativeSum(list: List<String>) = list
.filter(::isValidNumber)
.map(String::toInt)
.sum()
@Test
fun `test declarative approach`() {
assertEquals(1299, declarativeSum(input).apply {
println("Sum $this")
})
}
}
تمرین 1.1
فنکشن sumInRange ملاحق کریں جس کے ذریعے قيومات کو جمع کیا جاتا ہے
محدد فاصلے میں ایک List<String>۔ Signature :
fun sumInRange(input: List<String>, range: IntRange): Int
@Test
fun `Exercise 1_1`() {
assertEquals(4, sumInRange(
listOf("1", "10", "a", "7", "ad2", "3"),
1..5
).apply { println("sumInRange 1..5: $this") }
)
}
اسے امتحان کریں اور اپنے جواب کی جانچ کے ساتھ کریںhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/DeclarativeTests.kt[حل, windows="_blank].
عالی درجے کی functions
package functional
import java.io.ByteArrayOutputStream
import java.io.PrintStream
import java.lang.System.*
import java.lang.Thread.sleep
import kotlin.math.sign
import kotlin.test.Test
import kotlin.test.assertEquals
class BasicsHOFTests {
val ONE_SECOND = 1000L
@Test
fun `high order function`() {
//capture de la sortie standard
val standardOut: PrintStream? = out
val outputStreamCaptor = ByteArrayOutputStream()
setOut(PrintStream(outputStreamCaptor))
3.times { println("Hello") }
assertEquals(
buildString {
repeat(3) { append("Hello\n") }
deleteAt(length - 1)
}, outputStreamCaptor
.toString()
.trim()
)
//libération de la sortie standard
setOut(standardOut)
}
fun Int.times1(fn: () -> Unit) {
for (i in 1..this) {
fn()
}
}
fun Int.times2(fn: () -> Unit) {
for (i in 1..this) fn()
}
fun Int.times3(fn: () -> Unit) =
(1..this).forEach { fn() }
fun Int.times4(fn: () -> Unit) =
repeat((1..this).count()) { fn() }
fun Int.times(fn: () -> Unit) =
(1..this).forEach { _ -> fn() }
}
سرگرمی 1.2
Chrono کو آمد کریں، جو ایک قسم کی تابع کو قبول کرتا ہے`() →`
یونٹ اندر آتا ہے اور اسے چلانے میں لگنے والے وقت کو واپس کرتا ہے۔ ہدایت:
fun chrono(fn : () -> Unité) : Long
@Test
fun `Exercise 1_2`() {
val waitOneSec = { sleep(ONE_SECOND) }
chrono(waitOneSec).apply {
println("chrono: $this")
assertEquals(1, sign)
}
}
اس کی کوشش کریں اور اپنے جواب کی جانچ کریں ساتھhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/BasicsHOFTests.kt[حل، windows="_blank].
ترکیب
package functional
import kotlin.test.Test
import kotlin.test.assertEquals
fun double(x: Int): Int = 2 * x
fun square(x: Int): Int = x * x
fun squareAndDouble1(x: Int) = double(square(x))
infix fun <A, B, C> ((A) -> B).compose(g: (B) -> C)
: (A) -> C = { a -> g(this(a)) }
class CompositionTests {
@Test
fun composition_impure() {
assertEquals(200, double(square(10)))
assertEquals(200, squareAndDouble1(10))
}
@Test
fun composition_pure() {
val squareAndDouble = ::square compose ::double
assertEquals(200, squareAndDouble(10))
}
}
صاف وظائف اور اختبار کی قابلیت
package functional
import java.io.ByteArrayOutputStream
import java.io.PrintStream
import java.lang.System.out
import java.lang.System.setOut
import kotlin.test.Test
import kotlin.test.assertEquals
var count = 0
//impure car une variable global subit un effet de bord
fun impure(value: Int): Int {
count++
return value + count
}
//impure car utilisation de la sortie standard qui fait muter le system
fun addOneAndLog(x: Int): Int {
val result = x + 1
println("New Value is $result")
return result
}
//pure
fun addOne(x: Int) = (x + 1).run {
Pair(this, "New Value is $this")
}
class PureTests {
@Test
fun `impure fonction`() {
assertEquals(3, impure(2))
val standardOut = out
val outputStreamCaptor = ByteArrayOutputStream()
setOut(PrintStream(outputStreamCaptor))
addOneAndLog(3)
assertEquals(
"New Value is 4",
outputStreamCaptor
.toString()
.trim()
)
setOut(standardOut)
}
@Test
fun `pure fonction`() {
addOne(3).run {
assertEquals(4, first)
assertEquals("New Value is 4", second)
}
}
}
استثناء کی معالجہ
package functional
import org.junit.jupiter.api.assertThrows
import kotlin.Result.Companion.failure
import kotlin.Result.Companion.success
import kotlin.test.Test
import kotlin.test.assertEquals
//NumberFormatException est un effet de bord qui rend la fonction impure
fun strToInt(str: String) = str.toInt()
//pure
fun strToIntOrNull(str: String) = try {
str.toInt()
} catch (nfe: NumberFormatException) {
null
}
//pure avec gestion de l'exception plus élégante
fun strToIntResult(str: String): Result<Int> =
try {
success(str.toInt())
} catch (nfe: NumberFormatException) {
failure(nfe)
}
class ExceptionHandlingTests {
@Test
fun impure() {
assertThrows<NumberFormatException> { strToInt("foo") }
assertEquals(1, strToInt("1"))
}
@Test
fun pure() {
assertEquals(null, strToIntOrNull("foo"))
assertEquals(1, strToIntOrNull("1"))
}
@Test
fun `pure avec result`() {
assertEquals(1, strToIntResult("1").getOrNull())
assertEquals(
"For input string: \"foo\"",
strToIntResult("foo")
.exceptionOrNull()
?.message
)
}
}
اہم نکات
-
آبجیکٹ اورینٹڈ پروگرامنگ کا مطلب آبجیکٹس کے ساتھ پروگرامنگ کرنا ہے،
فنکشنل پروگرامنگ کا مطلب فنکشن کے ساتھ پروگرامنگ کرنا ہے۔ آپ ایک مسئلے کو کئی جزئی مسئلے میں تقسیم کرتی/ครตえ، جسے آپ ماذلینگ کرتی/ครطえ کے ساتھ فنگشنز.
-
اوپر‑ارٹیڈ فنکشنز دوسرے فنکشنز کو انپٹ کے طور پر قبول کرتے ہیں یا دیگر فنکشنز واپس کر دیتے ہیں.
وہ واپسی کے قيمتیں کے طور پر کام کرتے ہیں۔ Catagoriya ki nazriya tashkeel ki nazriya hai, aur aap isay samajhne ke liye istemaal karte hain کسی کام کے پروگرام میں اپنی فنگشنز کیسے بنائیں۔ ایک صاف فنکشن کیخراجی قیمت صرف اس کے ورودی متغیرات پر منحصر ہوتی ہے، اور یہ اس کے جانبی اثرات نہیں ہیں.
-
ایک جانبی اثر ایک چیز ہے کہ ایک فنکشن باہری دنیا پر اثرانداز کرتی ہے۔ یہ
یہ سٹینڈرڈ آؤٹ پٹ پر لاگ ہو سکتا ہے یا ایک گلوابل متغیر کی قیمت تبدیل کر سکتا ہے۔ فنگشナル پروگرامنگ صاف-functions کے لیے کام کرتی ہے، لیکن یہ مزید بھی فراہم کرتی ہے غير صاف وظائف کو صاف وظائف میں تبدیل کرنے والے اوزار آپ ایک غیئر صاف فنکشن کو صاف بن سکتے ہیں اس کے اثرات کو جگہ بدل کر انہیں صاف بنانے کے لئے リオٹر کی مقدار کا حصہ。
-
فنکشنل پروگرامنگ ترکیب کا مسئلہ ہے.
غلطیوں کا انتظام ایک معیاری جانبی اثرات کا مثال ہے، اور کوٹلن آپ کو اوزارے دیتا ہے انہیں کاراً طور پر منیج کرنے کے لئے۔
جاوا 8 کا تفصیلی مطالعہ : lambdas expressions اور functional interfaces
اقسام نظریہ
ریاضیاتی نظریہ کیات:
فونکشنز کے بنیادی اصول
مشق 2.1
کیا آپ ایک فنکشن کا مثال لکھ سکتے ہیں جو منفرد قدرتیں map کرتا ہے؟
جس کا دائرہ کار رینج میں غیر مختلف قیمتیں رکھتا ہے، جیسے f(b) اور f(c) Neeche di gayi tasveer میں؟
اسے کوشش کریں، پھر چیلنج پروجیکٹ کا جائزہ لیں تاکہ آپ دیکھ سکیں کہ آپ نے کس طرح کام کیا۔
آپ لائن پر جانے سے مشورہ اور وضاحت ملے گی جس کی طرف حل.
مشق 2.2
کیا آپ دو ضرب کرنے کی معکوس fonction لکھ سکتے ہیں؟
معکوس فنکشن کے ڈومین اور رینج کیا ہیں؟
چیلنج پروجیکٹ اور ضمیمہ B دیکھیں حل کے لیے۔
fun chrono(fn : () -> Unité) : Long
@Test
fun `Exercise 1_2`() {
val waitOneSec = { sleep(ONE_SECOND) }
chrono(waitOneSec).apply {
println("chrono: $this")
assertEquals(1, sign)
}
}
اسے کوشش کریں اور اپنے جواب کی جانچ کریں کے ساتھhttps://github.com/cheroliv/cheroliv.com/blob/master/codes/src/test/kotlin/functional/BasicsHOFTests.kt[حل, windows="_blank].