Nano Hash - криптовалюты, майнинг, программирование

Является ли такой логический метод плохой практикой?

Иногда я ловлю себя на том, что пишу логический метод, который выглядит так:

public bool isRunning()
    {
        if (!(move == Moving.None) && staminaRegan == true)
        {
            if (keyState.IsKeyDown(Keys.Space))
            {
                EntityAnimation.interval = 10;
                return true;
            }
            else
            {
                EntityAnimation.interval = 65;
                return false;
            }
        }
        else 
        {
            EntityAnimation.interval = 65;
            return false;
        }
    }

(Кстати, это XNA) Как вы можете видеть, у меня есть bool isRunning, в котором я сделал оператор if, в котором я проверяю, если (игрок движется) && (восстанавливает выносливость, для которой устанавливается значение false, когда выносливость достигает значения меньше, чем 6.0f), а затем я просто проверяю, нажат ли пробел, если да, то моя анимация работает быстрее (чем меньше интервал, тем быстрее меняется спрайт-лист), а затем она отправляет истинное значение, что означает, что проигрыватель запущен, иначе я не причина Пробел не нажимается.

И затем я должен повторить этот код «else» за пределами первого оператора if, чтобы он отправлял, что Player не работает, если Player не движется или его выносливость Regan ложна;

Итак, мне просто интересно, считается ли такой метод bool плохой практикой (когда вы повторно запускаете значение true и false во вложенном if, а затем возвращаете false вне вложенного if и повторяете тот же код)?

15.07.2016

Ответы:


1

Хорошей практикой является наличие одного оператора return внутри метода. Некоторые спорят об этом, но это мнение.

также рекомендуется сделать оператор if понятным, удалив ненужный код:

