Андроид-приложение, 57-я неделя

Поиск: лексический, побуквенный

Поисков у меня в приложении пока будет два: лексический (lexical) и побуквенный (literal). Лексический поиск находит подходящую под запрос пользователя лексему и выдаёт результаты согласно сопоставленной лексеме. А побуквенный — ищет словоформу, в точности соответствующую запросу.

В порядке эксперимента я реализую побуквенный поиск для английского и корнуэльского языка, а лексический — для русского, чувашского и корейского.

Вот закодированный лексический индекс:

package com.example.myapp.searchlex

val lexMetaindex = mapOf(
    "1062927765857732217775917700" to listOf("2024-04-25-e1"), // "띄어쓰기"
    "1051837775917700" to listOf("2024-04-25-e2"), // "보기"
    "7561539594" to listOf("2024-04-25-e2"), // "бланк"
    "755461945495729441211182" to listOf("2024-04-10-e1"), // "болконский ф"
    "75516231" to listOf("2024-04-10-e1"), // "быть"
    "76" to listOf("2024-04-25-e1"), // "в"
    "764272318553" to listOf("2024-04-10-e1"), // "весьма"
    "65429531" to listOf("2024-04-23-e1"), // "день"
    "655475645121" to listOf("2024-04-23-e1"), // "добрый"
    "71537454619542954142" to listOf("2024-04-25-e2"), // "заполнение"
    "41" to listOf("2024-04-10-e1"), // "и"
    "9495637131" to listOf("2024-04-10-e1"), // "князь"
    "945464422172944121" to listOf("2024-04-25-e1"), // "корейский"
    "9464537241765121" to listOf("2024-04-10-e1"), // "красивый"
    "948495" to listOf("2024-04-23-e1"), // "кун"
    "85546154655421" to listOf("2024-04-10-e1"), // "молодой"
    "955354758485" to listOf("2024-04-25-e3"), // "наобум"
    "954275546131835421" to listOf("2024-04-10-e1"), // "небольшой"
    "54" to listOf("2024-04-23-e2"), // "о"
    "54756453714293" to listOf("2024-04-25-e2"), // "образец"
    "5474644265426132955121" to listOf("2024-04-10-e1"), // "определённый"
    "744172318554" to listOf("2024-04-25-e1"), // "письмо"
    "74546463655494" to listOf("2024-04-25-e1"), // "порядок"
    "74547262539554769453" to listOf("2024-04-25-e1"), // "постановка"
    "746454754261" to listOf("2024-04-25-e1"), // "пробел"
    "645372848165536231" to listOf("2024-04-23-e2"), // "рассуждать"
    "64547262" to listOf("2024-04-10-e1"), // "рост"
    "72" to listOf("2024-04-10-e1"), // "с"
    "7284965421" to listOf("2024-04-10-e1"), // "сухой"
    "92426154764294" to listOf("2024-04-10-e1"), // "человек"
    "9242646253" to listOf("2024-04-10-e1"), // "черта"
    "92625461417554" to listOf("2024-04-23-e2"), // "что-либо"
    "516452" to listOf("2024-04-23-e1"), // "ырӑ"
)

Видно, что в индекс записано тридцать три лексемы — следовательно, для них можно создать тридцать три различных результата лексического поиска (то есть поиск проводится по тридцати трём лексемам; запрос всегда либо «попадает» только «по одной лексеме», либо «не попадает» вообще).

Правда, на текущий момент у меня в приложении не так много примеров, чтобы искать по ним...

Повторение пройденного

Мне предстоит добавить в своё приложение совершенно не знакомый мне функционал, поэтому я пересматриваю ролики ютуб-канала «Разработчики „Андроида“».

Смущает то, что код может быть неясным для новичков. Вот пример (учитывайте то, что угловые скобки заменены прямыми скобками):

@Composable
fun MessageList(messages: List[String]) {
    Column {
        var selectAll: Boolean = ...
        Checkbox(
            checked = selectAll,
            onCheckChange = { checked ->
                selectAll = checked
            }
        )
        ...
    }
}

Параметр «чекд» (checked) функции «Чекбокс» (Checkbox) и одноимённый параметр лямбды лучше бы назывались по-разному:

@Composable
fun MessageList(messages: List[String]) {
    Column {
        var selectAll: Boolean = ...
        Checkbox(
            checked = selectAll,
            onCheckChange = { checkedAsLambdaParameter ->
                selectAll = checkedAsLambdaParameter
            }
        )
        ...
    }
}

Проблему мог бы решить язык котлин, введи он в свой синтаксис что-то вроде артиклей:

@Composable
fun MessageList(messages: List[String]) {
    Column {
        var selectAll: Boolean = ...
        Checkbox(
            checked = selectAll,
            onCheckChange = { #checked ->
                selectAll = #checked
            }
        )
        ...
    }
}

Вуаля! Теперь вы не спутаете одно с другим...

А фраза «он чек чейндж» (onCheckChange) может быть непривычна неносителям английского языка. Но это уже́ проблема неносителей... «После проверки изменения»? — нет, конечно: «после изменения статуса выбора»! Хорошо бы решить это другим синтаксисом:

checked = selectAll,
onChange["checked"] = { #checked ->
    selectAll = #checked
}

Тут именно прямые скобки: в словарь «он чейндж» (onChange) по ключу «чекд» (checked) записывается лямбда (колбек).

Вычисление размера компонента графического интерфейса

В том же самом ролике, ссылку на который я давал выше, рассказывается о важном преимуществе фреймворка «Компоус», которое проявляется при вычислении размера компонента графического интерфейса.

Когда использовать «реме́мбер сэ́йвэбэл», а когда — просто «реме́мбер»

Если значение какой-либо величины не должно пересчитываться при смене конфигурации (должно «пережить» смену конфигурации), то, возможно, следует использовать «реме́мбер сэ́йвэбэл», а не просто «реме́мбер».

Суть компоусэблов за 10 минут

Компоусэблы, рекомпозиция и всё, что я описывал ранее в своих постах, в том числе в отдельной «шпаргалке», объяснено в десятиминутном ролике.

Перерыв

Я вынужден прервать разработку на неопределённый срок.