🗒 Задача¶
Прокачиваем абстрактное мышление. Задача на проектирование сущностей для упрощенной версии приложения социальной сети, в которой общаются только голосом. Требуется описать сущности и имитировать действия методами.
Функционал одного из модулей будет такой. Есть лента, в которой отображаются “комнаты” для общения по интересам. В карточке “комнаты” отображается:
-
обложка;
-
название;
-
список участников — отображаются в виде аватарок. При долгом нажатии на аватар подсветится его никнейм. Рядом с аватаркой отображается текстовый бейдж с одним из возможных статусов говорящего: “разговаривает”, “микрофон выключен”, “пользователь заглушен”.
Класс должен содержать методы:
– добавления участника (принимает объект участника и сохраняет в свойство комнаты); – обновления статуса (принимает имя пользователя и новый статус).
После проектирования создай объект комнаты с произвольными данными.
❌ Ошибки¶
- не создают отдельный класс для членов комнаты — создавать класс Member и добавлять в поле комнаты
listOf<Member>()
✏️ Комментарии¶
Класс в данном контексте - это описание будущего конкретного экземпляра. Мы описываем сущность одной **комнаты**. Поэтому множественное название будет уместно разве что для списка комнат, но не для одного конкретного экземпляра.
Класс в данном контексте - это описание будущего конкретного экземпляра. Мы описываем сущность одного **пользователя** – его шаблон. Поэтому множественное название будет уместно разве что для списка пользователей, но не для одного конкретного экземпляра.
Класс в данном контексте - это описание будущего конкретного экземпляра. Мы описываем сущность одной комнаты. **Значения по умолчанию**, прописанные в классе - означает, что все новые созданные объекты будут с такими данными, что нам не подходит. Давай уберем значения по умолчанию.
В целом все ок, но мы предполагаем по ТЗ, что пользователи - это часть сущности комнаты. Давай сделаем класс, например, Member и тут будет соответствующее поле со списком. Тип списка будет как раз новый класс пользователя. Для сущности “пользователь” также следует продумать (или частично перенести из этого класса) его собственный набор полей.
В целом тут может быть любая строка, но обычно для тестов прописывают некое подобие данных, чтобы понимать примерно что тут будет храниться. Например, для изображения подойдет такая инициализация `cover_image.png`
🧾 Решение¶
class Participant(
var nickname: String,
val avatar: String,
var status: String,
)
class Room(
val title: String,
val cover: String,
val participants: MutableList<Participant> = mutableListOf(),
) {
fun addParticipant(participant: Participant) {
participants.add(participant)
}
fun changeStatusToParticipant(nickname: String, newStatus: String) {
participants.find { it.nickname == nickname }?.status = newStatus
}
}
fun main() {
val room = Room(
title = "Kotlin Developers",
cover = "cover_image.png",
)
val participant1 = Participant("user1", "avatar1.jpg", "разговаривает")
val participant2 = Participant("user2", "avatar2.jpg", "микрофон выключен")
room.addParticipant(participant1)
room.addParticipant(participant2)
room.changeStatusToParticipant(participant1.nickname, "пользователь заглушен")
}