Sparround

Scope functions və extension functions

Scope functions (let, run, with, apply, also) obyekt üzərində müvəqqəti scope açır. Hamısı eyni işi görmür — iki oxla fərqlənirlər: obyektə necə müraciət olunur (it yoxsa this) və nə qaytarılır (lambda nəticəsi yoxsa obyektin özü).

Extension functions mövcud class-a onun kodunu dəyişmədən funksiya "əlavə edir": fun String.toMasked(): String. Əslində static utility funksiyadır — statik dispatch olunur, real üzv deyil və private sahələrə çıxışı yoxdur.

FunksiyaObyektQaytarırTipik istifadə
`let``it`Lambda nəticəsiNull yoxlaması: `x?.let { ... }`
`run``this`Lambda nəticəsiObyekt üzərində hesablama
`with``this`Lambda nəticəsiBir obyektlə çoxlu əməliyyat
`apply``this`Obyektin özüObyekt konfiqurasiyası (builder üslubu)
`also``it`Obyektin özüYan təsir: log, validasiya

Praktik qayda: konfiqurasiya üçün apply, null-safe transformasiya üçün let, yan təsir (log) üçün also. Scope function-ları iç-içə yazmaqdan qaçın — it-lərin hansı obyektə aid olduğu itir və müsahibədə bunu antipattern kimi qeyd etmək müsbət baldır.

🛠 Tapşırıq

Öz kodundan (və ya nümunə kimi) 3 parça götürüb scope function-larla təmizlə:

  • Obyekt konfiqurasiyası olan bir yeri apply ilə,
  • null yoxlaması olan bir yeri ?.let ilə,
  • log/analytics çağırışı olan bir yeri also ilə yaz.

Sonra bir String.maskPan() extension funksiyası yaz və "4169111122223333" üzərində yoxla.

Bitdi sayılır: hər dəyişikliyin yanında "niyə məhz bu funksiya" qeydi varsa.

📚 Mənbələr və sənədlər