C#: Реорганизация калькулятора чисел Рейнольдса

Я пытаюсь изучить C# на выходных и выполняю 15 упражнений, найденных здесь: http://www.jobsnake.com/seek/articles/index.cgi?openarticle&8533

Вчера я задал аналогичный вопрос для последовательности Фибоначчи и получил отличные ответы, которые познакомили меня с элементами C#, с которыми я раньше не сталкивался: Рефакторинг алгоритма Фибоначчи

Сегодня я хотел бы увидеть, как джедай C# реорганизует следующий код:

static string Reynolds(int d, int v, int rho, int mu)
{
    int number = (d*v*rho) / mu;
    if (number < 2100) return "Laminar Flow";
    else if (number < 2100 && number < 4000) return "Transient Flow";
    else return "Turbulent Flow";
}

Так проще, чем вчера, но есть ли хороший способ справиться с множеством условных выражений?

С уважением,

Крис

Вам следует изменить параметры на двойные, поскольку большинство физических значений являются действительными числами. Ваш else if должен проверять число> = 2100, поскольку, если "число <2100" ложно, то "число> = 2100" истинно. Другими словами, вам нужно проверить, находится ли число от 2100 до 4000, или 2100 <= число <4000.

jason 03.01.2009 06:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
693
2

Ответы 2

Используя тернарный оператор C#,

   static string Reynolds(int d, int v, int rho, int mu)
    {        
       int number = (d*v*rho) / mu; 
       return number <  2100? "Laminar Flow":
              number >= 4000? "Turbulent Flow":
                              "Transient Flow";
    }

или (чтобы дать моей саркастической стороне немного свободы), если вы обнаружите, что это не удобочитаемый, вы можете добавить комментарии, чтобы сделать его более читаемым,

static string Reynolds(int d, int v, int rho, int mu)
{        
   int number = (d*v*rho) / mu; 
   return /*IF*/ number <  2100? /*Then*/ "Laminar Flow":
          /*IF*/ number >= 4000? /*Then*/ "Turbulent Flow":
                                 /*Else*/ "Transient Flow";
}

Кто-нибудь действительно думает, что это помогает?

Это компактно, но не очень читаемо. Хотя он этого не просил. :)

BobbyShaftoe 03.01.2009 06:23

Крик ick ick. Связанные тройки == дьявол.

Juliet 03.01.2009 06:27

Это как раз тот пример функционального программирования, который можно увидеть в OCaml или Haskell. Почему бы не писать на C#?

yfeldblum 03.01.2009 08:16

Не думаю, что комментарии сделают его более читабельным. Неплохое решение. Это предпочтение стиля. Я предпочитаю иметь вложенные if, иногда я могу решить, что хочу добавить дополнительный код. Я, конечно, использую троичные, редко использую вложенные троичные.

BobbyShaftoe 07.01.2009 11:46

Я думаю, что в вашем коде есть ошибка, но я сделал предположение. Ваше второе «если» никогда не будет оценивать дерево, поскольку число <2000 уже делает первую ветвь истинной.

Я бы создал ENUM:

enum FlowType
{
    Laminar
    , Transient
    , Turbulent
};


static FlowType Reynolds(int d, int v, int rho, int mu)
{
    int n = (d*v*rho) / mu;

    if (n < 2000)
    {
        return FlowType.Laminar;
    }
    else if (n < 4000)
    {
        return FlowType.Transient;
    }
    else
    {
        return FlowType.Turbulent;
    }
}

«N> = 2000» является избыточным, вы можете опустить его без изменения семантики кода.

Juliet 03.01.2009 06:28

Как указано в коде, вам нужно изменить тип возвращаемого значения. Вы закодировали метод так, как если бы вы возвращали значения типа FlowType, но в сигнатуре метода указано, что вы возвращаете строки. Также нет необходимости в тесте n> = 2000.

jason 03.01.2009 06:29

Я был в перерывах между редакциями. Кроме того, что касается необязательной проверки> = 2000, проблема заключалась в том, что в оригинале была ошибка, которую забыли удалить при исправлении оригинала.

BobbyShaftoe 03.01.2009 06:44

Другие вопросы по теме