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

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

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

Страницы: 19 10 11 12 13 14 Следующая »
#180
11:19, 16 ноя. 2018

tac
> > вакансии 2, ваше решение кого взять на работу?
афтар забыл показать свой вариант, как же надо было сделать "правильно" ?

#181
11:52, 16 ноя. 2018

greencrazycat
Он показал и там какой то говнокод. От архитекторов около программирования и рассказами о том что лямбды медленные

#182
12:14, 16 ноя. 2018

cNoNim
> Он показал и там какой то говнокод. От архитекторов около программирования и
> рассказами о том что лямбды медленные
о как! тогда лучше уволить такого тима и взять трех адекватных джунов - больше толку будет :)

#183
14:05, 16 ноя. 2018

tac
> по сути у всех из этой группы, близкое к моему решение
В этом и заключается шутка - ты оцениваешь не правильность решения, а близость к своим личным тараканам.

tac
> синдром оверхед архитектора
Ну давай, расскажи мне, в каком месте ты там нашёл оверхед.

#184
(Правка: 17:30) 17:30, 16 ноя. 2018

Delfigamer
> Ну давай, расскажи мне, в каком месте ты там нашёл оверхед.

уже обсуждали с другим, но у тебя это доведено "до ума"
https://gamedev.ru/code/forum/?id=240194&page=4#m52

#185
22:12, 16 ноя. 2018

Delfigamer
> ты оцениваешь не правильность решения, а близость к своим личным тараканам
А судьи кто? Давай не стесняйся расскажи свое оценивание, тут уже порядка 10 вариаций решений, или никто кроме меня и кипара, не претендует на тимлида? )

#186
(Правка: 22:14) 22:14, 16 ноя. 2018

greencrazycat
> уволить такого тима и взять трех адекватных джунов - больше толку будет :)
уверены? у кто работать будет и гавнокод подчищать за ними будет?

#187
15:06, 20 ноя. 2018

Кстати, есть еще такое решение. С одной стороны очень просто, просто добавляется необязательный параметр, но ... какие вы видите недостатки такого решения?

    
    public void SetState(AgentList argAgent, StateType argType, float argValue, int? changeValue = null)
    {
        StateDefine locState = States.Find(state => state.Agent == argAgent && state.Type == argType);

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

            locState.Value = (changeValue != null) ? locState.Value + (int)changeValue : locState.Value;
        }

    }
#188
15:46, 20 ноя. 2018

tac
волшебные параметры. Никаких шансов догадаться что SetState(agent, state, 0, 10) добавляет 10 к параметру, SetState(agent, state, 10) устанавливает его в 10, а SetState(agent, state, 10, 10) делает ерунду.
Хотя если это будет private ChangeState а наружу будут торчать вызывающие его SetState и AddState, то более-менее.

#189
(Правка: 16:40) 16:29, 20 ноя. 2018

tac
> Кстати, есть еще такое решение
очень плохо - т.к. в принципе, при таком подходе (когда метод не обрабатывает отсутствие вхождения элемента в коллекцию) получается неопределенное и не обрабатываемое состояние. И в результате вызывающий код не может быть уверен в исполнении логики метода. (нарушение контракта)

#190
(Правка: 30 ноя. 2018, 11:25) 16:10, 29 ноя. 2018
    public interface IAgentStateProcessor<in TArg> where TArg : struct 
    {
        void Process(ref float originalValue, TArg argValue);
    }

    public class Incrementor : IAgentStateProcessor<float>
    {
        public void Process(ref float originalValue, float argValue) => originalValue += argValue;
    }
    
    public class SetterClamped : IAgentStateProcessor<float>
    {
        public void Process(ref float originalValue, float argValue) => originalValue = 
            argValue < 0 ? 0 : 
            argValue > 100 ? 100 : 
            argValue;
    }
    
    public class AgentAddState
    {
        public readonly SortedList<AgentList, SortedList<StateType, float>> States;

        private static readonly IAgentStateProcessor<float> _incrementor = new Incrementor();
        private static readonly IAgentStateProcessor<float> _setter = new SetterClamped();

        private void ProcessState<TArg>(AgentList argAgent, StateType argType, TArg arg, IAgentStateProcessor<TArg> processor) where TArg : struct 
        {
            if (!States.TryGetValue(argAgent, out var agentStates)) 
                throw new KeyNotFoundException($"There is no agent like this: {argAgent}");
            
            var stateKeyId = agentStates.IndexOfKey(argType);
            if (stateKeyId == -1) 
                throw new KeyNotFoundException($"Agent {argAgent} does not have such a state: {argType}");
            
            var stateKey = agentStates.Keys[stateKeyId];
            var value = agentStates[stateKey];
            processor.Process(ref value, arg);
            agentStates[stateKey] = value;
        }
        
        // Метод позволяет записать некое значение в указанный объект (однозначно определеяется через argAgent и argType)
        public void SetState(AgentList argAgent, StateType argType, float argValue) =>
            ProcessState(argAgent, argType, argValue, _setter);
        
        // Метод позволяет инкрементить значение в указанном объекте (однозначно определеяется через argAgent и argType)
        public void IncrementState(AgentList argAgent, StateType argType, float argValue) =>
            ProcessState(argAgent, argType, argValue, _incrementor);
    }

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

    public enum StateType
    {
        None,
        State1,
        State2,
        State3,
        State4,
        State5
    }
