Разграничение AOP и транзакции является соответствием, сделанным на небесах. Мы используем AOP Spring @Transaction аннотации, он делает для более легкого и более интуитивного tx-разграничения, чем я когда-либо видел где-нибудь еще.
Это называется оценкой короткого замыкания .
Обычно это верно для языков, производных от C (C, C ++, Java, C #), но не для всех
Например, VB6 не делает этого, и этого не было в ранних версиях VB.NET. VB8 (в Visual Studio 2005) представил для этой цели операторы AndAlso и OrElse .
Кроме того, из комментариев кажется, что csh выполняет оценку короткого замыкания справа налево , чтобы еще больше запутать ситуацию.
Также следует отметить, что оценка (или отсутствие таковой) короткого замыкания имеет свои опасности, о которых следует знать. Например, если второй операнд является функцией, имеющей какие-либо побочные эффекты, тогда код может работать не так, как задумал программист.
Coldfusion изначально выполняет краткосрочную оценку. Я уверен, что все разработчики CF написали:
<cfif isdefined("somevariable") and somevariable eq something>
//do logic
</cfif>
Это называется оценкой короткого замыкания и является общим для всех языков с которыми я когда-либо работал (C, C ++, C #, Java, Smalltalk, Javascript, Lisp), кроме VB, VB.NET и Fortran.
На самом деле это довольно полезная функция. Без короткого замыкания вы не смогли бы этого сделать:
if (a != null && a.isBlank())
Без короткого замыкания вам пришлось бы иметь вложенные операторы if, потому что вторая часть выдала бы ошибку, если бы a было нулевым.
Большинство языков (все, что я видел) используют оценку короткого замыкания для УСЛОВНЫХ операторов, таких как && и ||. Они прекратят оценку, как только одно из условий удовлетворяет требованию. (Первая ложь на &&. Первая истина на ||)
Все БИНАРНЫЕ операторы, такие как & и |, обрабатываются. (Исходный)
Обрабатываются все БИТСТРЕННЫЕ операторы, такие как & и |. (Изменить: 5/10/17)
В Erlang операторы и
и или
не выполняют оценку короткого замыкания; вы должны использовать операторы orrelse
и , а также
, если вам нужно поведение короткого замыкания.
Это верно и для Java, но операторы | и т.д. будут оценивать обе стороны.
Microsoft VBScript (часто используемый в сочетании с «классическим» ASP) не имеет оценки короткого замыкания для логических операторов, вместо этого используется побитовая оценка. Это одна из многих причин, по которым это, возможно, худший язык на свете!
«Дело в том, что VBScript - это не логично. VBScript является побитовым. Все так называемые логические операторы работают на числах, а не на логических значениях! Not, And, Or, XOr, Eqv и Imp все преобразовать свои аргументы в четырехбайтовые целые числа, выполните логическую операцию над каждая пара битов в целых числах и вернуть результат. Если True равно -1 и False равно 0, тогда все работает, потому что -1 все его биты включены и 0 все биты отключены. Но если другие числа попадут туда, все ставки отменены ».
Взято из этого блога. Эрика Липперта.
В Аде есть специальные сокращенные формы условных выражений:
and then
or else
используется следующим образом:
if p.next /= null and then p.next.name = 'foo'
if x = 0 or else 1/x = y
В некотором смысле это приятно, потому что вы можете сделать вывод, что программист знал, что выражение должно быть короткое замыкание и что условие не работает случайно.
Это верно для языков, которые являются «потомками» C: PHP, Java, C ++, C #, ... или в том же «вдохновении», как Perl.
Но это неверно для VB (по крайней мере, до .NET, который ввел для этого новые ключевые слова).
(И это действительно беспокоит вас, когда вы впервые работаете с VB ^^)
В исходной версии Паскаля этого не было, что вызвало много горя. Современные Паскали, такие как Delphi, работают так же, как C и др.
Это называется оценкой короткого замыкания , и большинство языков это делают. В некоторых языках существуют операторы, которые этого не делают.
Верно ли это для ВСЕХ языков, таких как JAVA, C # и т. Д.?
В C # это верно только для короткозамкнутых операторов ' ||
' и ' &&
'; если вы просто используете « |
» или « &
», он будет оценивать обе стороны каждый раз.
Это неверно для VB6.
В VB.net вам нужно использовать «AndAlso» вместо «And», если вы хотите пропустить вычисление второго выражения.
MATLAB - это один язык, который различает «стандартные» логические операторы и операторы короткого замыкания :