Считается ли выражение «если» методом? - PullRequest
49 голосов
/ 30 декабря 2011

Среди моих коллег возникла интересная дискуссия о том, считается ли утверждение "если" методом?Хотя к слову «if» добавляется оператор word, он по-прежнему ведет себя подобно простому методу невозвращаемого значения.

Например:

if(myValue) //myValue is the parameter passed in
{
    //Execute
}

Аналогичным образом метод может выполнить ту же операцию:

public void MyMethod(myValue)
{
    switch(myValue)
    {
        case true:
            //Logic
            break;
        case false:
            //Logic
            break;
    }
}

Правильно ли называть (рассматривать) оператор "if" простым предопределенным методом на языке программирования?

Ответы [ 14 ]

106 голосов
/ 30 декабря 2011

В таких языках, как C, C ++, C #, Java, IF является оператором , реализованным как зарезервированное слово, являющееся частью ядра языка. В языках программирования семейства LISP (на ум приходит Схема) IF является выражением (что означает, что оно возвращает значение) и реализовано в виде специальной формы. С другой стороны, в чистых объектно-ориентированных языках, таких как Smalltalk, IF действительно является методом (точнее: message ), обычно реализуемым в классе Boolean или один из его подклассов.

Итог: истинная природа условной инструкции IF зависит от языка программирования и от парадигмы программирования этого языка.

42 голосов
/ 30 декабря 2011

Нет, оператор if не похож на метод в C #. Рассмотрим способы, которыми он не похож на метод:

  • Сущности в содержащем блоке находятся в области видимости тела "if". Но метод не получает никакого доступа к среде привязки своего вызывающего.
  • Во многих языках методы являются членами чего-то - типа, вероятно. Заявления не являются членами.
  • В языках с первоклассными методами методы могут передаваться как данные. (В C # путем преобразования их в делегаты.) Операторы «if» не являются первоклассными.
  • и т. Д. Различия несметные.

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

decimal x = y + z;

и

decimal x = Add(y, z);

И на самом деле, если вы разберете сложение двух десятичных знаков в C #, вы обнаружите, что сгенерированный код на самом деле является вызовом метода.

Некоторые операторы имеют необычные характеристики, которые затрудняют их характеристику как методы:

bool x = Y() && Z();

отличается от

bool x = А (Y (), Z ());

на языке, который активно оценивает аргументы метода; в первом случае Z () не оценивается, если Y () ложно. Во втором оба оцениваются.

Ваше создание метода «if» скорее вызывает вопрос; реализация более сложна , чем оператор "if". Сказать, что вы можете эмулировать «если» с помощью переключателя, все равно, что сказать, что вы можете эмулировать велосипед с мотоциклом; заменить что-то простое чем-то гораздо более сложным не является убедительным. Было бы более разумно указать, что переключатель на самом деле является причудливым «если».

14 голосов
/ 30 декабря 2011

Вы не можете создать метод myIfStatement() и ожидать, что сработает следующее:

...
myIfStatement(something == somethingElse)
{
   // execute if equal
}
else
{
   // execute if different
}

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

myVariable = if(something == somethingElse);

if не может быть перегружен.

Это несколько признаков того, что if не является методом, но есть и другие, которые я подозреваю.

8 голосов
/ 30 декабря 2011

Конечно зависит от языка, но в C, java, perl, нет, это команды языка. Зарезервированные слова. Если бы они были функциями, вы могли бы перегрузить их, получить указатели на них и делать все остальное, что вы можете делать с функциями.

Хотя это скорее философский вопрос, чем вопрос программирования.

4 голосов
/ 30 декабря 2011

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

3 голосов
/ 19 января 2012

Считается ли оператор «если» методом?

Нет, это не считается методом, который вы, возможно, уже видели в других ответах. Однако, если бы ваш вопрос был - «Он ведет себя как метод?», Тогда ответ может быть да в зависимости от языка, о котором идет речь. Любой язык, который поддерживает первоклассные функции, может обойтись без встроенной конструкции / оператора, например if. Игнорировать все пушистые вещи, такие как возвращаемые значения и синтаксис, так как в основном это просто функция, которая оценивает логическое значение и , если , то это true, тогда он выполняет некоторый блок кода , Также игнорируйте OO и функциональные различия, потому что следующие примеры могут быть реализованы как метод класса Boolean на любом используемом языке, как это делает Smalltalk.

Ruby поддерживает блоки исполняемого кода, которые могут храниться в переменной и передаваться методам. Итак, вот пользовательская функция _if_, реализованная в Ruby. Материал внутри { .. } - это фрагмент исполняемого кода, который передается функции. Он также известен как блок в Ruby.

def _if_ (condition)
  condition && yield
end

# simple statement
_if_ (42 > 0) { print "42 is indeed greater than 0" }

# complicated statement
_if_ (2 + 3 == 5) {
    _if_ (3 + 5 == 8) { puts "3 + 5 is 8" }
    _if_ (5 + 8 == 13) { puts "5 + 8 is 13" }
}

Мы можем сделать то же самое в C, C ++, Objective-C, JavaScript, Python, LISP и многих других языках. Вот пример JavaScript.

function _if_(condition, code) {
    condition && code();
}

_if_(42 > 0, function() { console.log("Yes!"); });
3 голосов
/ 30 декабря 2011

Считая оператор if методом, он, на мой взгляд, только сбивает с толку.Сходство с вызовом метода просто поверхностно.

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

Псевдокод:

load myValue, reg0
test reg0
jumpeq .skip
  ; code inside the if
.skip:

Если вы используете else, вы получите два перехода:

load myValue, reg0
test reg0
jumpeq .else
  ; code inside the if
  jmp .done
.else:
  ; code inside the else
.done:
3 голосов
/ 30 декабря 2011

Конечно, вы можете написать If() и IfElse() методы, но это не делает их одинаковыми.

if() определяется как оператор на языке на том же уровне, что и вызовы методов. Но есть различия в синтаксис и возможности оптимизации.

Итак: Нет, оператор if() не является методом . Например, вы не можете не назначать его делегату.

2 голосов
/ 21 января 2012

Да , if - это функция в некоторых языках, хотя это редко и использование ограничено.

Обычно эта конструкция похожа на if(booleanCondition, functionPointerToCallIfConditionTrue, functionPointerToCallIfCondtionFalse) Она сама может быть использована в качестве делегата для других функций, если хотите.

Mathematica, например, ведет себя так, и даже C # может сделать это с небольшим трудом, если вы используете выражения Linq; Взгляните на System.Linq.Expressions.Expression.IfThenElse.

2 голосов
/ 04 января 2012

Оператор IF - это условная конструктивная особенность, используемая в большинстве языков, которая выполняет поток пути из булевой оценки условия true или false.Помимо случая предикации ветвлений, это всегда достигается путем выборочного изменения потока управления на основе некоторого условия.

Конструкция IF является самой базовой и необходимой логикой, используемой при программировании.Это позволяет вводить строительные блоки для функций.

...