#191
(Правка: 16:36) 16:33, 29 ноя. 2018

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

#192
(Правка: 17:22) 17:22, 29 ноя. 2018

Исходный код выглядит как костыль к которому прибивают сбоку подпорку. Рефакторить надо на более высоком уровне, начиная с понимания чего мы пытаемся достичь. С большой вероятностью следует выкинуть и поставить какое нибудь визально-скриптовое решение или вообще использовать lua.
Тред не читал.

#193
(Правка: 0:54) 0:51, 1 дек. 2018

есть более интересные задачи на рефакторинг - притом от признанных гуру :)
задача :
- сделать рефакторинг
- написать юнит тест

P/s : в листинге указан автор кода и в одной из книг этого же автора есть полный ход мыслей при рефакторинге (но учитывая "осведомленность" ТС есть 110% уверенность что он в глаза не видел подобных книг поэтому вряд ли сможет воспользоваться "подсказкой")

давай ТС - жги теперь ты, ждём твой вариант рефакторинга и сравним с гуру :)

P/s2 : хотя ... ТС походу слился капитально из темы и не станет дальше позорится, но может другим будет интересно предложить свои варианты :)

/// <remark>
/// Этот класс генерирует простые числа, не превышающие заданного
/// пользователем порога. В качестве алгоритма используется решето
/// Эратосфена.
///
/// Эратосфен Киренский, 276 г. до н. э., Кирена, Ливия --
/// 194 г. до н. э., Александрия. Впервые измерил окружность Земли.
/// Известен также работами по составлению календаря с високосными
/// годами. Работал в Александрийской библиотеке.
///
/// Сам алгоритм прост. Пусть дан массив целых чисел, начинающийся
/// с 2. Вычеркиваем все кратные 2. Находим первое невычеркнутое
/// число и вычеркиваем все его кратные. Повторяем, пока не
/// дойдем до квадратного корня из максимального значения.
///
/// Написал Роберт К. Мартин 9.12.1999 на языке Java
/// Перевел на C# Мика Мартин 12.01.2005.
///</remark>
using System;
/// <summary>
/// автор: Роберт К. Мартин
/// </summary>
public class GeneratePrimes
{
  ///<summary>
  /// Генерирует массив простых чисел.
  ///</summary>
  ///
  /// <param name=”maxValue”>Верхний порог.</param>
  public static int[] GeneratePrimeNumbers(int maxValue)
  {
    if (maxValue >= 2) // единственный допустимый случай
    {
      // объявления
      int s = maxValue + 1; // размер массива
      bool[] f = new bool[s];
      int i;
      // инициализировать элементы массива значением true.
      for (i = 0; i < s; i++)
        f[i] = true;
      // исключить заведомо не простые числа
      f[0] = f[1] = false;
      // решето
      int j;
      for (i = 2; i < Math.Sqrt(s) + 1; i++)
      {
        if(f[i]) // если i не вычеркнуто, вычеркнуть его кратные.
        {
          for (j = 2 * i; j < s; j += i)
            f[j] = false; // кратное – не простое число
        }
      }
      // сколько оказалось простых чисел?
      int count = 0;
      for (i = 0; i < s; i++)
      {
        if (f[i])
         count++; // увеличить счетчик
      }
      int[] primes = new int[count];
      // поместить простые числа в результирующий массив
      for (i = 0, j = 0; i < s; i++)
      {
        if (f[i]) // если простое
          primes[j++] = i;
      }
      return primes; // вернуть простые числа
    }
    else // maxValue < 2
      return new int[0]; // если входные данные не корректны,
                         // возвращаем пустой массив
  }
}
#194
(Правка: 2:21) 2:18, 1 дек. 2018

соплежуй этот пример я анализировал 5 лет назад,

пруф. см. комментарий на хабре https://habr.com/post/231325/

Страницы: 19 10 11 12 13 14 Следующая »
ПрограммированиеФорумОбщее