단락 평가는 언제 나쁜가요?


12

좀 더 명확하게 말하면, 나는 다른 언어로 많은 시간을 보냈다고 말할 것입니다. 그러나 지금까지는 항상 사용하거나 전혀 지원하지 않습니다.

이제 VB.net이 필요한 프로젝트부터 작업을 시작했으며 ANDANDALSO 측면에서 두 가지 방법을 모두 제공합니다 . 첫 번째는 단락되지 않으며 두 번째는 단락되지 않습니다.

그래서 이것이 왜 궁금해합니까? 이와 같이 설정하면 모드를 전환하려고 할 때가 자주 나타납니다. 그러나 Short Circuit 을 사용하는 것이 좋지 않은 상황은 생각할 수 없습니다 .

나는 이것이 훨씬 더 많은 옵션에 들어갈 수 있다는 것을 알고 있습니다. 그래서 이것을 다른 곳에 두어야 할 경우 어디에 있는지 알려주십시오.

비록 적어도 두 가지 옵션을 모두 사용하는 것이 왜 가능할 때 항상 단락을 수행하는 것이 더 좋은지에 대한 공식적인 대답이 있기를 바랍니다 .



답변:


5

논리식의 일부 용어는 부작용이있을 수 있습니다. 모든 부작용이 명시된 순서대로 발생하도록해야하는 경우가 종종 있으며, 건너 뛰지 않고 논리를 안내하는 평가 결과입니다.

if not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

다른 경우에는 이전 평가에서 false를 반환하면 나머지 항을 평가하지 않으려 고합니다.

if IsAirborne() and not (PushAirPlane(thrust) and TurnAirplane(vector)), SimulateCrash(severity)

어떤 사람들은 두 번째 예에서 단락 동작에 의존하는 것이 나쁜 형태라고 주장하지만 코딩 스타일과 신념 시스템에 들어가고 있습니다. 세상에는 언어가 제공하는 거의 모든 기능에 의존하는 매우 좋은 코드가 많이 있으며, 그것이 바로 그 방법입니다.

VB의 ANDALSO는 선명하고 연습을보다 수용 가능하게하려는 시도 인 것 같습니다.

JimmyJames가 그의 답변에서 지적했듯이 단락 평가와 관련하여 성능에 영향을 미칠 수 있습니다. 메커니즘을 제공하지 않는 언어는 항상 표현식의 모든 용어를 평가하지만이를 제공하는 언어는 추가 분기 명령문을 생성 할 수 있습니다. 어느 쪽이든 각 용어를 평가하는 데 필요한 처리 단계 수와 컴파일러 및 CPU 아키텍처에 따라 크게 달라집니다. 코드에서 병목 현상이 측정되고이를 완화하는 방법을 찾아야 할 때까지는 일반적으로 이러한 사항에 신경 쓰지 않습니다. 코드에서 단락 평가를 허용하는 것과 관련된 규칙은 코드가 느려질 가능성이 거의 같으며 조기 최적화는 총 시간 낭비 일 수 있으므로 항상 측정하고 최적화하십시오.


4
실제로는 정확하지만 훌륭한 디자인은 아닙니다.
Robert Harvey

2
@RobertHarvey, 부작용이없는 제어 시스템을 작성할 수 없으며 결과에 반응하지 않으면 시스템을 올바르게 제어 할 수 없습니다. 다시 말해, 그것을 극복하십시오;).
jwdonahue

7
아니요, 그러나 부작용 효과의 결과를 부울 변수에 할당하고 if조건 에서 해당 변수를 확인 하고 여전히 단락시킬 수 있습니다. 나는 그것이 어떤면에서 문체 적 구별이라는 데 동의하지만, 사물을 명백하게 만드는 미덕을 가지고 있습니다.
Robert Harvey

