1

Тема: Допоможіть розібрати лайнокід

Привітик.
Писав я тут штуку одну, котра симулює роботу чату. І от замовник каже - при повторному заході в гру, потрібно також відображати останні N повідомлень, типу міні-історія.
Ну і я  тут подумав - це ж легко. Потрібно просто створити колекцію, і при надходженні повідомлень додавати їх в цю колекцію, також необхідно обмежити кількість повідомлень в колекції, і після виходу користувача з гри потрібно зберігати цю колекцію, а при наступному входженні в гру просто витягнути всі повідомлення і додати в чатик.
Дані, та код, корий додає повідомлення з цими даними в чатик, знаходяться в одному класі, тому я вирішив, що до кожного такого класу додам два методи, перший буде додавати повідомлення в список (історію), а другий буде додавати повідомлення в чатик в якості історії.
Але в кожному такому класі вже є метод, котрий додає повідомлення в чатик, а код, котрий додавав би це повідомлення в якості історії, має бути майже таким, за винятком деяких там штук, наприклад, перед доданням повідомлення нам не потрібно чекати деякий час, що симулювало б набір цього повідомлення користувачем на тому кінці.
Ну ви зрозуміли.

Так от. Як мені оформити додавання повідомлення саме в якості історії?

Зараз в мене лише одна думка - в старий метод, котрий додає повідомлення в чат впродовж гри (не історія), передавати булеву змінну, і перед усіма строками коду, котрі не мають працювати при додаванні повідомлення в якості історії ставити if. Але таких строк коду може бути багацько, і якось це все костильно виглядає. До того ж, десь потрібно взагалі переписувати код, котрий додає повідомлення в чат. Що думаєте?

А от вам приклад.

public class MessageItem : MessageBase, ISaveToHistory // інтерфейс містить два метода, для збереження та додавання повідомлення в якості історичного повідомлення
{
    [XmlAttribute("id")]
    public int id;
    [XmlAttribute("action")]
    public int action;

    protected override IEnumerator DrawCoroutine(bool fast=false) // головний метод, що додає повідомлення в чат
    {
        Item item = chatController.app.model.items.Find((i) => { return i.id == id; });
        if (action > 0)
        {
            if (!fast)
                chatController.StartLoader(); // вмикаємо анімацію завантаження повідомлення

            var go = GetGo(); // створюємо об'єкт повідомлення
            var mc = go.GetComponent<MessageController>();
            string name = item.name;
            mc.Text = "+ " + name; // змінюємо дані, котрі відображаються в повідомленні
            if (!fast)
                yield return new WaitForSeconds(2f); // затримка перед додаванням повідомлення в чат
            go.transform.SetParent(chatController.content.transform); //додаємо повідомлення в чат
            RefreshTrans(go.transform);

            if (!fast)
            {
                chatController.app.model.AddItem(item); // додаємо предмет в інвентар

                chatController.StopLoader(); // вимикаємо анімацію завантаження повідомлення
                yield return new WaitForSeconds(1.5f); // затримка перед надходженням наступного повідомлення
            }
        }
        else
        {
            if(!fast)
                chatController.app.model.RemoveItem(item); // видаляємо предмет з інвентаря
        }
    }

    protected override GameObject GetGo()
    {
        return GameObject.Instantiate(chatController.systemItemAdd, Vector2.zero, Quaternion.identity) as GameObject;
    }

    public void Save()
    {
        chatController.app.model.AddToHistory(this); // додаємо повідомлення в історію
    }

    public void Load(ChatController chatController)
    {
        //тут маємо додавати повідомлення в чат в якості історії
    }
}

Коли це повідомлення з'являється впродовж гри, то в чаті з'являється повідомлення про те, що користувач знайшов деякий предмет, і цей предмет додається в інвентар. Змінна action вказує на дію та кількість предметів одночасно, якщо вона більше нуля, то в інвентар додається action предметів цього типу, а якщо меньше нуля, або нуль, то видаляється.
При додаванні повідомлення в якості історії нам НЕ потрібно додавати предмет в інвентар або видаляти його, до того ж нам непотрібно зупиняти анімацію завантаження повідомлення, і потрібно ігнорувати всі затримки.
З if'ами метод виглядав би якось так

protected override IEnumerator DrawCoroutine(bool fast=false) // головний метод, що додає повідомлення в чат
{
    Item item = chatController.app.model.items.Find((i) => { return i.id == id; });
    if (action > 0)
    {
        if (!fast)
            chatController.StartLoader(); // вмикаємо анімацію завантаження повідомлення

        var go = GetGo(); // створюємо об'єкт повідомлення
        var mc = go.GetComponent<MessageController>();
        string name = item.name;
        mc.Text = "+ " + name; // змінюємо дані, котрі відображаються в повідомленні
        if (!fast)
            yield return new WaitForSeconds(2f); // затримка перед додаванням повідомлення в чат
        go.transform.SetParent(chatController.content.transform); //додаємо повідомлення в чат
        RefreshTrans(go.transform);

        if (!fast)
        {
            chatController.app.model.AddItem(item); // додаємо предмет в інвентар

            chatController.StopLoader(); // вимикаємо анімацію завантаження повідомлення
            yield return new WaitForSeconds(1.5f); // затримка перед надходженням наступного повідомлення
        }
    }
    else
    {
        if(!fast)
            chatController.app.model.RemoveItem(item); // видаляємо предмет з інвентаря
    }
}

Фігня повна, правда ж?

2

Re: Допоможіть розібрати лайнокід

ну, я вирішив спробувати винести частину коду в метод, котрий приймає аргумент в якості часу затримки перед додаванням повідомлення