Kotlin | Вопросы собесов
2.56K subscribers
27 photos
955 links
Download Telegram
🤔 Как в Kotlin можно обеспечить выполнение кода, даже если предыдущее выражение выбросило исключение?
Anonymous Quiz
72%
Использование блока `finally`
5%
Использование блока `else`
8%
Использование ключевого слова `safecall`
👍1
Что такое лямбды с точки зрения синтаксиса в Java и Kotlin ?
Спросят с вероятностью 13%

Лямбда-выражения представляют собой компактный способ представления анонимных функций, который особенно полезен для создания коротких блоков выполнения кода, предназначенных для последующей передачи другим функциям. Лямбды широко используются для упрощения работы с коллекциями, потоками данных, асинхронным кодом и в ситуациях, где требуется функциональный интерфейс.

Лямбда-выражения

Были введены в Java 8 и являются частью усилий по добавлению функциональных возможностей в язык. Лямбды в Java чаще всего используются с функциональными интерфейсами, которые являются интерфейсами с одним абстрактным методом.

Синтаксис:
(parameters) -> expression

или
(parameters) -> { statements; }


Примеры:

1️⃣Лямбда без параметров:
  () -> System.out.println("Hello, World!");


2️⃣Лямбда с одним параметром:
(int a) -> a * a


3️⃣Лямбда с несколькими параметрами:
(int a, int b) -> a + b


4️⃣Лямбда с телом, содержащим несколько выражений:
(String s) -> {
System.out.println(s);
return s.length();
}


Лямбды могут использоваться везде, где ожидается функциональный интерфейс, например, в методах вроде forEach, map, filter коллекций и потоков.

Лямбда-выражения

Поддерживает более гибкие и выразительные лямбды по сравнению с Java. Лямбды могут использоваться как с функциональными интерфейсами, так и в качестве части синтаксиса языка, благодаря чему Kotlin особенно удобен для функционального программирования.

Синтаксис:
{ parameters -> code body }


Примеры:

1️⃣Лямбда без параметров:
      { println("Hello, World!") }


2️⃣Лямбда с одним параметром:
      { a: Int -> a * a }


3️⃣Лямбда с несколькими параметрами:
      { a: Int, b: Int -> a + b }


4️⃣Лямбда с телом, содержащим несколько выражений:
      { s: String ->
println(s)
s.length
}


Кроме того, Kotlin поддерживает замыкания, позволяя лямбдам захватывать и модифицировать переменные из своей области видимости.

Лямбда-выражения упрощают написание компактного кода для выполнения функций, особенно в контексте функциональных интерфейсов и обработки коллекций. Лямбды более интегрированы в язык и предоставляют больше возможностей по сравнению с Java, где они более ограничены, но тем не менее представляют значительное улучшение функциональных возможностей языка начиная с версии 8.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍92
Что для такое качественный код ?
Спросят с веротяностью 20%

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

Читаемость

Код должен быть написан так, чтобы его легко было читать и понимать не только автору, но и другим разработчикам. Это достигается с помощью понятного именования переменных, функций и классов, а также соблюдением общепринятых стилей кодирования и форматирования.

Поддерживаемость

Код должен быть структурирован таким образом, чтобы его можно было легко изменять и расширять, не нарушая существующую функциональность. Это включает в себя использование принципов SOLID, паттернов проектирования и комментирования сложных или неочевидных участков кода.

Производительность

Код должен быть оптимизирован для достижения наилучшей производительности, особенно в критических для приложения областях. Это означает, что разработчик должен стремиться к эффективному использованию ресурсов устройства, таких как CPU, память и батарея.

Надежность

Должен корректно функционировать в различных условиях и обрабатывать возможные ошибки или исключительные ситуации, предотвращая аварийные завершения работы приложения или потерю данных.

Тестируемость

Код должен быть написан так, чтобы его можно было легко тестировать на предмет ошибок. Это означает разделение логики на независимые, легко тестируемые модули и использование автоматизированных тестов для проверки корректности работы.

Совместимость и безопасность

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

Пример качественного кода — это функция, которая загружает данные из сети:
public void fetchData(String url, Callback callback) {
new Thread(() -> {
try {
// Имитация загрузки данных
Thread.sleep(2000);
String result = "Успешно загружено";
callback.onSuccess(result);
} catch (InterruptedException e) {
callback.onError(e);
}
}).start();
}


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

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

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍1
Что такое Hilt и для чего он используется ?
Спросят с вероятностью 13%