3
@jwdonahue 혼란의 위험이 적다면 "큰 단어"를 사용해도됩니다. 이와 같은 코드 블록의 혼란과 특정 뉘앙스가 누락 될 위험은 매우 높으며 논리에 치명적일 수 있습니다. 독서 개발자를 매우 어렵게 생각하는 것은 결코 좋지 않습니다.
jpmc26

5
"논리적 표현의 일부 용어는 부작용이있을 수 있습니다"-이 개시 내용은 정확하지만 부작용에 의존하는 것이 나쁘다는 것을 지적하지 않으면이 답변이 실패한다고 생각합니다 . 실제로 가짜 평가를 방지하기 위해 단락 평가에 의존하는 것보다 훨씬 나쁩니다. 이 답변이 제안하는 것은 나쁜 형태 일 수 있습니다.
aroth

20

분명히, 당신의 질문은 단락이 일반적으로 좋은지 나쁜지가 아니라 VB.NET이 왜 연산자를 제공하는지 여부에 대한 것입니다. 이를 염두에두고

단락 평가는 언제 나쁜가요?

이전 버전과의 호환성을 위반할 때 입니다.

이제 VB.NET은 이전 VB6 또는 VBA와 호환되지 않지만 언어의 특정 부분은 이상적입니다. 이전 AND 및 OR 의미 체계 (단락없이)를 유지하기로 한 Microsoft의 결정에 따라 이전 VB 프로그램을 VB.NET으로 포팅 할 때 큰 범주의 오류가 발생할 가능성이 줄었습니다.

반면에 VB.NET 언어 디자이너는 아마도 단락이 좋은 것에 대한 당신의 의견을 공유했을 것입니다. 올바르게 기억할 때 첫 번째 VB.NET 시험판 버전은 AND 또는 OR 연산자에 단락을 제공했지만 개발자 피드백은 VB.NET 1.0이 나타나기 전에 MS 가이 결정을 철회해야합니다. 따라서 디자이너는 새로운 키워드 ANDALSOORELSE하위 호환성 및 유용성 간의 균형을 유지하면서 키워드를 구현하기로 결정했습니다 .

IMHO 이것은 좋은 결정이었습니다. 지난 10 년 동안 몇 가지 오래된 프로그램을 포팅해야했으며 AND 및 / 또는 OR을 포함하여 모든 논리 표현에 대해 큰 영향을 분석 할 필요가 없었으므로 해당 작업을 훨씬 쉽고 경제적으로 만들었습니다. 반면에 VB.NET에서 새로운 논리식을 작성해야 할 때마다 연산자에 대한 기본 선택은 단락 형식입니다. 즉 C, C ++, C # 등에서 익숙한 것입니다. ANDALSO에 4자를 더 입력 해야하는 경우에도 간결한 형태로 여러 관용구를 작성해야합니다.

확신이 없다면 Martian 헤드셋 에 관한 Joel Spolsky의 훌륭한 기사를 읽어보십시오 . 이는 구성 요소 또는 언어 또는 API가 특정 크기의 사용자 기반에 도달 한 후 소프트웨어 개발의 초기 설계 결정을 쉽게 취소 할 수없는 이유에 대한 것입니다. .


좋아, 이것은 맹목적으로 자격이 있으며 화성 헤드셋에 대한 링크는 전혀 관련이없는 것 같습니다.
jwdonahue

6
@ jwdonahue : 나는 이것이 왜 그 소리라고 생각하는지 전혀 모른다. Martian 헤드셋에 관한 기사는 수십 년 전에 만들어진 소프트웨어 개발의 일부 디자인 결정이 스테이크의 구성 요소 또는 언어 또는 API가 특정 크기의 사용자 기반에 도달 한 후 쉽게 취소 할 수없는 이유에 대한 것입니다. 비유가 실제로 이해하기 어렵지 않습니까? VB6은 과거 에 매우 인기 가 있었으며 , 여전히 전 세계 수십만 개의 회사가 VB6 또는 VBA에서 미션 크리티컬 앱을 실행하고 있다고 확신합니다.
Doc Brown

