10/09/2018, 14:03

#31DaysOfKotlin - Week 3 Recap

Chào các bạn, chúng ta cùng tìm hiểu tiếp về Kotlin với phần 3 nhé! Tuần này ta sẽ tập trung vào các phần cơ bản của Kotlin như operators overloading, top level function and parameters và interators. Ta cũng sẽ nói về các phần nâng cao hơn như domain specific languages (DSLs) và chỉ cho bạn cách ...

Chào các bạn, chúng ta cùng tìm hiểu tiếp về Kotlin với phần 3 nhé!

Tuần này ta sẽ tập trung vào các phần cơ bản của Kotlin như operators overloading, top level function and parameters và interators. Ta cũng sẽ nói về các phần nâng cao hơn như domain specific languages (DSLs) và chỉ cho bạn cách để có thể viết code đẹp hơn khi sử dụng Android KTX cho content values, bundles và callbacks.

Day 15: Operator overloading

Viết Kotlin với tốc độ nhanh gấp đôi với operator overloading. Các đối tượng như Path, Range hoặc SpannableStrings đã có sẵn các phương thức như là cộng hoặc trừ. Với Kotlin thì bạn có thể implement thêm các toán tử của riêng mình.

Docs: operator overloading, Android KTX usage example

// Definition
/** Adds a span to the entire text. */
inline operator fun Spannable.plusAssign(span: Any) =
setSpan(span, 0, length, SPAN_INCLUSIVE_EXCLUSIVE)
// Use it like this
val spannable = “Eureka!!!!”.toSpannable()
spannable += StyleSpan(BOLD) // Make the text bold with +=
spannable += UnderlineSpan() // Make the text underline with +=

Day 16: Top level functions and parameters

Khi bạn muốn viết các phương thức Utility cho một class. Hãy thêm chúng vào top level của source file. Trong Java, chúng được biên dịch thành các static methods của class đó.

Docs: basic syntax.

// Define a top-level function that creates a DataBinding Adapter for a RecyclerView
@BindingAdapter(“userItems”)
fun userItems(recyclerView: RecyclerView, list: List<User>?){
    //update the RecyclerView with the new list
    …
}
class UsersFragment: Fragment{...}

Bạn muốn định nghĩa static constants cho một class? Hãy đặt chúng như là một top-level properties. Chúng sẽ được biên dịch như là một trường.

// Define a top-level property for Room database
private const val DATABASE_NAME = “MyDatabase.db”
private fun makeDatabase(context: Context): MyDatabase {
    return Room.databaseBuilder(
                   context,
                   MyDatabase::class.java,
                   DATABASE_NAME
              ).build()
}

Day 17: Iterating types without an iterator

Android KTX thêm các interators vào ViewGroup và SpareArray. Để định nghĩa một kiểu interator extensions hãy sử dụng operator. Vòng lặp Foreach sẽ sử dụng extension này.

Docs: for loops, Android KTX usage example.

// Example from Android KTX
for(view in viewGroup) { }
for(key in sparseArray) {}
// Your project
operator Waterfall.iterator() {
   // add an iterator to a waterfall class
}
for(items in myClass) {} // Now waterfall has iterations!

Day 18: Easy Content Values

Kết hợp sức mạnh của ContentValues với sự ngắn gọn của Kotlin. Sử dụng Kotlin KTX ContentValues và chỉ cần truyền vào một Pair<StringKey, Value>.

Android KTX implementation.

val contentValues = contentValuesOf(
    “KEY_INT” to 1,
    “KEY_LONG” to 2L,
    “KEY_BOOLEAN” to true,
    “KEY_NULL” to null
)

Day 19: DSLs (Domain specific languages)

Domain specific languages có thể được tạo ra bằng cách sử dụng một kiểu type safe builders. Nó làm cho các API trở nên dễ đọc hơn (Clean hơn). Bạn có thể xây dựng chúng theo cách của mình với sự giúp đỡ của các tính năng như extension lambdas và type safe builders.

html {
    head {
             title {+”This is Kotlin!” }
         }
    body {
             h1 {+”A DSL in Kotlin!”}
             p {+”It’s rather”
                b {+”bold.” }
                +”don’t you think?”
                }
          }
}

Spek là một testing library được xây dựng theo Kotlin DSL. Thay vì sử dụng @Annotations, Spek cung cấp một cách đơn giản hơn để viết ra các dòng test code.

@RunWith(JUnitPlatform::class)
class MyTest : Spek({
    val subject = Subject()
    given("it ’ s on fire") {
        subject.lightAFire()
        it("should be burning") {
            assertTrue(subject.isBurning())
        }
        it("should not be cold") {
            assertFalse(subject.isCold())
        }
    }
})

Một DSL cho Kotlin cho android là Anko. Anko cho phép bạn xây dựng các view sử dụng declarative code.

frameLayout {
    button("Light a fire") {
    onClick {
        lightAFire()
    }
}

Day 20: Easy Bundle

Sử dụng builder creator trong Kotlin KTX sẽ cho bạn viết builder một cách đẹp đẽ hơn, ngoài ra nó cũng có thể xử dụng cho cả các mảng Arrays

val bundle = bundleOf(
        "KEY_INT " to 1,
        "KEY_LONG" to 2L,
        "KEY_BOOLEAN" to true,
        "KEY_NULL" to null
        "KEY_ARRAY" to arrayOf(1, 2)
)

Day 21: Cleaning up postDelayed

Với last parameter call syntax, bạn có thể làm đẹp hơn các phần callbacks, Callable, và Runnable. Ví dụ, Android KTX đã làm đẹp hơn hàm postDelayed:

// Android KTX API
fun Handler.postDelayed(
              delay: Int, 
              token: Any? = null,  
              action: () -> Unit)
// Call it like this — no need for a Runnable in your code
handler.postDelayed(50) {
         // pass a lambda to postDelayed
}

Bài viết được dịch từ: https://medium.com/androiddevelopers/31daysofkotlin-week-3-recap-20b20ca9e205

Cảm ơn các bạn đã đọc bài viết!

0