Hilt — это фреймворк для внедрения зависимостей (Dependency Injection, DI), разработанный командой Google, специально для платформы Android. Он основан на популярном DI фреймворке Dagger и предназначен для упрощения процесса внедрения зависимостей в Android-приложениях. Предоставляет стандартизированную и упрощённую систему управления зависимостями, что значительно облегчает конфигурацию и управление жизненным циклом компонентов приложения.

Для чего он используется?

1️⃣Упрощение настройки Dagger: Хотя и мощный, может быть сложным в настройке и использовании, особенно в больших проектах. Hilt предоставляет набор предварительно настроенных компонентов и скопов, что упрощает использование Dagger, сокращая количество шаблонного кода и комплексность конфигураций.

2️⃣Управление жизненным циклом: Автоматически управляет жизненным циклом зависимостей в соответствии с жизненным циклом Android компонентов, таких как активности, фрагменты, сервисы и т.д. Это уменьшает риск утечек памяти и других проблем, связанных с неправильным управлением ресурсами.

3️⃣Улучшенная тестируемость: Облегчает создание изолированных модульных тестов за счёт предоставления инструментов для замещения реальных зависимостей тестовыми аналогами (mock или fake).

4️⃣Интеграция с Jetpack: Эффективно работает с другими библиотеками Jetpack, такими как ViewModel, WorkManager и т.д., предоставляя встроенные аннотации и классы для их интеграции.

Чтобы использовать Hilt, необходимо добавить соответствующие зависимости в файл build.gradle и аннотировать Android-компоненты и классы зависимостей соответствующими аннотациями Hilt.
// Добавление зависимостей в build.gradle
dependencies {
implementation "com.google.dagger:hilt-android:2.38.1"
kapt "com.google.dagger:hilt-android-compiler:2.38.1"
}

// Application класс, аннотированный @HiltAndroidApp
@HiltAndroidApp
class MyApplication : Application()

// Использование Hilt для внедрения зависимости в Activity
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsAdapter
}

// Определение модуля и предоставление зависимости
@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {
@Provides
fun provideAnalyticsAdapter(): AnalyticsAdapter {
return AnalyticsAdapterImpl()
}
}


Hilt значительно упрощает управление зависимостями, сокращает количество кода, необходимого для настройки и использования Dagger, и помогает создавать более чистые, тестируемые и удобные в обслуживании приложения. Благодаря его интеграции с жизненным циклом Android и поддержке Jetpack, Hilt становится отличным выбором для современной Android разработки.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍4
🤔 Какое ключевое слово в Kotlin позволяет объекту реализовывать несколько интерфейсов с одинаковыми методами?
Anonymous Quiz
16%
interface
53%
override
13%
open
18%
super
👍1🤯1
Что такое data-классы ?
Спросят с вероятностью 13%

Data-классы — это специализированные классы, предназначенные прежде всего для хранения данных. Они обычно используются для создания простых объектов, где основное назначение этих объектов — перенос данных с минимальной или без какой-либо дополнительной логики. Часто применяются для таких задач, как передача данных между компонентами программы, работа с JSON или другими форматами данных при сериализации/десериализации и создание объектов для тестирования.

Особенности:

1️⃣Простота и читаемость: Содержат только поля данных и методы для доступа к этим данным (геттеры и сеттеры). Часто они также автоматически предоставляют методы для сравнения объектов, получения хеш-кода и преобразования данных в строку.

2️⃣Автоматическая генерация методов: Во многих языках, таких как Kotlin, Scala и других, компилятор автоматически генерирует стандартные методы, такие как equals(), hashCode() и toString(), что уменьшает объем шаблонного кода и повышает его читаемость.

3️⃣Неизменяемость: Часто они делаются неизменяемыми (immutable), что облегчает разработку многопоточных приложений и уменьшает вероятность ошибок, связанных с изменением состояния объекта.

Примеры:

Kotlin
Ввел ключевое слово data для создания data-классов, что упрощает их объявление и автоматически добавляет нужные методы.
data class User(val name: String, val age: Int)


В этом примере для класса User автоматически будут сгенерированы методы equals(), hashCode(), toString(), а также copy() для создания копий объекта с измененными полями.

