Войти
ПрограммированиеФорумОбщее

Тест на рефакторинг (C#)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 313 14 Следующая »
#0
(Правка: 15 ноя. 2018, 18:36) 23:06, 14 ноя. 2018

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

Итак есть код:

public class AgentAddState
{
       public List<StateDefine> States; // Этот список как-то заполнен

       // Метод позволяет записать некое значение в указанный объект  (однозначно определеяется через argAgent и argType)
       public void SetState(AgentList argAgent, StateType argType, float argValue)
       {
             StateDefine locState = null;

             for (int i = 0; i < States.Count; i++)
             {
                    if (States[i].Agent == argAgent && States[i].Type == argType)
                    {
                           locState = States[i];
                           break;
                    }
             }

             if (locState != null)
             {
                    locState.Value = argValue;
                    if (locState.Value <= 0)
                    {
                           locState.Value = 0;
                    }
                    if (locState.Value >= 100)
                    {
                           locState.Value = 100;
                    }
             }
       }
}

public class StateDefine
{
       public AgentList Agent;
       public StateType Type;
       public float Value;
}

public enum AgentList
{
       None,
       Agent1,
       Agent2,
       Agent3
}

public enum StateType
{
       None,
       State1,
       State2,
       State3,
       State4,
       State5
}
Теперь, появляется новая задача – нужно уметь прибавлять к текущему значению некоторую величину, т.е. если
StateDefine.Value было 30, то мы хотим вызвать некий метод передать ему например плюс 10, и ждать что StateDefine.Value станет 40.

Как вы измените код? /читать: как вы отрефакторили бы код? т.е. оставив имеющуюся функциональность /


кто уже прошел тест - развлекуха по оцениванию отсюда https://gamedev.ru/code/forum/?id=240194&page=10#m139

#1
(Правка: 23:28) 23:27, 14 ноя. 2018
locState.Value += argValue;

// это тест для умственно отсталых?
#2
(Правка: 23:39) 23:35, 14 ноя. 2018
// и исправь свой говнокод на:
public void SetState(AgentList argAgent, StateType argType, float argValue)
{
    StateDefine locState = States.Find(state => state.Agent == argAgent && state.Type == argType);
    if(locState != null)
    {
        locState.Value = Math.Clamp(argValue, 0, 100);
    }
}
// и решение твоей задачи
locState.Value = Math.Clamp(locState.Value + argValue, 0, 100);
#3
23:36, 14 ноя. 2018

tac
> Как вы измените код?
Что бросается в глаза с ходу:

public List<StateDefine> States;
заменить на Map, где ключом является комбинация Agent и Type, а значением Value
+
locState = States[i];
тоже странно, тут же должна быть ссылка или шарп сам решает как надо?

> Теперь, появляется новая задача – нужно уметь прибавлять к текущему значению некоторую величину...
Тут вообще не ясно с чем могут быть сложности.

#4
(Правка: 23:38) 23:37, 14 ноя. 2018

А ещё лист можно переделать в мап, чтобы поиск был за О(1).

Опередили

#5
(Правка: 23:49) 23:40, 14 ноя. 2018

alexey.ch
целиком код напиши, а не кусками

если я правильно понял, то так ?

public void SetState(AgentList argAgent, StateType argType, float argValue)
{
    StateDefine locState = States.Find(state => state.Agent == argAgent && state.Type == argType);
    if(locState != null)
    {
        locState.Value = Math.Clamp(argValue, 0, 100);
    }
}

public void AddState(AgentList argAgent, StateType argType, float argValue)
{
    StateDefine locState = States.Find(state => state.Agent == argAgent && state.Type == argType);
    if(locState != null)
    {
        locState.Value = Math.Clamp(locState.Value + argValue, 0, 100);
    }
}

#6
23:47, 14 ноя. 2018

tac
> если я правильно понял, то так ?
Да. Ты правильно понял.

#7
23:49, 14 ноя. 2018

alexey.ch
Молодец, не прошел :) Смотреть в чем ошибка?

+ Показать
#8
23:52, 14 ноя. 2018

tac
Изображение

#9
23:54, 14 ноя. 2018

alexey.ch
думаю, старый метод (SetState) тоже должен сохраниться.
Ну т.е. делать AddState в котором все строки кроме одной совпадают с SetState - так себе решение.

----
Структура данных спорная, с мапом (или массивом, если число агентов\состояний фиксировано) даже и функция не потребовалась бы, просто States[(agent, state)] += 10 (ну или как там в шарпе кортежи объявляются).
но допустим агентов и состояний все равно мало и структуру трогать нельзя.
тогда все равно можно сделать

 public StateDefine GetState(AgentList argAgent, StateType argType, float argValue) 
...
 GetState(agent, state).Value+=10; 
(разве что остальные два поля непубличными сделать).

хотя еще лучше было бы ссылку вернуть чтоб .Value не писать, но как это красивее в шарпе сделать лень смотреть.

#10
0:01, 15 ноя. 2018

kipar
> GetState(agent, state).Value+=10;
NullReferenceException, если в коллекции нет значения по паре ключей.

> Ну т.е. делать AddState в котором все строки кроме одной совпадают с SetState -
> так себе решение.
Я не понял задание. Думал, что надо исправить set, на add.

Надо вынести поиск в функцию GetState, а проверку на null оставить и все будет ОК.

#11
0:03, 15 ноя. 2018

alexey.ch
> NullReferenceException, если в коллекции нет значения по паре ключей.
ну так в задаче не сказано что делать если там нет пары. Может как раз и надо исключение бросать.

#12
0:05, 15 ноя. 2018

Удалю нафиг весь код. Он вообще ничего не делает.

#13
0:06, 15 ноя. 2018

kipar
> ну так в задаче не сказано что делать если там нет пары. Может как раз и надо
> исключение бросать.
В исходном примере есть проверка на null. Очевидно его надо сохранить.

#14
(Правка: 0:15) 0:07, 15 ноя. 2018

alexey.ch
> Надо вынести поиск в функцию GetState, а проверку на null оставить и все будет ОК.

другим не смотреть :)

+ Показать

Так?

+ Показать
Страницы: 1 2 313 14 Следующая »
ПрограммированиеФорумОбщее