public bool isRunning()
{
    bool result = false;
    if (move != Moving.None && staminaRegan)
    {
        if (keyState.IsKeyDown(Keys.Space))
        {
            EntityAnimation.interval = 10;
            result = true;
        }
        else
        {
            EntityAnimation.interval = 65;
        }
    }
    else
    {
        EntityAnimation.interval = 65;
    }

    return result;
}
15.07.2016
  • Я согласен с тем, что один оператор return и он находится внизу, выглядит намного чище. И, поскольку вы уже изначально установили результат как false, его не нужно сбрасывать дальше в методе, что повышает удобочитаемость. 15.07.2016
  • Хорошей практикой является наличие одного оператора return внутри метода. Нет Принудительное вписывание кода в определенный шаблон, который не соответствует фактической выполняемой логике, — это плохо. См. также goodreads. com/quotes/ 15.07.2016
  • Да, это хорошая практика - иметь только одно заявление о возврате, это даже требуется в большинстве компаний, в которых я работаю. Код стал гораздо более читабельным, но еще важнее его лучше поддерживать. Я видел, как люди часами искали, почему недавно добавленный метод журнала непосредственно перед оператором retun в нижней части метода не выполняется. 01.08.2016

  • 2

    Метод имеет побочный эффект, поэтому это плохая практика:

     public bool isRunning()
    

    Глядя на сигнатуру метода, мы ожидаем только true/false ответа и ничего более. Однако метод меняет состояние экземпляра:

      ...
      if (!(move == Moving.None) && staminaRegan == true)
        {
            if (keyState.IsKeyDown(Keys.Space))
            {
                EntityAnimation.interval = 10; // <- Aaa! The interval is changed 
                return true;
            }
      ...
    

    Я предлагаю разделить исходный метод на свойство и метод

     // No side effect: just answer is running or not
     public bool IsRunning {
       get {
         return (move != Moving.None) && staminaRegan && KeyState.IsKeyDown(Keys.Space);
       }
     }
    
     // Put the right interval based on instance internal state 
     // (if it's running etc.)
     public void AdjustInterval() {
       if (IsRunning) // and may be other conditions
         EntityAnimation.interval = 10; //TODO: move magic number into constant 
       else 
         EntityAnimation.interval = 65; //TODO: move magic number into constant
     } 
    
    15.07.2016
  • Почему бы мне не изменить какое-то значение (другой общедоступной статической переменной класса) в методе bool, я просто меняю некоторые вещи, прежде чем возвращать true или false в bool:/ 15.07.2016
  • Потому что каждый метод должен делать только одну вещь. Вы должны сделать метод IsRunning и метод AdjustInterval. Затем вы можете сделать другой метод CheckRunningAndAdjustInterval, если хотите 15.07.2016
  • (Все это и ) Никаких сюрпризов! 15.07.2016

  • 3

    Вы можете переписать код следующим образом; тогда код не повторяется:

    public bool isRunning()
    {
        if (move != Moving.None && staminaRegan && keyState.IsKeyDown(Keys.Space))
        {
            EntityAnimation.interval = 10;
            return true;
        }
        else
        {
            EntityAnimation.interval = 65;
            return false;
        }
    }
    

    Или, если вам не нужен лишний else:

    public bool isRunning()
    {
        if (move != Moving.None && staminaRegan && keyState.IsKeyDown(Keys.Space))
        {
            EntityAnimation.interval = 10;
            return true;
        }
    
        EntityAnimation.interval = 65;
        return false;
    }
    

    Я бы подумал о том, чтобы ввести именованное логическое значение в самодокумент, и я бы переименовал staminaRegan в staminaIsRegenerating.

    public bool isRunning()
    {
        bool isMovingQuickly = (move != Moving.None) && staminaIsRegenerating && keyState.IsKeyDown(Keys.Space);
    
        if (isMovingQuickly)
            EntityAnimation.interval = 10;
        else
            EntityAnimation.interval = 65;
    
        return isMovingQuickly;
    }
    

    Однако самое главное, вы должны переименовать метод, чтобы более точно описать, что он делает:

    public bool CheckIfRunningAndSetAnimationInterval()
    
    15.07.2016

    4

    Я думаю, что мы пишем код для людей (других разработчиков), конечно, машина выполняет код, но 80% работы разработчика заключается в чтении кода.
    Основываясь на этом, я думаю, что поток чтения должен быть точно таким же, как поток выполнения кода - вот почему я думаю, что умножение оператора return неплохо, даже лучше, чем только один оператор возврата в нижней части вашего метода.

    15.07.2016
  • Компилятор должен распознавать более одного оператора return, и он должен выдавать ошибку. Это настолько нечитабельно и является самым большим поставщиком ошибок в истории программирования. 15.07.2016
  • @GuidoG: есть ли у вас какие-либо ссылки в поддержку вашего утверждения о том, что множественные операторы возврата являются крупнейшим поставщиком ошибок в истории программирования. Я регулярно сталкивался со сложным, запутанным кодом, вносящим ошибки при попытке реализовать один оператор возврата, в то время как код был бы значительно упрощен и более удобен в сопровождении, если бы имел несколько операторов возврата. 15.07.2016
  • Если метод в первую очередь будет делать только одно, то у нас не будет проблем с операторами многократного возврата. 15.07.2016
  • @PaulF Ever Just прочитал все книги о структурном программировании. Наличие более одного выхода в методе считалось плохой практикой, и, на мой взгляд, так и осталось. Да, структурное программирование устарело, но оно вдохновило oop 15.07.2016
  • @GuidoG: есть много аргументов относительно того, является ли SESE хорошей или плохой практикой и применима ли она ко многим другим современным языкам — мне просто было интересно прочитать любую информацию о том, что она является крупнейшим поставщиком ошибок в истории программирования. . 15.07.2016

  • 5

    Мне нравится этот стиль, и я тоже его использую. Во-первых, вы можете легче читать код, а во-вторых, это дает преимущество при отладке, поскольку вы можете устанавливать точки останова для отдельных случаев else. В противном случае вам нужно будет использовать условия точки останова.

    15.07.2016
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..