Java
Для создания классов, похожих на data-классы, используется более шаблонный подход, так как Java не предоставляет встроенную поддержку data-классов до Java 14 (где появились record классы).
public class User {
private final String name;
private final int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age &&
Objects.equals(name, user.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}

@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

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

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍3
Что для такое качественный код ?
Спросят с веротяностью 20%

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

Читаемость

Код должен быть написан так, чтобы его легко было читать и понимать не только автору, но и другим разработчикам. Это достигается с помощью понятного именования переменных, функций и классов, а также соблюдением общепринятых стилей кодирования и форматирования.

Поддерживаемость

Код должен быть структурирован таким образом, чтобы его можно было легко изменять и расширять, не нарушая существующую функциональность. Это включает в себя использование принципов SOLID, паттернов проектирования и комментирования сложных или неочевидных участков кода.

Производительность

Код должен быть оптимизирован для достижения наилучшей производительности, особенно в критических для приложения областях. Это означает, что разработчик должен стремиться к эффективному использованию ресурсов устройства, таких как CPU, память и батарея.

Надежность

Должен корректно функционировать в различных условиях и обрабатывать возможные ошибки или исключительные ситуации, предотвращая аварийные завершения работы приложения или потерю данных.

Тестируемость

Код должен быть написан так, чтобы его можно было легко тестировать на предмет ошибок. Это означает разделение логики на независимые, легко тестируемые модули и использование автоматизированных тестов для проверки корректности работы.

Совместимость и безопасность

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

Пример качественного кода — это функция, которая загружает данные из сети:
public void fetchData(String url, Callback callback) {
new Thread(() -> {
try {
// Имитация загрузки данных
Thread.sleep(2000);
String result = "Успешно загружено";
callback.onSuccess(result);
} catch (InterruptedException e) {
callback.onError(e);
}
}).start();
}


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

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

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍21
🤔 Какой механизм позволяет создавать иммутабельные коллекции в Kotlin?
Anonymous Quiz
42%
ImmutableList
2%
ReadOnlyList
2%
UnmodifiableList
53%
List
1👍1👀1
Какие способы навигации известно ?
Спросят с вероятностью 13%

Навигация в приложениях и веб-сайтах организует способ, с помощью которого пользователи перемещаются между различными частями интерфейса. Она может быть реализована разными способами в зависимости от платформы (веб, мобильные устройства, десктопные приложения) и от специфики конкретного приложения или сайта. Вот некоторые из наиболее распространенных способов навигации:

1️⃣Навигационные меню
Горизонтальное меню: Располагается обычно в верхней части страницы. Хорошо подходит для сайтов с небольшим количеством основных разделов.
Вертикальное меню: Часто используется в приложениях и на сайтах, где необходимо предоставить доступ к большому количеству категорий или функций.

2️⃣"Гамбургер"-меню
Скрывает меню, которое раскрывается при нажатии. Это позволяет экономить пространство на экране.

3️⃣Табы и вкладки
Позволяют организовать контент на отдельных вкладках в рамках одного и того же окна или страницы, что удобно для разделения информации на категории без необходимости перезагрузки страницы.

4️⃣Панель хлебных крошек
Показывают путь, по которому пользователь пришел к текущей странице. Особенно полезны на сайтах с глубокой структурой навигации.

5️⃣Пагинация
Используется для навигации по спискам или большим количествам контента, разделенному на отдельные страницы.

6️⃣Навигация по якорям
Ссылки ведут к определенным местам на той же странице или на другой странице. Это удобно для перехода к конкретным разделам или заголовкам.

7️⃣Поисковая строка
Позволяет пользователям вводить ключевые слова для быстрого перехода к интересующему их контенту или страницам.

8️⃣Свайп и жесты
В мобильных приложениях жесты позволяют навигацию между экранами или элементами интерфейса, например, перелистывание фотографий.

9️⃣Сайдбар (боковая панель)
Часто используются в приложениях и на сайтах для обеспечения доступа к различным функциям, настройкам или дополнительным разделам.

🔟Модальные окна и оверлеи
Используются для временной навигации, предоставляя информацию или функционал без перехода на другую страницу.

Выбор метода навигации зависит от целей интерфейса, целевой аудитории, контекста использования и содержания. Эффективная навигация должна быть интуитивно понятной, доступной и обеспечивать быстрый доступ к необходимым ресурсам или информации. Правильный выбор стратегии навигации может значительно повысить удобство и эффективность взаимодействия пользователя с продуктом.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
🤔3👍2
Что известно про фреймворк Dagger ?
Спросят с вероятностью 13%

Dagger — это мощный фреймворк для внедрения зависимостей (Dependency Injection, DI), широко используемый в разработке. Он разработан для автоматизации и упрощения процесса внедрения зависимостей в приложении, что позволяет улучшить модульность, упростить тестирование и повысить масштабируемость ПО.

Ключевые особенности:

1️⃣Статически генерируемый код: В отличие от других DI библиотек, таких как Spring или Guice, которые используют рефлексию, Dagger работает на стадии компиляции и генерирует статический код. Это улучшает производительность, так как весь код для внедрения зависимостей создается на этапе компиляции, исключая необходимость обработки рефлексии во время выполнения.

2️⃣Потокобезопасность: Гарантирует потокобезопасное внедрение зависимостей, что критически важно для многопоточных приложений, особенно.

3️⃣Легкость в использовании: Уменьшает количество шаблонного кода, необходимого для ручной реализации внедрения зависимостей, и предоставляет удобные аннотации для определения зависимостей.

Основные компоненты:

1️⃣@Inject: Маркирует конструкторы, поля или методы, в которые должны быть внедрены зависимости.

2️⃣@Module: Классы, аннотированные как @Module, предоставляют методы, которые производят зависимости.

3️⃣@Provide: Методы внутри @Module, которые создают зависимости, аннотируются как @Provide. Это указывает Dagger на то, как именно создавать те или иные зависимости.

4️⃣@Component: Интерфейсы, аннотированные как @Component, определяют связь между потребителем зависимостей (например, Activity в Android) и объектами @Module, которые знают, как предоставить эти зависимости.

Пример:
// Определение зависимости
@Module
class NetworkModule {
@Provides
NetworkService provideNetworkService() {
return new NetworkService();
}
}

// Компонент для связывания зависимостей
@Component(modules = NetworkModule.class)
interface ApplicationComponent {
void inject(MyActivity activity);
}

// Использование внедрения в Activity
public class MyActivity extends AppCompatActivity {
@Inject
NetworkService networkService;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);

// Dagger внедрение
DaggerApplicationComponent.create().inject(this);

// Использование networkService
}
}


