Перейти к содержанию

🗒 Задача

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

Функционал одного из модулей будет такой. Есть лента, в которой отображаются “комнаты” для общения по интересам. В карточке “комнаты” отображается:

  • обложка;

  • название;

  • список участников — отображаются в виде аватарок. При долгом нажатии на аватар подсветится его никнейм. Рядом с аватаркой отображается текстовый бейдж с одним из возможных статусов говорящего: “разговаривает”, “микрофон выключен”, “пользователь заглушен”.

Класс должен содержать методы:

– добавления участника (принимает объект участника и сохраняет в свойство комнаты); – обновления статуса (принимает имя пользователя и новый статус).

После проектирования создай объект комнаты с произвольными данными.

❌ Ошибки

  • не создают отдельный класс для членов комнаты — создавать класс 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, "пользователь заглушен")
}