"화성 머리 기사"기사가 실제로 어떻게 적합한 지 잘 모르겠습니다. X와 Y 사이의 상호 운용성 (예 : 너트와 볼트)을 보장하는 데 필요한 것은 X와 Y에 대한 별도의 표준을 가져야하며 최악의 너트는 지정된 것보다 약간 나쁘게 볼트를 수용하고 그 반대도 마찬가지입니다. 너트 나 볼트를 불필요하게 비싸게 만들거나 너트와 볼트 사이에 불필요한 양의 슬로프가 생기지 않도록 사양을 작성해야합니다. 양쪽에 봉사하십시오.
supercat

3
@ supercat : 이것은 이미 존재하고 사용중인 수조 개의 너트 (또는 VB6 코드 라인)에 관한 것이며 이제 볼트 (또는이 경우 VB 컴파일러)는 새로운 세대로 대체 될 것입니다. 기존 너트가 비 메트릭 볼트에만 적합하면 최신 볼트 만 메트릭 시스템으로 만드는 것이 경제적이지 않습니다.
Doc Brown

tl; dr : VB는 1964 년부터 시작된 언어 인 BASIC의 방언이며, BASIC에서는 And연산이 단락되지 않으며 SQL (1974), FORTRAN (1956) 또는 Pascal (1970)에서도 작동하지 않습니다.
Ben

3

단기 평가는 언제 나쁜가요?

그들은 될 나쁜 곧 당신은 당신이 부울 전체 결과의 평가에서 실행될 것으로 예상 식의 부작용에 의존하기 시작하면,.


1

주의 사항 : 이것은 거의 모든 경우에 개발자가 그것에 대해 걱정할 필요가 없다는 점에서 약간 난해합니다. 그러나 ... 실행시 분기를 생성하므로 조건부 평가로 인해 성능이 저하 될 수 있습니다. 비 단락 동작은 분기되지 않으며보다 예측 가능합니다.

이것이 드물게 중요한 이유는 비용이 일반적으로 작고 일반적으로 두 번째 (또는 세 번째 등) 상태를 평가하는 비용보다 중요하기 때문입니다. 이것은 고성능이 필요할 때 계산 비용이 많이 드는 루틴에서만 중요하며 여전히 중요하지 않을 수 있습니다.


나는 지금까지 논리적 진술 만 최적화 할 수 있다고 생각합니다. 결국 지점을 가져 가야합니다.
jwdonahue

@jwdonahue 나는 당신의 요점을 얻지 못합니다. 죄송합니다.
JimmyJames

우리는 여기서 조합 논리에 대해 이야기하고 있습니다. 단락 평가 여부에 관계없이 이전 용어의 결과에 따라 평가해야하는 용어가 하나 이상 있습니다. 따라서 분기가 포함됩니다.
jwdonahue

1
@jwdonahue 물론 모든 단락은 추가 분기입니다. 예를 들어, 두 번째 표현식이 관련이없는 경우에도 두 번째 표현식을 실행하기 전에 두 번째 표현식을 실행하는 것이 첫 번째 결과를 확인하는 것보다 빠릅니다. 다시 말하지만, 이것은 거의 중요하지 않습니다. 누군가 나를 위해 만든 사례는 간단한 평가가 많은 행렬 곱셈과 같은 것입니다.
JimmyJames

1
답변을 크레딧으로 업데이트했습니다.
jwdonahue

0

파스칼은 AND와 OR가 단락 평가를 사용할지 여부를 정의하지 않아 두 세계에서 최악의 결과를 낳습니다.

C 및 C ++에는 비트 연산이 있습니다. 실제로 비 단락 회로를 제공합니다. 그리고 컴파일러는 눈에 띄는 차이가 없다면 원하는 방식으로 자유롭게 평가할 수 있습니다.


@ 중복 제거기 : 언급 한 바와 같이, Pascal AND / OR가 단락 평가를 사용할지 여부를 정의하지 않았습니다 . 그것은 "알지 못함"을 의미합니다.
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.