Dagger обеспечивает эффективное и масштабируемое решение для управления зависимостями. Фреймворк требует некоторого времени на изучение и настройку, но преимущества в виде чистого кода, легкости тестирования и высокой производительности оправдывают эти затраты. Помогает создавать более организованный, тестируемый и управляемый код, что особенно важно для больших и сложных приложений.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍4
🤔 Какой тип коллекции в Kotlin не допускает дублирования элементов?
Anonymous Quiz
4%
ArrayList
89%
HashSet
5%
LinkedList
2%
ArrayDeque
👍1
Что известно о data классах и sealed классах ?
Спросят с веротяностью 20%

Data классы и sealed классы предоставляют удобные и мощные инструменты для работы с данными и управления потоком программы соответственно. Давайте подробнее рассмотрим каждый из них.

Data классы (Data Classes)

Предназначены для хранения данных. Они автоматически генерируют несколько полезных методов, таких как equals(), hashCode(), toString(), а также copy() и компонентные функции (componentN()), что делает их идеальными для использования в качестве моделей данных.

Пример:
data class User(val name: String, val age: Int)
В этом примере для класса
User автоматически будут сгенерированы методы equals(), hashCode(), toString(), а также метод copy() и компонентные функции. Это позволяет легко сравнивать объекты, копировать их с изменением определенных полей и пр.

Sealed классы (Sealed Classes)

Это специальный тип классов, который используется для представления ограниченного иерархии классов. В отличие от обычных классов, которые могут иметь неограниченное количество подклассов, sealed классы ограничивают создание подклассов только внутри того же файла. Это позволяет использовать sealed классы в качестве основы для создания безопасных по типам иерархий, особенно полезных при работе с паттерном "Алгебраические типы данных" или при реализации шаблона проектирования "Посетитель".

Пример:
sealed class Result
data class Success(val data: String): Result()
data class Error(val error: Exception): Result()

В этом примере Result может быть только Success или Error, что позволяет использовать when без необходимости предоставлять блок else, так как все возможные случаи уже исчерпаны.

Основные отличия

