범위를 나타 내기 위해 공백과 {}를 사용하는 언어의 장단점은 무엇입니까? [닫은]


17

범위를 나타 내기 위해 공백이나 괄호와 같은 토큰을 사용하는 것이 더 나은지 여부에 대해 충돌이있는 것 같습니다. 일관성없는 들여 쓰기 문제에 대한 파이썬의 솔루션을 칭찬하는 많은 것을 보았지만 많은 사람들이 동의하지 않았습니다.

토큰으로 공백이있는 언어는 죽어야합니다.

같은 답변에 나중에 게시 :

나는 실제로 그것을 시도 할 때까지 일종의 공백 방지 토큰이었습니다. 내 개인 공백 레이아웃이 파이썬 랜드의 모든 사람이 사용하는 것과 거의 일치하는 데 도움이되었을 것입니다. 어쩌면 내가 약간 미니멀리스트이지만 어쨌든 들여 쓰기를 원한다면 왜 {}을 귀찮게합니까?

각 측면에 대한 명확한 주장을 볼 수 있습니다.

공백 사용하기 :

  • 코드에서 일관성없는 들여 쓰기를 줄입니다.
  • 동일한 목적을 위해 보이는 토큰을 공백으로 대체하여 화면을 지 웁니다.

토큰 사용 :

  • 코드를 다른 수준으로 잘라내어 붙여 넣기가 훨씬 쉬움 (들여 쓰기를 고칠 필요가 없음)
  • 더 일관된. 일부 텍스트 편집기는 공백을 다르게 표시합니다.
  • 현재 더 인기가 있습니다.

내가 놓친 점이 있습니까? 당신은 어느 것을 선호합니까? 오랫동안 서로 협력 한 후 지혜로운 말이 있습니까?


추신. 언어가 각 제어 구조에 대해 동일한 토큰을 사용하지 않을 때 나는 그것을 싫어합니다. VB는 그것 End IfEnd While진술 로 정말 성가시다 . 대부분의 다른 언어는 모든 것에 {}를 사용한다. 그러나 그것은 다른 질문에 대한 주제 일 것입니다 ...


2
"잘라내 기와 붙여 넣기가 훨씬 쉽다"고 말하지 않았습니다. 조금 더 쉽습니다.
Kugel

1
코드 블록을 작고 체계적으로 유지하는 한, 토큰은 중요하지 않습니다 ... 그런데, '거룩한 전쟁'태그를 좋아하십시오. lol
Scott

"일부 텍스트 편집기는 공백을 다르게 표시합니다.": ?? "현재 더 인기가 있습니다.": 인기는 종종 아이디어의 품질과 관련이 없습니다.
조르지오

나는 공백 구문을 좋아하고 CoffeeScript와 Haskell의 코딩을 좋아했습니다 (예, 열심히 알고 있습니다). JavaScript와 C로 많은 것을 코딩했으며}로 돌아갈 수 없습니다. ) : 그러나 리스프의 표현식을 그들이 상자 div를 교체 할 때 가장 생각입니다
aoeu256는

공백 만 사용하면 오류를 찾기가 더 어려워집니다. 예를 들면 다음과 같습니다. stackoverflow.com/questions/21205836/… OP의 코드와 답변의 유일한 차이점은 추가 공간입니다. for 루프 안에있는 코드와 구분되지 않는 코드를 구분하는}가있는 것이 훨씬 명확합니다.
AncientElevator

답변:


15

많은 프로그래머 (자체 포함)가 모든 결정을 "논리 화"하는 경향이 있다고 생각합니다. 괜찮지 만 모든 질문에 논리적 대답이있는 것은 아닙니다. 예를 들어, 요리사가 사과 파이 대 체리 파이의 장단점을 묻는 chefoverflow에 질문이 게시되는지 의심합니다. 당신이 더 좋아하는 질문입니다.

그 점을 염두에두고 가장 간단한 대답은 "일부 괄호를 좋아하는 사람들, 공백을 좋아하는 사람들"이라고 말하는 것입니다.



또한 어떤 사람들에게는 프로 인 것이 다른 사람들에게는 사기가 될 수 있습니다.
래리 콜맨

훌륭한 지적입니다. 개인적으로 나는 그들이 함께 일한다고 생각합니다.
Michael K

8
나는 당신의 비유에 동의하지 않습니다. 공백에 의존하는 구문은 그것을 좋아하는 프로그래머들조차도 프로그래머의 생산성을 저해한다고 믿을만한 객관적인 이유가 있습니다. 사람들이 시안화물의 맛을 좋아하지 않는다고 말하는 것과 비슷합니다. 모두가 유독하다고 말할 때 모든 사람들이 단지 '논리 화'합니다. 아니요. 얼마나 좋아하든 상관없이 여전히 당신을 죽일 것입니다.
Timwi

4
추신 : 당신이 실제로 찾고있는 단어는 합리화 입니다. 또한 모든 사람 은 프로그래머뿐만 아니라 합리화하는 경향이 있습니다.
Timwi

11

완전한 팬보이처럼 들릴 위험이 있기 때문에 공백이 "코드의 일관성없는 들여 쓰기를 줄이는 데 도움이된다"고 주장하는 사람들은 Visual Studio를 사용한 적이 없다고 생각합니다. 단일 명령 (기본 단축키는 Ctrl + K, D라고 생각)으로 모든 들여 쓰기가 즉각적으로 일관됩니다 ¹. 또한 코드를 붙여 넣을 때 아무 것도 할 필요없이 들여 쓰기가 즉시 수정되며 새 코드를 작성 if하거나 다른 블록에 무언가를 줄 바꿈 할 때도 마찬가지입니다 (재 포맷 }은 입력 됨). 또한, 완료된 명령문 이후에 Enter를 누르면 이전 명령문이 추가로 들여 쓰기 된 경우에도 항상 다음 명령문에 대해 올바른 들여 쓰기 레벨에 커서를 놓습니다.if또는 그와 유사하게, 진술이 아직 if끝나지 않았을 때 우연히 생각하기가 매우 어렵습니다 .

내가하려고하는 요점 은 Visual Studio가 훌륭하다는 것이 아닙니다 . 내가하려고하는 요점은 IDE가 들여 쓰기 수정 (및 기타 서식 문제)을 자동화 할 수 있지만 프로그램의 의미가 형식에 의존하지 않는 경우에만 가능하다는 것입니다. 이를 통해 프로그래머는 실제 프로그래밍 작업에 집중할 수 있습니다. 파이썬과 같은 구문은 비생산적입니다. 들여 쓰기 자체가 일부 의미를 지정하기 때문에 파이썬 코드의 들여 쓰기를 "수정"할 수있는 IDE를 작성할 수 없습니다.


¹ (VS는 포맷을 거부하는 특별한 경우, 즉 여러 줄에 걸쳐있는 배열 리터럴을 알고 있지만 요점 옆에 있습니다.)


8
파이썬 들여 쓰기는 누군가가 알아 차리지 않고 깨지지 않기 때문에 수정이 필요하지 않습니다! C #에 대해 Purify (메모리 누수를 감지하는 데 도움이되는 프로그램)를 작성하는 것은 불가능하지만 C ++ 메모리 관리가 우수하다는 의미는 아닙니다.
dbkk

2
@Dean : 왜 많은 사람들이 모든 것에 Resharper가 필요하다고 생각합니까? 당신이 설명하는 것은 이미 Resharper가없는 Visual Studio에 있습니다.
Timwi

2
@dbkk : if어디서나 줄 을 추가하자마자 들여 쓰기가 중단됩니다 . 그런 다음 들여 쓰기를 수동으로 수정해야합니다.
Timwi

2
들여 쓰기가 게으르고 일관성이없는 팀에서 일하지 않았을 것입니다. 코드 차이가 불가능하기 때문에 수정하지 않는 것이 좋습니다.
Kevin

2
@Kevin : 맞아요. 솔직히 말하고 싶지 않아요. 난 단지 원인이 한 가지에 그것의 모든 고정 주장하는 것 중 하나 를 읽을 수 DIFF 단지 사소한 공백 및 수정 모든 미래의 차이점에 영향을 미칩니다. 다른 것은 프로젝트에 비생산적이고 유해 할 것입니다.
Timwi

3

개인적으로 나는 코드가 다른 범위에 있음을 깨닫게하기 위해 자체 줄에 토큰을 두어 빈 줄을 도입해야한다는 것을 알았습니다.

파이썬 사람들이 갈 때 나는 그것을 싫어한다.

if something
    do something
    do somethingelse

    cleanup
else
    do the other thing

토큰 랜드에있는 동안 사람들이 복사하여 붙여 넣기를 하고 들여 쓰기를 정리하지 않으면 싫어 합니다 .

if something
{
I have been too lazy
      {
            to clean up
            }
what I pasted
}

또는 토큰에 별도의 줄을 사용하지 마십시오 .

if something {
    I find this confusing
}
else {
especially when combined with the previous 
do something
}

세 가지를 모두 읽을 수는 있지만 예상대로는 아니며 구문 분석을 위해 노력해야 하며 Joel이 말한 것처럼 작동하지 않으면 좌절하게 만듭니다.


3

장점 : 내가 아는 한 파이썬 세계에는 들여 쓰기 / 중괄호 배치 거룩한 전쟁이 없습니다. 개발자를 대신하여이 결정을 내리면 약간의 고통을 덜었을 것입니다.

단점 : 익명 함수는 한 줄로 제한됩니다. 사운드는 좋아하지만 자주 자신이 멀티 라인까지 작성 찾을 수 있습니다 lambda(에 주로 피드 계획에들 map또는 apply이 별도로 선언하는 의미가 없습니다 것입니다, 그래서 정확히 한 곳에서).



여러 줄 표현은 파이썬에서 지원됩니다. 줄 끝에 \를 넣으면됩니다.
dbkk

8
공평하게 말하면, 여러 줄 람다가 없다는 것은 일반적으로 공백이 아니라 파이썬의 한계입니다. 공백으로 구분 된 언어에서 람다를 도입하고 들여 쓰기 된 블록이 따라 오면 블록이 람다 본문으로 사용됩니다.
자기주의 사항-이름을 생각하십시오

@Note-예, 그렇습니다. 파이썬은 내가 경험 한 유일한 공백 구분 언어입니다. @ dbkk 그래서 구문 오류를 반환 lambda n: a = n \\na.sort() \\na[0:3] 하지 않을 것이라고 말하고 있습니까? `\`속임수를 사용하면 한 줄로 된 람다를 여러 줄로 나눌 수 있지만 실제 줄이 두 개 이상인 것은 아닙니다 .
Inaimathi

Haskell, CoffeeScript는 공백을 사용하지만 한 줄 람다 제한은 없습니다.
aoeu256

3

{}는 중복성을 추가합니다. 중복이 너무 많으면 나쁘지 않습니다. 그리고 수동으로 입력하는 것은 좋지 않습니다. 사용하기 어려운 경우.

따라서 IDE가 나쁘거나없는 경우에는 공백 스타일이 약간 나을 수 있습니다. 그러나 강력한 IDE를 사용하면 중괄호가 더 좋습니다.


1
중복이라고 생각하면 좋을 것 같습니다. 나는 Clang의 코드에 대한 Fix-Its를 발행하려는 매우 흥미로운 시도에 따라 컴파일러에 대한 파서 복구에 대해 숙고하고 있으며 여기에서 실제로 도움이되는 것은 중복성이 있다는 것입니다. 따라서 완벽한 세상에서는 훌륭하지만 실제로는 실제 프로그래밍에 해를 끼치는 중복성이 없다고 생각합니다. 일반적으로 중복 정보 출처가 일치하지 않을 경우 오타 / 실수로 인한 것일 수 있습니다. 중복성이 없으면이 잠재적 오류는 감지되지 않습니다! 즉, 나는 중괄호를 선호하지 않습니다;)
Matthieu M.

"Noise"는 Erik Meijer가 Haskell 비디오에서 사용한 단어입니다.
16764

블록을 삭제하고 그 반대로 삭제하거나 실수로 {를 삭제하는 것을 잊어 버린 경우 어떻게해야합니까? 중복성은 DRY IMO에 반합니다.
aoeu256

2

공백 언어로 찾은 문제는 여러 페이지 조건식에서 발생했습니다. 2 페이지 중간에 줄을 추가하고 모든 혼란 속에서 한 칸씩 내리면 코드의 논리가 크게 변경 될 수 있습니다. 그리고 누군가의 코드가 "정확한"경우에도 읽으려고하면 끔찍한 추측 게임이됩니다. 이 "그렇지 않은"것은 어느 것입니까? 보이지 않는 공백 문자를 계산할 수있는 것보다 중괄호를 훨씬 쉽게 계산할 수 있습니다. 이 사이트의 게시 기계는 계속해서 하나의 공간으로 부수고 있습니다.

IMHO "{{{{{" is more reliable than "     ".

9
여러 페이지 조건식을 사용하면 다른 문제가 있습니다. 하지 마십시오. 실제로 중괄호를 사용하더라도 코드를 읽을 수없는 혼란이됩니다. 이것은 실제로 공백 들여 쓰기의 또 다른 이점입니다. 이렇게 끔찍한 코드를 작성하지 못하게합니다.
Konrad Rudolph

1
정말 조건부 여러 페이지 길이?
Winston Ewert

2

나는 그것이 실제로 라고 생각하지 않습니다 .
Pythoneers는 종종 중괄호 프로그래머가 들여 쓰기를 쉽게 위반하는 것처럼 비판합니다.
사실 나는 파이썬과 들여 쓰기 범위를 알기 전에도 항상 100 % 일관된 들여 쓰기를 사용했습니다.

사실은 중괄호 언어가 컴파일러에서 올바른 들여 쓰기를 부과 할 수 있으며 두 가지 이점을 모두 활용할 수 있습니다. 보다? 아니 전혀.

Pythoneers는 들여 쓰기가 구문의 일부일 때 중괄호가 쓸모 없다고 주장하지만 중괄호는 가독성을 향상시키지 않습니다. 파이썬 프로그래밍을 시도했는데 매우 흥미로운 언어이지만 if-elif2 ~ 3 개 이상의 들여 쓰기 수준의 체인 을 사용해 보셨습니까? 그들은 더 이상 깔끔하게 보이지 않습니다.

추신 : 나는 중괄호를 썼지 만 더 일반적인 방식으로 구분 기호 토큰을 의미합니다. 여는 중괄호는 중복으로 표시 될 수 있지만 언어는 다음과 같이 진행될 수 있습니다 (사실 정확히 이와 같은 언어가 있지만 확실하지는 않습니다).

if condition:
    statement
    other_statement()
end

PS2 : 2019,이 답변 후 4 년. 나는 파이썬을 배웠고 의미 론 들여 쓰기에 완전히 익숙해졌으며 전혀 읽기가 어렵지 않습니다. 특히 들여 쓰기 블록을 식별하는 데 도움이되는 세로 막대를 그리는 최신 IDE를 사용합니다.


나는 좋은 타협이며 중괄호를 피하기 때문에 그 구문을 좋아합니다. 그러나 한 줄짜리 진술에는 비용이 많이 든다. 예를 들어 C에서 우리는 중괄호를 완전히 버릴 수있다 :(
Jo So

대신에 중첩 된 if ... elif 대신 사전을 사용하거나 중첩 된 함수를 계속 사용하거나 반환 할 수 있습니다.
aoeu256

@ aoeu256 전혀 질문과 대답의 요점이 아닙니다.
Petruza
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.