Назначение: Data классы предназначены для хранения данных и автоматического предоставления методов для работы с этими данными. Sealed классы предназначены для создания ограниченных иерархий классов, что удобно при обработке различных вариантов состояний или результатов операций.
Использование: Data классы часто используются как модели данных в приложениях, а sealed классы — для управления состояниями в архитектурных компонентах, таких как ViewModel в MVVM.
Генерируемые методы: Data классы автоматически генерируют методы equals(), hashCode(), toString(), copy() и компонентные функции. Sealed классы не генерируют эти методы автоматически, но подклассы, объявленные как data классы, получают их.

Data классы и Sealed классы служат разным целям, но оба предоставляют мощные возможности для разработки чистого, безопасного и удобного в обслуживании кода. Data классы идеально подходят для представления моделей данных с автоматически сгенерированными методами для упрощения работы с данными. Sealed классы используются для создания ограниченных иерархий, что особенно полезно для обработки различных состояний или результатов в безопасном по типам стиле.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍3
🤔 Что произойдет при попытке использовать lateinit переменную до её инициализации в Kotlin?
Anonymous Quiz
25%
возникнет NullPointerException
10%
переменная будет автоматически инициализирована
17%
выдаст ошибку компиляции
48%
возникнет UninitializedPropertyAccessException
👍1
Каким образом осуществляется навигация ?
Спросят с вероятностью 13%

Навигация в контексте разработки ПО, в частности в мобильной и веб-разработке, относится к процессу перехода между различными частями приложения или сайта. Это ключевой аспект пользовательского интерфейса, который определяет, как пользователи взаимодействуют с приложением или сайтом и как легко они могут получить необходимую информацию или выполнить желаемые действия. Рассмотрим различные аспекты и методы ее реализации.

Веб-навигация

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

1️⃣Меню навигации: Часто включает в себя верхнее меню, боковую панель или "гамбургер"-меню в мобильных версиях сайтов. Эти элементы содержат ссылки на основные разделы сайта.
2️⃣Панель хлебных крошек: Предоставляет пользователям информацию о текущем местоположении в структуре сайта и позволяет легко возвращаться к вышестоящим разделам.
3️⃣Пагинация: Используется для навигации по длинным спискам или сериям элементов, таким как статьи, продукты в интернет-магазине или результаты поиска.
4️⃣Футер: Обычно содержит ссылки на важные, но менее часто используемые разделы сайта, такие как контактная информация, карьера, политика конфиденциальности.

Мобильная навигация

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

1️⃣Tab Bar: Расположен в нижней части экрана, позволяет быстро переключаться между несколькими основными функциями приложения.
2️⃣Navigation Drawer (Боковое меню): Скрывается за краем экрана и выдвигается при нажатии на иконку "гамбургер". Используется для доступа к различным категориям и функциям приложения.
3️⃣Stack Navigation: Используется для организации навигации между экранами, где каждый новый экран помещается в стек над предыдущим. Пользователи могут вернуться назад по стеку, используя кнопку "Назад".

Навигация в одностраничных приложениях (SPA)

В нем все необходимые HTML, JavaScript и CSS загружаются одним махом, или соответствующие ресурсы подгружаются динамически и добавляются к странице по мере необходимости, без перезагрузки всей страницы.

1️⃣Dynamic Routing: Используется фреймворками вроде React с React Router или Angular с Angular Router, чтобы динамически изменять контент в зависимости от URL, без перезагрузки страницы.
2️⃣Hash Routing: Использует хэш-часть URL (всё после #) для имитации полноценной навигации страниц без перезагрузки.

Эффективная навигация критически важна для создания хорошего пользовательского опыта. Она должна быть простой, понятной и предсказуемой, чтобы пользователи могли легко находить необходимую информацию и использовать функционал приложения или сайта. Нужно учитывать контекст использования продукта (мобильный, веб, десктоп) и потребности целевой аудитории при проектировании системы навигации.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
🤔8👍1🔥1
Что такое константы и можно ли их изменять ?
Спросят с вероятностью 8%

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

Объявление констант

Используется ключевое слово const.
package main

import "fmt"

const Pi = 3.14
const Greeting = "Hello, World!"
const IsEnabled = true

func main() {
fmt.Println("Pi:", Pi)
fmt.Println("Greeting:", Greeting)
fmt.Println("IsEnabled:", IsEnabled)
}


В этом примере объявлены три константы: Pi, Greeting и IsEnabled. Эти значения не могут быть изменены в ходе выполнения программы.

Изменение констант

Константы являются неизменяемыми. Это означает, что после их определения значение константы не может быть изменено. Попытка присвоить новое значение константе приведет к ошибке компиляции.
package main

import "fmt"

const Pi = 3.14

func main() {
Pi = 3.14159 // Ошибка компиляции: cannot assign to Pi
fmt.Println("Pi:", Pi)
}


В этом примере попытка изменить значение константы Pi вызовет ошибку компиляции с сообщением cannot assign to Pi.

Преимущества:

1️⃣Ясность кода: Использование констант делает код более читаемым и понятным, так как константы могут давать имена магическим числам и строкам.
2️⃣Безопасность: Константы предотвращают случайное изменение значений, которые не должны изменяться в ходе выполнения программы.
3️⃣Оптимизация: Компилятор может оптимизировать код, зная, что значения констант не изменятся.

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

👉 Можно посмотреть Примеры как отвечают люди на этот вопрос, или перейти К списку 349 вопроса на Golang разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
🤔8👍1
🤔 Какой из механизмов используется для преобразования функции в инфиксную форму в Kotlin?
Anonymous Quiz
11%
operator
20%
inline
65%
infix
4%
extension
Чем launch отличается от async/await ?
Спросят с веротяностью 20%

Для работы с асинхронным кодом в корутинах используются два основных механизма: launch и async с await. Оба они позволяют выполнять задачи асинхронно, не блокируя основной поток программы, но имеют различия в использовании и поведении.

Launch

Используется для запуска корутин без блокировки текущего потока и без непосредственного получения результата выполнения. launch возвращает объект Job, который можно использовать для управления корутиной (например, отменить её выполнение). Этот метод идеально подходит для задач, результат выполнения которых нам не интересен, или когда мы хотим просто выполнить некий код асинхронно.

Пример:
GlobalScope.launch {
// Выполняем асинхронную операцию
delay(1000L) // Имитация асинхронной задачи
println("World!")
}
println("Hello,") // Этот код выполняется сразу, не дожидаясь завершения корутины

Async/Await

async запускает корутину, которая выполняет задачу и возвращает результат в виде объекта Deferred, который является подтипом Job. Чтобы получить результат выполнения корутины, необходимо вызвать метод await на объекте Deferred. Это делает async/await идеальным выбором для асинхронных операций, результат которых нам важен и который мы хотим использовать далее в коде.

Пример:
val deferredResult = GlobalScope.async {
// Выполняем асинхронную операцию и возвращаем результат
delay(1000L) // Имитация асинхронной задачи
"World!"
}
println("Hello,") // Этот код выполняется сразу, не дожидаясь завершения корутины
println(deferredResult.await()) // Ожидаем и получаем результат асинхронной операции


Основные отличия

Возвращаемое значение: launch возвращает Job и используется для выполнения кода асинхронно без возвращения результата. async возвращает Deferred, что позволяет получить результат асинхронной операции с помощью await.
Назначение: Используйте launch для асинхронных задач, результат которых вам не нужен. async/await подходит для случаев, когда вам необходим результат выполнения асинхронной операции.
Ожидание результата: С launch нет необходимости ожидать завершения задачи, в то время как async требует вызова await для получения результата.

Выбор между launch и async/await зависит от конкретной задачи: необходимости в результате работы корутины и того, как вы планируете использовать этот результат.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍61
Что такое Extensions ?
Спросят с вероятностью 13%

Термин "Extensions" (расширения) используется для обозначения функциональности, которая позволяет добавлять новые возможности к существующим классам без изменения их исходного кода. Этот концепт особенно популярен к примеру в Swift и Kotlin, где расширения используются для улучшения читаемости кода, упрощения его структуры и добавления удобных методов для работы с уже существующими типами данных.

Расширения в Kotlin

Расширения позволяют добавить новую функциональность к классам, даже если исходный код этих классов недоступен для изменений (например, классы из стандартной библиотеки или сторонних библиотек). Это делается путём объявления функций или свойств, которые могут быть вызваны на экземплярах этих классов, как если бы они были частью оригинальных классов.

Пример:
// Расширение класса String для проверки, пуста ли строка или состоит из пробелов
fun String.isNullOrBlank(): Boolean {
return this == null || this.trim().isEmpty()
}

// Использование расширения
val myString = " "
println(myString.isNullOrBlank()) // Выведет: true


Расширения в Swift

Использует очень похожий подход, позволяя добавлять новые методы и вычисляемые свойства к существующим типам. Расширения могут даже добавлять новые протоколы к типам, что делает их чрезвычайно мощным инструментом в разработке под iOS и macOS.

Пример:
// Расширение стандартного типа String для добавления метода инвертирования строки
extension String {
func reversedString() -> String {
return String(self.reversed())
}
}

let myString = "Hello"
print(myString.reversedString()) // Выведет: "olleH"


Преимущества:

1️⃣Улучшение читаемости и организации кода: Расширения позволяют держать методы, связанные с определёнными типами данных, ближе к использованию этих типов.
2️⃣Избегание наследования: Расширения предоставляют альтернативный способ добавления функциональности к классам без использования наследования, что помогает избежать избыточной иерархии и увеличения сложности системы.
3️⃣Реиспользование кода: Методы, добавленные через расширения, могут быть легко переиспользованы в различных частях приложения.

Extensions являются мощным средством для расширения функциональности существующих классов без модификации их исходного кода. Это улучшает поддерживаемость, упрощает управление кодом и способствует лучшей модульности и гибкости в разработке ПО.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍3
🤔 Что произойдет, если вызвать функцию takeIf с условием, которое возвращает false, на объекте в Kotlin?
Anonymous Quiz
55%
возвратит null
11%
возвратит объект
22%
возвратит Unit
12%
возникнет ошибка компиляции
👍1
Какие паттерны традиционно используются в мобильныой разработке ?
Спросят с вероятностью 13%

Паттерны проектирования играют ключевую роль в создании удобной, масштабируемой и управляемой архитектуры приложений. Некоторые паттерны особенно популярны, так как они помогают решать типичные проблемы, связанные с жизненным циклом приложений, управлением состоянием, взаимодействием компонентов и другими аспектами. Вот несколько ключевых паттернов:

1️⃣Модель-Представление-Контроллер (MVC)
Разделяет приложение на три основных компонента:
Модель содержит данные и бизнес-логику.
Представление отвечает за вывод данных пользователю (UI).
Контроллер обрабатывает ввод пользователя и обновляет модель и представление.

Хотя MVC широко использовался в веб-разработке, в мобильной разработке он также находит применение, но иногда может приводить к сильной связанности между представлением и моделью, особенно на Android.

2️⃣Модель-Представление-Представитель (MVP)
Это эволюция паттерна MVC, где контроллер заменяется на представителя (Presenter), который отвечает за логику взаимодействия с пользователем:
Модель остается как в MVC.
Представление - это обычно активность или фрагмент в Android, которое отвечает только за отображение UI.
Представитель (Presenter) взаимодействует с моделью и обновляет представление, оставаясь от него независимым, что упрощает тестирование.

3️⃣Модель-Представление-Вид-Модель (MVVM)
Стал популярен в Android-разработке с появлением архитектурных компонентов Google, таких как LiveData и ViewModel:
Модель предоставляет данные.
Вид (View) отображает UI, реагируя на изменения в ViewModel.
ViewModel содержит логику отображения и общается с моделью, реагируя на действия вида и обновляя его через обсерваблы (например, LiveData).

4️⃣Singleton
Паттерн, гарантирующий, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Этот паттерн часто используется для реализации менеджеров (например, настроек приложения).

5️⃣Фабрика (Factory)
Паттерн, который используется для создания объектов без спецификации конкретных классов объектов. Фабрика полезна в мобильной разработке для создания объектов с различными конфигурациями в зависимости от условий или типа устройства.

6️⃣Стратегия (Strategy)
Позволяет определять семейство алгоритмов, инкапсулируя каждый из них и делая их взаимозаменяемыми. Этот паттерн часто используется для определения поведения компонентов в приложении, которое может меняться в зависимости от конфигурации или предпочтений пользователя.

7️⃣Наблюдатель (Observer)
Часто используется в мобильной разработке для обработки событий или изменений состояния. В Android это особенно актуально для реакции на изменения данных или состояния UI.

Использование этих паттернов в мобильной разработке помогает строить эффективные, масштабируемые и легко тестируемые приложения. Они позволяют лучше структурировать код, упрощают поддержку и развитие приложений.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍5