가장 좋아하는 언어에 대해 싫어하는 다섯 가지는 무엇입니까? [닫은]


403

최근 Stack Overflow에 Perl-hate 클러스터가 있었기 때문에 " 좋아하는 언어에 대해 싫어하는 5 가지 "질문을 Stack Overflow 가져 오겠다고 생각했습니다 . 당신이 가장 좋아하는 언어를 가지고 당신이 싫어하는 다섯 가지를 말해주세요. 문제가 될 수도 있고, 디자인 결함을 인정하거나, 성능 문제를 인정하거나, 기타 범주 일 수도 있습니다. 당신은 그것을 미워해야하며, 가장 좋아하는 언어 여야합니다.

다른 언어와 비교하지 말고 이미 싫어하는 언어에 대해서는 이야기하지 마십시오. 좋아하는 언어로 좋아하는 것에 대해 이야기하지 마십시오. 나는 당신이 싫어하지만 용납하는 것들을 듣고 싶어서 다른 것들을 모두 사용할 수 있고, 다른 사람들이 사용하기를 원하는 언어에 대해 듣고 싶습니다.

나는 누군가가 나에게 가장 좋아하는 언어를 강요하려 할 때마다, 때로는 인터뷰 질문으로 이것을 요구합니다. 누군가가 자신이 좋아하는 도구에 대해 미워할 다섯 가지를 찾을 수 없다면, 도구를 옹호하거나 그것을 사용하여 큰 돈을 끌어들일만큼 잘 알지 못합니다. 그는 그것을 완전히 탐구하기에 충분히 다른 상황에서 그것을 사용하지 않았습니다. 그는 그것을 문화 나 종교로 옹호하고 있습니다. 즉, 제가 좋아하는 기술을 선택하지 않으면 잘못되었습니다.

나는 당신이 사용하는 언어를별로 신경 쓰지 않습니다. 특정 언어를 사용하고 싶지 않습니까? 그럼 하지마 당신은 현명한 선택을하기 위해 실사를 겪고 여전히 그것을 사용하지 않습니까? 좋아. 때로는 정답은 "좋은 연습과 Bar에 대한 경험이 많은 강력한 프로그래밍 팀이 있습니다. Foo로 변경하는 것은 어리석은 일입니다."


이것은 코드 검토에도 좋은 질문입니다. 실제로 코드베이스를 아는 사람들은 그것에 대한 모든 종류의 제안을 할 것이며, 그것을 잘 모르는 사람들은 비 특정 불만을 가지고 있습니다. "이 프로젝트에서 다시 시작할 수 있다면 어떻게 다르게 할 것입니까?" 이 환상의 땅에서 사용자와 프로그래머는 자신이 싫어하는 모든 것에 대해 불평합니다. "더 나은 인터페이스를 원합니다", "모델과 뷰를 분리하고 싶습니다", "이 모듈 대신이 모듈을 사용하겠습니다", "이 메소드 세트의 이름을 바꿉니다"또는 실제로 그들이하는 모든 것 현재 상황이 마음에 들지 않습니다. 이것이 특정 개발자가 코드베이스에 대해 얼마나 많이 알고 있는지를 다루는 방법입니다. 또한 프로그래머가 얼마나 많은지에 대한 단서이기도합니다.

증오 만이 사람들이 얼마나 많이 알고 있는지 알아내는 유일한 차원은 아니지만 꽤 좋은 것으로 나타났습니다. 그들이 싫어하는 것들은 또한 그들이 주제에 대해 얼마나 잘 생각하고 있는지에 대한 단서를 제공합니다.


11
이것은 오래된 "좋아하는 언어"질문에서 정말 좋은 스핀입니다. 좋은 정당화.
Tom Leys 2011

14
SO가 많은 .NET 독자를 보유하고 있음에도 불구 하고이 글을 쓰는 시점에는 24 개의 답변이 있으며 그중 하나만 .NET 또는 .NET 언어에 관한 것입니다. 이것이 SO 또는 .NET에 대해 무엇을 말하는지 전혀 모르지만 흥미 롭습니다 ...
Jon Skeet

22
C / C ++로 프로그래밍 한 첫 15 년은 알파벳 순서로 싫어했습니다. 1. 포인터 2. 포인터 3. 포인터 4. 포인터 5. 포인터
ileon

4
사람들이 선택한 언어로 프로그래밍하는 방법을 이해하지 못했기 때문에 사람들이 선택한 언어를 싫어한다는 의견이 얼마나 많은지 궁금합니다 ....
Kris.Mitchell

3
이것은 환상적인 질문입니다. 당신이 궁금해하는 경우 일부 언어가 될 것이다이 페이지에 대한 3 가지 대답을 읽는 어떤지 쉽게 가장 유용한 정보를 위해 시간을 보냈다 찾을 수 있습니다. 이미 언어를 알고 있다면 프로그래머의 경험 (그리고 겸손) 수준을 측정하는 좋은 방법이기도합니다.
j_random_hacker

답변:


182

Java에 대해 싫어하는 5 가지 :

  • 일류 기능이 없습니다.
  • 형식 유추가 없습니다.
  • 예를 들어 그래픽과 같은 기본 설정이 부족합니다.
  • NullPointerException에 null에 대한 추가 정보가 포함되어 있지 않습니다.
  • 무의식적으로 "구성 가능한"프레임 워크 / 서비스 제공자 인터페이스 / 팩토리 클래스 / 종속성 주입 시스템의 확산. 구성 가능성은 거의 사용되지 않으며 DRY는 엄중하게 위반되며 크기는 4 배, 가독성은 절반으로 줄어 듭니다.

스칼라를 확인해야합니다.


7
@both : NPE가 스택 트랜스의 첫 번째 줄에 표시됩니다. 여기에는 (대부분의) 클래스, Java 파일 이름 및 행 번호가 "at your.faulty.code.Instance (Intance.java:1234)"와 같이 포함되어 있습니다. 그런 다음 해당 파일을 열고 해당 행으로 이동하십시오. 아무것도 할당되지 않은 변수입니다.
OscarRyz 2016 년

35
@ 오스카 레예스-어, 우리는 알고 있습니다. 그러나 해당 줄에 여러 변수가있을 수 있으며 예외 메시지는 어느 변수가 null인지 알려주지 않습니다.
Zarkonnen

10
스칼라에도 사마귀가 있습니다. 그러나 Java보다 훌륭합니다.
wheaties 2009

10
프레임 워크 등의 확산을 위해 +1
Erich Kitzmueller

6
@Valentin, 야간 실행에서 거대한 로그 파일에 NullPointerException이 재미 있다고 상상해보십시오. 무슨 일이 발생했는지 알아 내야합니다 ... 디버깅은 옵션이 아닙니다.
Thorbjørn Ravn Andersen 님이

216

와우, SQL 이 아직 여기에 있지 않은 것에 놀랐 습니다. 아무도 그것을 사랑한다는 것을 의미하는 것 같아요 :)

  • 여러 구현에서 일관되지 않은 구문
  • 미묘한 코드 차이로 인해 모호한 이유 때문에 성능이 크게 저하 될 수 있습니다.
  • 텍스트 조작에 대한 지원 부족
  • 쉬운 입학 비용이지만 언어 숙달을위한 가파른 학습 곡선
  • 모범 사례를위한 커뮤니티 전체의 최소 표준화에는 구문 스타일이 포함됩니다.

... 추가 비용없이 증오해야 할 몇 가지 보너스 이유

  • WHERE 절이 마지막에 오기 때문에 UPDATE 또는 DELETE를 조기에 쉽게 실행하여 전체 테이블을 파괴 할 수 있습니다. 대신, 어디로 가야합니까?
  • 관계 분할을 구현하기가 어렵습니다.
  • 값을 NULL로 설정할 수 있지만 NULL과 같은지 테스트 할 수 없습니다. IS NULL을 확인할 수는 있지만 필자의 의견으로는 코드가 복잡해집니다.
  • 열에 별칭을 설정 한 다음 별칭으로 GROUP BY 별칭 (또는 SORT에서와 같이 열 인덱스)을 설정하지 않고 GROUPed 열에 대한 공식을 완전히 다시 지정해야하는 이유는 무엇입니까?

7
언어로 생각하기 전에는 아무도 그것을 사랑하는 법을 배울 수 없습니다. :)
Alan Moore

4
모든 것에 +1 그리고 사람들은 왜 내가 ORM의 두통을 참을 지 궁금해합니다 ...
James Schek

2
@ Alan M ... L이 의미하는 것이 아닌가요? :)
Kev December

29
INSERT 구문이 UPDATE와 왜 다른지 이해할 수 없습니다. 그리고 MERGE는 이해할 수 없습니다.
LaJmOn

3
TRUE 및 FALSE 직후 NULL이 세 번째 가능한 결과라고 생각하면 IS NULL의 필요성이 분명해야합니다. 그 의미는 "알 수 없음"이므로 알려지지 않은 것이 알려지지 않은 것과 일치하는지 알 수 없습니다. 또 다른 예 : NULL이 NULL과 같으면 NULL 값이 다른 NULL 값과 일치 할 수 있기 때문에 JOIN을 만드는 전체 개념이 불가능하다는 것을 의미합니다. 이것을 이해하면 (3 진 논리라고도 함) NULL에 대해 테스트하기 위해 "IS"연산자를 도입 한 이유를 이해할 수 있습니다.
Alex

159

자바 스크립트 :

  1. 가장 멋진 것들은 모두 복잡하지만, 그 차가움은 너무 적은 양의 코드로 싸여있어 그것을 따르려고 애쓰는 것에 대해 어리석은 느낌입니다.

  2. '+'는 약한 유형의 언어로 연결하기 위해 조작자가 잘못 선택했습니다. 그들은 멍청한 놈들 을 놀라게 하려고 했습니까?

  3. 브라우저 간 호환성 마인 필드입니다 (켜져 있어도 상관 없습니다)

  4. 일반적으로 신뢰할 수 없습니다-뒤로 버튼 차단, 절대 죽지 않는 팝업 등과 같은 쓰레기와 관련이 있습니다.

  5. 몇 가지 다른 오류 메시지와 몇 가지 다른 유형 (Number, String, Object 등)이 있기 때문에 디버깅이 거의 불가능합니다.

jQuery가 아니었다면 아마도 내가 사용했던 것만 큼 미워했을 것입니다 :)


15
나는 mausch에 동의합니다. ECMAscript 자체는 아름답고 강력한 언어입니다. 그 이름을 방해하는 것은 성가신 브라우저 (: cough : IE)입니다.
TJ L

32
@Mausch : 어디에서 라이브 자바 스크립트 않습니다 광대 의 경우 대부분? 당신은 "자동차가 지구 온난화에 기여하지 않고, 그것이 그것을하는 자동차를 운전하고 있습니다"라고 말하는 것과 같습니다. 물론, 요점은 없습니다.
jTresidder

20
@Chris : 예. "+"는 강력한 형식의 언어 (Python과 같은)로 연결하기에 좋은 연산자입니다. 약한 유형의 언어 (Javascript 또는 C와 같은)에서는 끔찍합니다. 'sum :'+ 2 + 3은 'sum : 5'가 아니라 'sum : 23'으로 결정합니다. 더 많은 Javascript 경험을 가진 사람이 더 나은 예를 줄 수 있습니다.
ShreevatsaR

5
예, C는 Python과 비교하여 약하게 입력됩니다 (예 : 정수를 chars에 할당하고 void * 포인터를 통해 무엇이든 캐스팅 할 수 있습니다 ). 동적 으로 입력되는 대신 정적 으로 입력되며 대신에 명시 적으로 입력 해야합니다. 유형 유추이지만 강력한 v / s 약한 입력과는 관련이 없습니다. [임의의 예 : 파이썬에는 암묵적인 동적 강력한 타이핑이 있고 Haskell에는 (선택적으로 명시적인) 정적 강한 타이핑이 있고, Java에는 명시적인 (대부분 정적 인) 강한 타이핑이 있으며, C에는 명시적인 정적 (상대적으로 약한) 타이핑이 있습니다.] "강력한 유형"및 "약한 유형 "는 실제로 명확하지 않습니다.
ShreevatsaR

5
@ShreevatsaR 전형적인 예는 다음 '3'+'2'='32'과 같습니다. , '3'-'2'=1.
Thomas Ahle

148

PHP :

1) 불필요한 변수를 만들도록합니다.

$parts = explode('|', $string);
$first = $parts[0];

2) 람다의 구현은 그것을 사용하는 것과 거의 동등 eval()하며 너무 끔찍하게 잘못 사용하지 않았습니다 ( http://www.php.net/create_function 참조 ).

3) 발생할 수있는 오류의 약 80 % 만 잡을 수있는 try / catch 시스템.

4) 정규 표현식은 람다 지원만큼 절름발이입니다. 정규 문자열 안에 작성해야하기 때문에 배우기 가장 어려운 프로그래밍 도구 중 하나를 3 배 정도 어렵게 만듭니다. 그리고 PHP는 "쉬운"언어로되어 있습니까?!?!?

5) $ _POST에서 두 번 쓰거나 자신의 함수를 작성하거나 '@'연산자를 사용하지 않고 안전하게 물건을 꺼내는 방법은 없습니다.

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;

6) 보너스 답변 : '@'. 코드를 올바르게 작성하는 데 방해가되지 않으면 '@'만 추가하면 나중에 코드를 디버깅해야하는 사람에게는 너무 나빠질 수 있습니다.


44
list ($ first) = explode ( '|', $ string); ?
mlarsen

44
이상적으로는 some_function (explode ( '|', $ string) [0]);을 사용하고 싶습니다.
너무 많은 PHP

8
어떤 이상한 변수 범위? 전역을 사용하려고 할 때 모든 것을 로컬에 배치하고 선언하도록 강요하는 것이 좋은 생각입니다. 멍청한 놈은 인수와 반환 값을 사용하는 대신 전역을 사용하는 함수를 만들지 못하게합니다.
scragar

24
매개 변수 순서가 임의로 변경되는 기능을 잊어 버렸습니다
dusoft

39
verbNoun, verb_noun, noun_verb, nounverb, verbnoun, nounVerb 등을 잊어 버렸습니다> _>
Warty

135

C ++

  • 무작위로 메모리를 손상시키고 찾기가 거의 불가능한 버그를 만들기에는 너무 쉽습니다 ( Valgrind 는이를 해결하기 위해 먼 길을 갔지만 ).
  • 템플릿 오류 메시지
  • 템플릿을 사용할 때는 모든 것을 하나의 파일에 포함시킨 다음 어리석은 컴파일 시간을 가져야합니다.
  • 표준 라이브러리는 현대에 농담입니다 (기본적으로 스레드 또는 네트워크가 없습니까?)
  • 많은 불쾌한 C 비트가 파고 들었습니다 (특히 short / int / signed / etc 사이의 모든 변환).

13
나는 STL에 동의하지만, 내가 무슨 말을 것 입니다 꽤 좋은이 있습니다.
Bernard

22
유니 코드. 나는 아스키의 단순함을 존중하지만, 선을 위해서 우리는 21 세기에 잘 들어 섰습니다.
wilhelmtell

29
@Kieveli const 정확성은 실제로 다른 언어로 프로그래밍 할 때 가장 그리워하는 것 중 하나입니다. 특히 동적 유형의 것들. raii는 종종 그리워하는 큰 기능입니다.
wilhelmtell

6
대부분의 C ++ 문제는 ISO 표준에서 비롯되며 10 년 동안 잠겨 있습니다.
graham.reeds

7
+1 "템플릿 오류 메시지."
João Portela

129

C # / .NET :

  • 클래스는 기본적으로 봉인되어야합니다
  • lock명령문 이 없어야합니다 . 대신 특정 잠금 오브젝트가 있어야하고 Acquire일회용 잠금 토큰을 리턴하는 메소드가 있어야합니다 . 결론 : 모든 개체에 대한 모니터가있는 것은 아닙니다.
  • GetHashCode()Equals()에 안 System.Object모든 것이의 적절한 해시 -. 대신,이 IdentityComparer같은 일을하는을하고, 유지 IComparer<T>, IComparable<T>, IEqualityComparer<T>IEquatable<T>사용자 정의 비교를위한 인터페이스를.
  • 불변성에 대한 빈약 한 지원
  • 확장 방법을 발견하는 잘못된 방법-네임 스페이스를 사용한다는 사실보다 훨씬 더 의식적인 결정이어야합니다.

그것들은 내 머리 꼭대기에서 벗어났습니다. 내일 묻고 다른 5를 생각해 낼 것입니다. :)


22
기본적으로 봉인 됨 : 상속은 클래스로 설계되거나 (시간이 걸리고 향후 옵션을 제한 함) 금지되어야합니다. hashCode / equals : Java에서도 빨라집니다. 어느 날 나는 그것에 대해 긴 블로그 게시물을 작성합니다. 상속 체인에서 equals가 어려운 이유에 대한 자세한 내용은 Effective Java를 읽으십시오.
Jon Skeet

88
인봉은 기본적으로 누군가가 수업에서 물려 받기를 원하는 모든 가능한 이유를 생각했으며 그 중 어느 것도 이해가되지 않는다는 것을 의미합니다. 미안하지만 우리 중 아무도 똑똑하지 않습니다.
Ed S.

69
이 경우 코드에서 파생 될만큼 똑똑하지 않습니다. 코드를 손상시킬 수있는 향후 변경 사항을 예측할 수 없기 때문입니다. 그것은 매우 중요한 문제입니다. IMO. 코드를 봉인하는 것이 더 제한적이지만 구현의 자유와 견고성이 향상됩니다.
Jon Skeet

11
나는 아무도 "goto case"구문을 언급하지 않았다고 믿을 수 없다. 나는 그 것을 싫어한다!
Aistina

20
Jon Skeet이 C #을 디자인하지 않은 것이 좋습니다. 또는 제 목록은 "1. 기본적으로 클래스가 봉인되어 있습니다. 2. 잠금이 너무 복잡합니다. 3. 대부분의 개체를 해시 할 수 없습니다"처럼 표시됩니다!
Gabe

113

  • 문자열 조작.

문자열 버퍼를 수동으로 처리해야하는 것은 오류가 발생하기 쉽습니다. 너무 많은 컴퓨팅이 실제로 문자열을 이동하고 수정하기 때문에 (컴퓨터는 사람들이 과거로 돌아갈 것이라고 생각했던 것처럼 많은 수의 크 런칭 작업에 많이 사용되지 않으므로) 관리되는 언어 또는 C ++의 문자열을 사용할 수 있다는 것이 정말 좋습니다 이것들을 다루는 객체. 똑바로 C로해야 할 때, 빠른 모래에서 수영하는 것처럼 느껴집니다.


50
동의했다. 문자열 조작은 내가 C에 대해 싫어하는 것 중 1에서 5까지입니다.
BoltBait

1
DJB의 안전한 문자열 라이브러리 또는 다른 것을 사용하십시오. XML 조작은 대부분의 언어에서 어렵고 많은 프로그램에서 XML 조작을 수행하지만 "Perl은 기본 노드 유형으로 DOM 노드를 지원하지 않기 때문에 Perl이 완전히 손상되었습니다"라는 글을 많이 보지 못합니다. 그들은 도서관을 사용합니다.
Steve Jessop

5
C 문자열 조작은 빨라지지만 언어 문제가 발생하는 한 최악은 아닙니다.
Chris Lutz

3
strcat을 연결하되 잠시만 기다리십시오 ... 대상에 충분한 공간이 있습니까 ... 확인, 확인하기 위해 if 문을 삽입해야합니다 ... 그러나 내 문자열이 힙에 있으면 어떻게합니까? 좋아, 크기를 추적하기 위해 변수를 유지해야합니다 ... 그리고 이것은 계속해서 계속할 수 있습니다 ...
blwy10

4
우리는 C에 대해 싫어 하지 않는 5 가지에 대한 스레드가 필요합니다 ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

94

"어떤 언어에 대해 싫어하는 것"목록에 대해 내가 싫어하는 다섯 가지는 어떻습니까? :디

5- 주황색을 칠해도 사과가 아닙니다.

언어를 디자인 할 때 디자이너는 일반적으로 유용한 것을 염두에 둡니다. 완전히 다른 것을 위해 그것을 사용하는 것은 효과가있을 있지만, 그것이 어리석지 않다고 불평하는 것은 간단합니다. 파이썬을 가져 가라. 누군가가 있거나 언젠가 파이썬 코드에서 exe를 만드는 유틸리티를 만들 것이라고 확신합니다. 왜 하나님의 땅에 당신이 할 싶어 그렇게? 깔끔하지만 — 나를 오해하지는 않지만 — 사용하지 않습니다. 그것에 대해 불평을 중지하십시오!

잘 설계된 프로젝트에는 여러 언어의 코드가 포함될 수 있습니다. 한 언어로만 프로젝트를 완료 할 수는 없습니다. 어떤 프로젝트는 당신이 사용하는 언어의 능력 안에있을 수 있습니다.

4- 당신은 나무 다리에 서 있습니까?

플랫폼은 언어의 기능에 큰 영향을 줄 수 있습니다. 오늘날 가비지 수집기 또는 심지어 "가비지 수집"에서의 초기 파스칼 시도로 메모리 페이드 (어쩌면 malloc 더 많은 RAM ??)를 도울 수 있습니다. 컴퓨터가 더 빠르기 때문에 우리는 더 많은 언어를 기대합니다. 그리고 솔직히 말해서, 우리는 아마해야합니다. 그러나 해시 테이블이나 문자열 또는 다양한 다른 개념을 작성하기 위해 컴파일러의 편의를 위해 많은 비용이 듭니다. 이러한 것들은 사용되는 플랫폼에 상속되지 않을 수 있습니다. 언어에 포함하기 쉽다고 말하면 다리가 없을 수도 있습니다.

3- 진짜 누구의 잘못입니까?

버그. 당신은 알고있다. 나는 버그를 좋아한다. 왜 버그를 좋아합니까? 직업을 유지한다는 의미이기 때문입니다. 버그가 없으면 닫힌 피자 가게가 많이있을 것입니다. 그러나 사용자는 버그를 싫어합니다. 그러나 여기 차가운 물이 약간 튀어 나옵니다. 모든 버그 프로그래머의 잘못입니다. 언어가 아닙니다. 생성 될 수있는 버그 수를 크게 줄이는 엄격한 구문을 가진 언어는 완전히 쓸모없는 언어입니다. 능력은 한 손으로 계산 될 수 있습니다. 유연성이나 힘을 원하십니까? 당신은 버그가 있습니다. 왜? 당신은 완벽하지 않고 실수를하기 때문입니다. C에서 실제로 식별 가능한 예제를 보자.

int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;

우리 모두 그 일을 알고 있습니다. 그러나, 우리 중 일부는 모르는 것이 있습니다. 하고있는 일에 따라. 버퍼 오버런은 해당 기능의 비용입니다. 위의 코드입니다. 내가 실제로 공개했다면. 다시 .. 나와 함께 말하십시오. "나의 잘못". 내가 할 수있는 것은 C가 아닙니다.

2- 휴지통에 넣지 말아야합니까?

우리가 자주 사용하지 않고 바보라고 부르기 때문에 우리가 이해하지 못하는 언어로 특징을 지적하는 것은 매우 쉽습니다. 고토는 항상 저를 즐겁게합니다. 사람들은 항상 고토의 언어에 대해 불평합니다. 그러나 마지막 프로그램에는 일종의 goto가 포함되어 있습니다. 휴식이나 계속을 사용한 적이 있다면 goto를 사용한 것입니다. 그게 다야. 물론, 그것은 "안전한"goto이지만, 그것이 바로 그런 것입니다. 고토는 용도가 있습니다. continue 또는 break와 같은 "암시 적"gotos가 사용되는지 또는 명시 적 gotos인지 (언어에 상관없이 실제 키워드 "goto"사용). 언어 개발자가 완벽하지는 않지만 일반적으로 ... 언제부터 기능이 존재하는 경우 (해당 언어). 아마도 그 측면은 그 언어의 품질을 정의하는 것 같습니다. 의미하는 것은 .. 이전 버전과의 호환성으로 인해 사용 중일 가능성이 높습니다. 오늘 사용되고 있습니다. 5 분 전과 같이 제대로 사용했습니다. 글쎄 .. 누군가가 그것을 부적절하게 사용하고 있지만, 그것은 내 목록의 # 3과 관련이 있습니다.

1.-모든 것이 개체입니다.

좋아요 .. 이것은 실제로 # 2의 부분 집합입니다. 그러나 이것은 내가 증오 목록에서 볼 수있는 가장 성가신 불만입니다. 모든 것이 대상이 아닙니다. 객체가 아니거나 객체가 될 필요가없는 많은 개념들이 있습니다. 그들이 속한 곳에 물건을 두는 것은 추악하고 프로그램의 효율성을 떨어 뜨릴 수 있습니다. 확실한. 언어에 따라 크게 다르지 않을 수도 있습니다. 이것은 # 5 와도 관련이 있습니다. 이것은 ... 그렇습니다. 글로벌은 괜찮습니다. 정적 메소드에 적용되는 함수는 정상입니다. OO 프로그래밍과 전역 함수를 결합하는 것은 좋습니다. 그렇다고해서 우리 모두가 객체 모델에서 코드를 "무료로"외출해야한다는 의미는 아닙니다. 코드 또는 전체 프로젝트의 한 부분을 설계 할 때, 어떤 일이 장면 뒤에 발생 해야정리할 때 고려하십시오. 그 개념이 어디에 있는지 그리고 다른 많은 요소들만이 아닙니다. 목적이없는 클래스 나 네임 스페이스 개념 내에서 전역 함수를 래핑하는 이유는 무엇입니까? 정적 멤버 변수를 사용하십시오. 언어와 구현에 따라 다르지만 일반적으로 말하면, 당신은 전 세계를 선언했습니다. 예, 이러한 비 OO 개념을 OO 래퍼로 감싸 야하는 몇 가지 이유가 있습니다. 물론 자체 문서화 코드입니다. 말이 될 수 있습니다. 그래서 .. 내가 말하는 것처럼. 외출하지 말고 코드를 "자유롭게"하지 마십시오. 그러나 현대의 훌륭한 언어는 OO 모델링 이외의 글로벌 개념을 갖습니다. 글로벌 개념이없는 OO 프로그래밍 언어에는 심각한 디자인 결함이있을 가능성이 높습니다. 다시 .. 언어의 의도와 디자인에 따라 달라 지므로 특정 언어를 선택하려고 시도하지 않으며 여기에 분석 할 언어가 너무 많습니다. 누구든지, 코드가 어디에 살고 가장 효과적인지를 고려해야합니다. 기능을 추가하지 않거나 지원하지 않는 무언가에 플레어를 추가하면 키보드가 더 빨리 마모됩니다. 아무도 좋은 일을하지 않습니다. 글쎄 .. 당신이 아마 당신에게 잘못 가르친 사람의 브라우니 점을 좋아하지 않는다면 모든 것이 목표라고 생각합니다.

간단히 말해서 프로그래밍은 키보드를 가볍게 두드리는 것이 아닙니다. 모든 프로젝트에는 많은 디자인 고려 사항이 있습니다. 나는 그것이 진부한 것을 알고 있지만, 당신은 모든 각도에서 그것을 봐야합니다. 오늘날에도 안전한 유형의 언어입니다. 코드를 정리하지 않고 잘 작동 할 것으로 기대합니다. 물론 .. 그것은 효과가있을 수 있지만, 올바른 방법이 아닐 수도 있습니다. 전반적으로 특정 작업과 환경에 가장 적합한 언어와 형식을 선택하십시오. 그러나 어떤 언어도 그 뒤에 생각을 빼앗아 가지 않습니다 . 당신이 생각하지 않으면 .. 당신은 입력입니다.


19
언어는 완벽하지 않으며, 당신이 언어에 대해 싫어하는 것들의 목록을 만들면 흥미로운 의견과 아이디어를 얻을 수 있습니다. 첫째, 다른 사람들이 당신이 존재하지 않았던 솔루션을 제공 할 수 있습니다 (게시물을 살펴보면 몇 가지 사항을 알게 될 것입니다). 둘째, 그것은 언어 개발자들에 대한 사용자 피드백을 구성합니다 (사용자가 소프트웨어에 대해 가장 싫어하는 5 가지 목록을 생각해 보더라도 관심이 없을까요?), 셋째, 결함에 대해 깊이 생각해 보는 것이 재미 있습니다. 당신의 도구.
Sylverdrag

4
해당 레벨에서 볼 때 중단 및 계속은 gotos이지만 루프는 gotos입니다 (조건이 충족되면 루프의 시작을 점프), goto (조건이 충족되지 않으면 블록 위로 건너 뛰면 함수 호출) goto (기능의 시작으로 점프하고 나중에 점프), ...
helium

17
소스 코드에서 실행 파일을 작성하는 것은 "사용하지 않습니까?" 뭐?
detly

4
Perl은 80 년대 후반부터 Perl 파일에서 실행 파일을 만들 수있었습니다. 배포 할 것이 유용합니다. a) Perl을 설치할 필요가 없습니다. b) 프로그램의 구성 요소를 설치하십시오. c) 경로를 설정하고 모두 실행할 스크립트를 작성하십시오.
xcramps

1
그러나 원본에서 .exe 파일을 만들 수 없으면 Windows 사용자는 해당 파일을 실행할 수 없습니다. ;)
Evan Plaice

88

Java 에 대해 내가 싫어하는 다섯 가지 (현재 가장 좋아하는 언어)는 특별한 순서가 없습니다.

  1. 내가 Java Generics의 팬인만큼, 설계 방식에서 발생하는 많은 이상한 점이 있습니다. 따라서 제네릭에 대한 수많은 성가신 한계가 있습니다 (일부는 유형 삭제의 결과입니다).
  2. Object.clone () 및 Cloneable 인터페이스 작동 방식이 완전히 손상되었습니다.
  3. Sun은 고속 도로를 이용하고 모든 것을 객체 (예 : SmallTalk)로 만드는 대신, 객체와 프리미티브라는 두 가지 고유 한 데이터 유형 범주를 만들었습니다. 결과적으로 기본 데이터 유형과 boxing / unboxing과 같은 기발한 호기심과 프리미티브를 콜렉션에 넣을 수없는 두 가지 표현 이 있습니다 .
  4. 스윙이 너무 복잡합니다. 잘못 이해하지 마십시오 : Swing으로 할 수있는 멋진 것들이 많이 있지만 과잉 엔지니어링의 훌륭한 예입니다.
  5. 이 최종 불만은 Sun과 Java 용 XML 라이브러리를 작성한 사람들의 잘못입니다. Java XML 라이브러리는 너무 복잡합니다. XML 파일을 읽기 위해 DOM 또는 SAX 등 어떤 파서를 사용하는지 걱정해야하는 경우가 종종 있습니다. 각각의 API는 똑같이 혼란 스럽습니다. XML 을 쉽게 파싱 ​​/ 작성 하기위한 언어의 기본 지원은 매우 좋습니다.
  6. java.util.Date가 짜증납니다. 불필요하게 복잡 할뿐만 아니라 모든 유용한 방법은 더 이상 사용되지 않으며 복잡성을 증가시키는 다른 방법으로 대체되었습니다.

32
java.util.Date를 잊어 버렸습니다!
TM.

3
"Cloneable"인터페이스에는 "clone ()"메서드가 없습니다. 이것은 Cloneable 인터페이스를 Oxymoron으로 만듭니다. clone ()은 Object를 반환하기 때문에 type safety가 창 밖입니다 (J2SE 5.0에서 Generics가 도입 된 후에도이를 수정하려는 시도는 나타나지 않습니다).
Ryan Delucchi

2
우리가 복제 가능한 것을 강타하는 한, 소위 Serializable "인터페이스"도 포함 할 수 있습니다. 그것을 사용할 때마다 나는 항상 자신을 찌르고 싶습니다.
wds

12
파일을 열고 읽는 것과 같은 간단한 일을하기가 어렵습니다.
Eric Johnson

3
@Ryan clone ()은 반드시 "Object"를 반환 할 필요는 없습니다. J2SE 5.0에서 Java는 공변량 리턴 유형을 도입했습니다. 이는 기본 클래스의 하위 유형을 리턴 할 수 있음을 의미합니다. 따라서 공개 MyType clone ()이 가능합니다!
helpermethod

73

루비 는 속도와 관련된 많은 결점을 가지고 있지만, 나는 그 점을 싫어하지 않습니다. 또한 지역 사회 전도에 결함이 있지만 실제로 저를 귀찮게하지는 않습니다. 이것들은 내가 싫어하는 것입니다 :

  • 클로저 (블록)에는 서로 다른 4 가지 생성 구문이 있으며 최적의 구문은 없습니다. 우아한 구문은 불완전하고 해시로 모호하며 전체 구문은 추악합니다.
  • 커뮤니티는 '코드 읽기'를 선호하여 실제 문서에 위배되는 경향이 있습니다. 나는이 유치하고 게으른 것을 발견한다.
  • 특히 라이브러리에서 메타 프로그래밍 남용은 버그를 추적하는 악몽을 만듭니다.
  • 관련 메모에서, 광범위한 메타 프로그래밍은 포괄적 인 IDE를 만드는 것이 불가능하지는 않지만 어렵게 만듭니다.
  • 기능으로 전달되는 블록은 바보입니다. 매개 변수 목록 외부로 블록을 전달하거나 액세스 (수율)하기 위해 이상한 특수 구문을 가져야하는 이유는 없습니다. 블록에 덜 모호한 구문이 주어 졌거나 해시가 다른 구분 기호를 사용할 수 있었을 것입니다. {} 대신 <>가 아닌 <> 일 수 있습니다.

    object.method(1, {|a| a.bar}, "blah")
    

    블록과 같은 이러한 이상한 점은 마지막으로 전달 된 매개 변수이어야하며 둘 이상의 블록을 전달하는 것은 더 긴 구문으로 다르므로 실제로 성가시다.


2
차선 화 m17n 및 유니 코드 지원은 나아지고 있지만. 1.9 복잡하게 남아 ...
Keltia

37
메타 프로그래밍 남용은 "아이디 오 매틱 루비"라고 생각했습니다. :)
Slartibartfast

2
akway : 다른 두 구문은 lambdaProc.new 입니다.
Myrddin Emrys

2
문서를 다시 한 번, Pragmatic Programmers 출판사에서 일하는 누군가가 회사를 설립했을 때 루비 책을 원한다고 말한 적이 있습니다. 그래서 그들은 그 책을 회사에서 번역하고 출판 할 수있었습니다. 그러나 그들이 소스 코드를 읽는 대신에 무엇을했는지 :-) 루비 책은 Pragmatic Programmers를 시작한 책 중 하나였습니다.
Arthur Reutenauer

13
나는 이것들 중 3 개가 언어 자체가 아니라 사람들과 관련이 있다는 것이 흥미 롭다. 루비는 내가 가장 싫어하는 언어로 남아 있습니다.
Toby Hede

72

  • 시길의 혼합 사용

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    
    • 예를 들어 다음 중 어느 것도 동일 하지 않습니다 .

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'
      

    에서 Perl6그것은됩니다 작성 :

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
    
  • 진정한 OO 부족

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }
    

    에서 Perl6그것은됩니다 작성 :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • 잘못 설계된 정규식 기능

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code
    

    에서 Perl6그것은됩니다 작성 :

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
    
  • 다중 디스패치 부족

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    

    에서 Perl6그것은됩니다 작성 :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • 열악한 연산자 과부하

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    

    에서 Perl6그것은됩니다 작성 :

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    

5
나는 당신이 그것을 만드는 것만 큼 나쁜 OO가 부족하다고 생각하지 않습니다. 때로는 사용하는 CPAN 모듈이 필요한 것을 노출하지 않았다고 생각할 때 구세주입니다. 그리고 여러 파견의 부족이 악화 될 수있다 : 펄 강력 ;-) 입력 된 수
Tanktalus

3
나는 Perl이 강력하게 타이핑되지는 않지만 어떤 타입 정보를 추가하는 것이 유용하다는 것을 좋아한다.
브래드 길버트

13
좋아하지 않는 언어를 비판하기로 선택한 것 같습니다 (perl6을 비판해야 함)
Frew Schmidt

5
펄 6과 비교할 때 요점이 무엇입니까? Perl 6이 문제를 해결하거나 계속 진행할 것을 제안하고 있습니까?
Robert P

2
내가 더 이상 말할 필요가없는 것 같다 : ozonehouse.com/mark/periodic
Arafangion

57

나는 때때로 그것을 좋아하고 PHP 를 할 것이고 파이썬은 너무 많이 끝날 것입니다.

  • 네임 스페이스가 없습니다. 모든 것이 더 큰 환경에서 지옥 같은 매우 큰 네임 스페이스에 있습니다.

  • 함수에 관한 표준 부족 : 배열 함수는 바늘을 첫 번째 인수로 사용하고 건초 더미를 두 번째로 사용합니다 ( array_search 참조 ). 문자열 함수는 종종 건초 더미를 먼저, 바늘을 두번째로 가져갑니다 ( strpos 참조 ). 다른 함수는 다른 명명 체계를 사용합니다 : bin2hex , strtolower , cal_to_jd

    일부 함수는 정상적인 것보다 이상한 반환 값을 갖습니다. 이렇게하면 PHP가 빈 배열을 거짓으로 효율적으로 해석 할 수있는 반면 세 번째 변수는 아무데도 선언되지 않습니다. 동일한 기능을 수행하는 다른 기능은 거의 없습니다.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • 이 언어 (PHP6까지)는 거의 지연되지 않은 이전 버전과의 호환성을 유지하기 위해 최선을 다하여 필요하지 않을 때 나쁜 관행과 기능을 수행합니다 ( mysql_escape_string vs. mysql_real_escape_string 참조 ).

  • 이 언어는 템플릿 언어에서 풀 백엔드 언어로 발전했습니다. 이것은 누구나 원할 때 무엇이든 출력 할 수 있고 남용된다는 것을 의미합니다. 템플릿 언어를위한 템플릿 엔진으로 끝납니다 ...

  • 파일을 가져올 때 짜증납니다. 포함하는 4 가지 방법 (include, include_once, require, require_once)이 있으며 모두 느리고 매우 느립니다. 실제로 전체 언어가 느립니다. 적어도 파이썬 (프레임 워크조차 포함)과 내가 수집 한 것에서 RoR보다 상당히 느립니다.

그래도 여전히 PHP를 좋아합니다. 그것은 웹 개발의 전기 톱입니다 : 당신은 중소 규모의 사이트를 실제로 빠르게 수행하고 누군가가 그것을 호스팅 할 수 있는지 확인하십시오 (구성은 다를 수 있음)? PHP가 바로 거기에 있으며, 전체 LAMP 또는 WAMP 스택을 설치하는 데 5 분 밖에 걸리지 않습니다. 글쎄, 나는 지금 파이썬으로 다시 일할 것입니다 ...


4
포인트 1이 5.3에서 구현되었다고 가정합니다. :) 매개 변수 순서가 나아지는 동안 이름이 여전히 나쁩니다. 그래도 이전 버전과의 호환성에 동의합니다.
Ross

4
# 4를 사랑해야합니다. 그것은 항상 나를 가장 귀찮게 한 것 중 하나입니다.
프란츠

1
스피드 주장은 꽤 주관적이라고 생각합니다. 속도는 언어 자체보다 코드가 얼마나 효율적인지에 달려 있습니다. 열악한 PHP 코드는 고품질 파이썬 코드보다 느릴 수 있지만 좋은 PHP는 열악한 Python보다 성능이 우수 할 수 있습니다.
selfawaresoup

17
no_really_now_mysql_escape_the_string_im_serious ()
Salaryman

2
네임 스페이스 schmamespaces. PHP는 월드 와이드 웹에 있으므로 모든 것이 글로벌해야합니다.
Evan Plaice

50

Java에 대해 싫어하는 점은 다음과 같습니다 (내가 가장 좋아하는 언어는 아님).

  • 제네릭 형식 삭제 (즉, 제네릭 제네릭 없음)
  • 단일 catch 블록에서 여러 유형의 여러 예외를 포착 할 수 없음
  • 소멸자 부족 (finalize ()는 매우 가난한 대체물입니다)
  • 클로저를 지원하거나 함수를 데이터로 취급하지 않음 (익명 내부 클래스는 매우 장황한 대체물입니다)
  • 일반적으로 확인 된 예외 또는보다 구체적으로 복구 할 수없는 예외를 확인합니다 (예 : SQLException)
  • 리터럴 콜렉션에 대한 언어 레벨 지원이 없습니다.
  • 제네릭 클래스의 생성자가 호출 될 때 유형 유추가 없습니다. 즉, 유형 매개 변수는 '='의 양쪽에서 반복되어야합니다.

1
@ Svish-요점은 당신이 다루고있는 예외 유형에 신경 쓰지 않을 때만이 구조를 사용한다는 것입니다. 다시 말해, 모두 동일하게 처리하고 싶을 때
Dónal

3
언어에 GC가있을 때 소멸자 부족이 결점이라고 부르지 않을 것이며, 각 릴리스에서 더 나아진 GC가 있습니다. gc가 크게 개선 되었기 때문에 소멸자는 java 1.1.8에서는 누락되었지만 java 6에서는 누락되었습니다.
Mike Reedell 2009

7
C #은 여러 예외를 포착하는 것을 제외하고 이러한 모든 것을 수정합니다. 제네릭을 구체화하고, 소멸자를 사용하여 / IDisposable로 대체하고, 클로저는 anon 메소드와 람다로 구현하고, 예외는 확인되지 않으며, 컬렉션 리터럴이 있으며, 생성 된 유형을 두 번 지정하지 않는 'var'이 있습니다.
Daniel Earwicker

1
자바에는 분명히 폐쇄가있다. 익명의 내부 클래스는 해당 범위에서 로컬 최종 변수를 닫습니다. 익명의 내부 클래스는 익명의 기능을 대신 할 수 없지만 닫는다 는 데 동의합니다 .
Adam Jaskiewicz 2016 년

2
Anon 내부 클래스는 클로저가 아닙니다. "sum + = current.amount ()"와 같은 방문자 콜백을 작성하십시오. 여기서 "sum"은 둘러싸는 범위의 최종 변수가 아닙니다. 닫지 만 시가는 없습니다.
Roboprog 2016 년

40

C ++

  1. 템플릿 구문
  2. 다이아몬드 상속 문제
  3. 현대 언어가 가지고있는 표준 라이브러리의 과도 / 부족
  4. IOStream
  5. IOStream에 사용되는 구문

파이썬

  1. 공백은 의미가 있습니다 (때로는)
  2. 밑줄이 그어진 키워드
  3. 제한된 스레드 지원 (적어도 현재)
  4. "this"대신 "self"
  5. 공백은 의미가 있습니다 (때로는)

80
"자기"를 "이것"이라고 칭할 수 있습니다 (다른 사람들이 따르기가 어려울 수도 있지만). "자체"는 키워드가 아니며 원하는 이름으로 변수 이름을 지정할 수 있습니다.
mipadi

36
거기에서, 실제로 파이썬에서 공백 (특히 들여 쓰기)의 의미를 가장 큰 장점 중 하나로 나열 할 것입니다 ...;)
Oliver Giesen

22
"공백은 의미가있다"는 파이썬의 최고의 기능 중 하나입니다 !! 추신 "에서 통역이 실행하려고 미래 수입 중괄호"
하센

4
스레드 지원을 제외하고는 전체 파이썬 목록에 동의하지 않습니다. 공백은 의미가없고 들여 쓰기는 의미가 있습니다. 큰 차이가 있습니다.
Christian Oudard

3
와. 공백 / 탭을 특수 문자로 강조 표시 / 표시하는 텍스트 편집기를 발명 한 사람은 없습니다 (메모장에서 코딩하고 있습니까?). 또한 탭을 공백으로 확장하면 화재로 죽어갑니다.
가짜 이름

37

목표 -C

1) 네임 스페이스가없고 수동 명명 규칙 만 있습니다. 클래스 분리 측면에서 그 점을 신경 쓰지 않지만 가져 오기 com.me.somelibrary와 같이 네임 스페이스의 모든 클래스 정의를 한 줄로 가져올 수는 없습니다. *).

2) 라이브러리에는 여전히 RegEx 지원과 같은 중요한 영역에 약간의 구멍이 있습니다.

3) 속성 구문은 약간 어색하며 속성을 선언하려면 세 줄 (두 개의 별도 파일로)이 필요합니다.

4) 유지 / 해제 모델이 마음에 들지만 참조를 해제 한 다음 나중에 실수로 사용하는 것보다 쉽습니다.

5) 실제로 언어 기능은 아니지만 Xcode는 Objective-C의 사용과 너무 얽혀 있습니다. 그 측면에 대해 생각할 수는 없습니다 ... 기본적으로 자동 완성은 매우 만족 스럽습니다. 그것은 당신이 원하는 것을 찾은 것에 대해 보상하고 나중에 선택으로 제시하는 시스템과 같습니다. 그러나 자동 완성 엔진을 좋아하지 않았다고 가정합니다.


2
네임 스페이스에 대해 동의하면 클래스에 접두사로 문자 코드를 붙입니다. 그리고 실제 클래스 변수에 대한 누락 된 지원을 추가하고 싶습니다.
zoul

2
Objective-C 속성. 진지하게, 그들은 충격적입니다. 특히 C #이 얼마나 잘 작동하는지 과대 광고를 이해할 수 없습니다.
Justicle

6
실제로 나는 Lisp와 ObjC의 측면을 정말로 좋아했습니다 .Emacs 또는 XCode와 같은 좋은 중괄호 일치 편집기가 필요합니다. 나는 일반적으로 중괄호를 입력하기 전에 쌍을 입력하므로 실제로 일치하는 문제가 발생하지 않습니다 ... XCode는 포함 중괄호를 두 번 클릭하여 중괄호로 둘러싸인 영역을 강조 표시 할 수도 있습니다.
Kendall Helmstetter Gelner

1
@Chris S : YES/NO부울 을 말하는 건 나쁜 일입니까? 그리고 더 중요한 것은 Named Parameters가 나쁜 것입니까? 부울을 이해할 수 있지만 명명 된 매개 변수는 ObjC의 가장 좋은 기능 중 하나입니다 (가독성 측면에서).
jbrennan

3
어쩌면 나는 마조히스트이지만 접두사 클래스 이름을 좋아합니다. Google 및 문서 검색이 명확하게 이루어 지므로 클래스가 NSString이라는 경우 사용하는 문자열 종류에 대해 혼동되지 않습니다.
kubi

36

C ++

  • 문자열.
    플랫폼 문자열과 상호 운용이 불가능하므로 std :: vector를 절반으로 사용합니다. 복사 정책 (쓰기시 복사 또는 딥 카피)이 정의되지 않았으므로 간단한 구문에 대해서는 성능을 보장 할 수 없습니다. 때로는 사용하기에 직관적이지 않은 STL 알고리즘에 의존하기도합니다. 너무 많은 라이브러리가 유감스럽게도 사용하기에 훨씬 편합니다. 당신이 그들을 결합하지 않는 한.

  • 다양한 문자열 표현
    이제, 이것은 약간의 플랫폼 문제이지만 여전히 덜 표준적인 표준 문자열 클래스를 사용할 수 있었을 때 더 좋았기를 바랍니다. 자주 사용하는 다음 문자열 표현은 다음과 같습니다.

    • 일반 LPCTSTR,
    • CoTaskMemAlloc에 ​​의해 할당 된 LPC (W) STR,
    • BSTR, _bstr _t
    • (w) 끈,
    • CString,
    • std :: vector
    • 알려진 길이의 (w) char * 버퍼에 범위 확인 및 기본 작업을 추가 하는 롤 마이 클래스 ( sigh )
  • 모델을 빌드하십시오.
    나는 누구를 포함하고, 앞으로 선언하고, 미리 컴파일 된 헤더를 최적화하고, 적어도 증분 빌드 시간을 견딜 수있는 등을 유지하는 등을 포함하여 모든 시간을 잃어 버렸습니다. 80 년대에 좋았지 만 지금은? 코드 조각을 포장하는 데 너무 많은 장애물이있어 재사용 할 수 있으므로 엄마 개조차도 지루해합니다.

  • 파싱하기
    어려운 경우 외부 도구를 작성하기가 특히 어려워집니다. 그리고 오늘날, 우리 C ++ 직원들은 대부분 툴체인에 부족합니다. 저는 C # 리플렉션과 델리게이트를 좋아하지만 그들 없이는 살 수 있습니다. 큰 리팩토링이 없으면 할 수 없습니다.

  • 스레딩이 너무 어려워
    언어는 현재까지 그것을 인식하지 못하며 컴파일러의 자유는 크지 만 고통 스럽습니다.

  • 정적 및 주문형 초기화 기술적으로는 여기서 속임수입니다. "재사용을위한 코드 정리"의 또 다른 퍼즐 조각입니다. 필요할 때만 초기화되는 것은 악몽입니다. 다른 모든 redist 문제에 대한 최선의 해결책은 모든 것을 헤더에 넣는 것입니다.이 문제는 "neeener-you cannot"이라고 말합니다.


물론 많은 언어가 엄격한 언어 범위를 벗어 났지만 IMO 전체 툴체인을 판단하고 발전시켜야합니다.


STL에서 문서를 보는 것은 처음부터 그래픽 카드를 작성하는 방법에 대한 매뉴얼을 찾는 것과 같습니다.
aviraldg

솔직히 말해서, 이러한 점들 대부분은 C ++을 제대로 배우는 데 전혀 신경 쓰지 않는 것처럼 들립니다 ... 포함 가드는 모든 C ++ 프로그래머가 알아야 할 것이므로 # 3에서는 다소 분명 합니다. 포인트 1을 이해하는 방법을 잘 모르겠습니다. 혼란 스럽 std::string습니까? 아마도 좋은 문서 및 / 또는 자습서를 읽고 std::vector(그리고 std::string설계되지 않은 곳에서 사용하지 않아야하는 이유) 그것을 해결할 수 있습니다.

@ nebukadnezzar : STL에서 Meyers를 밝히는 것을 발견했지만 근본적인 문제를 해결하지는 못합니다. 솔직히 이것은 대규모 프로젝트를 유지할 필요가 없었던 것처럼 들리지만 수십 개의 포함 계층 구조에서 순환 종속성을 찾아야 할 필요가 없습니다. 경비원을 포함하고 있다는 것을 알고 있지만 왜 우리가 그들을 귀찮게해야합니까? BTW. 모든 문제를 해결하지는 않습니다. std::string절반의 시간을 사용할 수 없다면 "표준"은 어떻습니까? (C ++ 0x는 적어도 그 문제를 해결하지만 여전히 다른 문자열 표현을 사용하는 수십 개의 라이브러리에 붙어 있습니다).
peterchen

but why do we have to bother with them (inclusion guards)-C ++에는 모듈이 없기 때문에. How "standard" is a std::string if I can't use it half of the time?-사용 방법에 따라 다릅니다 std::string. 문자열 클래스는 같은 문자열 데이터에 액세스 할 수 있습니다 const char*를 통해 std::string::c_str이미 만드는, std::string또한 이루어지는 모든 클래스 / 기능과 완벽하게 호환 const char*인수를.

C ++에는 모듈이 없기 때문에 -내 불만 : 빌드 모델은 골동품입니다 (모듈 이외의 다른 솔루션도 받아 들일 것입니다). ----- 완벽하게 호환 가능 하지만 다른 많은 시나리오와 완벽하게 호환되지 않습니다 (C ++ 0x를 수정하면 여기에 요점이 있다고 말합니다.) std :: string이 충분히 널리 퍼져 있다면 기쁠 것입니다. 10 년 전에 문자열 클래스로 채택되었지만 다른 불만은 없었습니다.
peterchen

35

자바 스크립트 :

  • Object프로토 타입을 수정할 수 있습니다. 프로그램의 모든 단일 객체는 새로운 속성을 가져오고 무언가가 깨질 수 있습니다.

  • 모든 객체는 해시 맵이지만 안전하게 사용하기는 어렵습니다. 특히 키 중 하나가이면 __proto__문제가있는 것입니다.

  • 함수 참조 시간에 객체가 닫히지 않습니다. 실제로, this객체 표기법이나 new연산자 로 함수를 호출 할 때마다 객체 클로저가 전혀 설정 되지 않습니다 . this프로그래머가 기대하는 것으로 설정되어 있지 않기 때문에 특히 이벤트 콜백을 생성 할 때 많은 혼란이 발생 합니다.

    • 추론 : 함수 호출 이없는 개체 또는 표기법 new연산자 결과 this집합 인 훨씬 파손 결과 글로벌 물체 동일.
  • 두 연산자가 근본적으로 다르더라도 문자열 연산자를 연결하기 위해 오버로드 된 덧셈 연산자. 숫자로 예상되는 값이 실제로 문자열 인 경우 통증이 발생합니다.

  • ==!=연산자는 타입 강제 변환을 수행합니다. 다른 유형의 비교에는 필사자가 완전히 기억할 수없는 규칙 목록이 포함됩니다. 이는 연산자 ===!==연산자 의 존재에 의해 완화됩니다 .

  • 모두 nullundefined미묘하게 다른, 아직 중복 의미로 존재한다. 왜?

  • 프로토 타입 체인 설정을위한 이상한 구문.

  • parseInt(s)C 스타일의 숫자가 필요하므로 선행 0이있는 값을 8 진수 등으로 처리합니다. 최소한 parseInt(s, 10)기본 동작은 혼란 스럽습니다.

  • 블록 범위가 없습니다.

  • 동일한 변수를 두 번 이상 선언 할 수 있습니다.

  • 선언하지 않고 변수를 사용할 수 있습니다.이 경우 전역 변수 일 수 있으며 프로그램을 손상시킬 수 있습니다.

  • with { }.

  • 정말 도구 등의 JavaDoc에 문서화하기 어렵다.


3
의 경우 nullundefined: 가끔은 정말 변수에 값이 할당되었는지의 경우 알고 싶어요. null은 값이므로 undefined가 유일한 방법입니다. 물론, 이것이 유용하다고 생각한 유일한 시간은 게터 / 세터 함수를 만드는 데있었습니다.
Zach

1
"키 중 하나가 프로토 인 경우 "-특별한 의미를 가진 예약어입니다. for변수 이름으로 사용할 수 없다는 불평과 같습니다 .
nickf

5
@nickf : 해시의 열쇠는 문자열입니다. 문자열은 예약어를 포함하여 모든 값을 가질 수 있습니다. 특히이 값 "for"은 해시 키로 유효합니다. __proto__예약어가 아닙니다. 해시 키로 사용될 때 예상대로 작동하지 않는 특수 문자열 값은 모든 언어에서 연관 배열이 작동하는 방식에 대한 합리적인 기대를 위반합니다. 또한 EcmaScript 사양을 위반합니다.
Daniel 캐시디

2
토마스 : 줄 바꿈이 항상 성명을 끝내지는 않습니다. 따라서 현명한 코더는 코드를 더 명확하게하기 위해 세미콜론으로 모든 명령문을 종료합니다.
Daniel Cassidy

2
newline may or may not end a statement depending on context내 상위 5 개 목록의 하나입니다
reinierpost

34

파이썬 :

  • 정적 타이핑 부족
  • 기본 인수 처리 (특히 향후 발신자 의 기본 인수변경할 수 있다는 사실 !)
  • 필요한 밑줄이 너무 많습니다 (생성자를 호출해야합니다 __init__).
  • 적절한 개인 구성원 및 기능 부족 (컨벤션은 밑줄로 시작하는 대부분의 항목이 개인 정보 __getattr__가 아니라고 말합니다.
  • print파일에 대한 재미있는 구문 (하지만 파이썬 3에서는 수정 중입니다)

10
내가 원하는 것은 정적 유형을 사용 하는 옵션 입니다.
Greg Hewgill

4
BTW : init 는 실제로 생성자가 아니며 객체를 입력하면 이미 생성되었습니다 (자체가 무엇인지 추측합니다 ...). 생성자는 인스턴스화 할 클래스에 액세스 할 수있는 완전히 새로운 것입니다.
André

90
정적 입력을 선호한다면 왜 파이썬이 가장 좋아하는 언어입니까?
핀앤

9
finnw : 정적 타이핑은 일부 유형의 프로그램에 적합하며 다른 유형에는 필요하지 않습니다. 나는 보통 정적 타이핑이 부족하다는 것을 신경 쓰지 않지만 필요할 때 적어도 옵션을 갖는 것이 좋습니다.
그렉 휴길

8
나는 정적 타이핑의 부족이 기능이 아닌 기능이라고 말할 것이다 ...
arnorhs

32

씨#

  • 나는 switch()어떤 유형 으로든 할 수 있으면 좋겠다 case.

  • '읽기 전용'필드 / private setautoprops 와 함께 객체 초기화 구문을 사용할 수 없습니다 . 일반적으로 불변 유형을 만드는 데 언어 도움이 필요합니다.

  • 의 사용 {}에 대한 네임 스페이스클래스방법특성 / 인덱서 블록다중 문 블록배열 이니셜 라이저 . 멀리 떨어져 있거나 불일치하는 위치를 파악하기 어렵습니다.

  • 나는 글쓰기가 싫어 (from x in y ... select).Z(). 쿼리 구문에 무언가가 없기 때문에 메소드 호출 구문으로 돌아가고 싶지 않습니다.

  • do쿼리 구문에 대한 절을 원합니다 foreach. 그러나 그것은 실제로 쿼리가 아닙니다.

나는 정말로 여기에 도달하고있다. 나는 C #이 환상적이라고 생각하며 깨진 부분을 찾기가 어렵습니다.


14
모든 유형의 스위치에 +1
oɔɯǝɹ

지금까지 생각하지 못한 스위치 문제 및 {} 문제에 대해 +1
Maslow

나는 {}이 싫다. 그들은 ()처럼 너무 많이 보입니다. 불일치는 기본적으로 한 줄짜리가 아닌 한 항상 같은 수준에두기 때문에 나에게 큰 문제가되지 않았습니다.
Loren Pechtel

2
linq 쿼리의 경우 +1 특히 하나의 객체 만 반환하려는 경우. (x in y select) .first () 대신에 (x in y select top 1) 또는 실제 SQL 구문에 더 적합한 것이 아닌 이유는 무엇입니까?
AdmSteck

원하는 경우 모든 유형에서 switch () 할 수 있으며이 경우 F # 패턴 일치를 확인하는식이 될 수 있습니다. c-sharpcorner.com/UploadFile/mgold/…
gradbot

26

PHP

  1. 서버를 제어하지 않으면 디버깅 기능이 없습니다.
  2. 많은 PHP 코드가 떠 다니면 모든 PHP 프로그래머에게 나쁜 이름이됩니다.
  3. 일관되지 않은 함수 이름
  4. 원하는 경우 정적 유형 변수를 사용할 수 없음 (나는 90 %의 동적 타이핑을 좋아하는 팬입니다)
  5. REGISTER_GLOBALS는 악마입니다

25
register_globals를 한 번 내 강아지 :( 식사
핌 야거

2
1 : xdebug 및 MacGDBp와 같은 GUI 클라이언트를 권장합니다. 그것은 고통의 일부를 진정시킵니다 ... 나는 다른 점에 동의합니다.
Jonas Due Vesterheden

5
# 2 : 맙소사, 저를 시작하지 마십시오. 필자는 항상 많은 사람들이 PHP로 생성하는 혼란을 본 사람들에 대해 PHP 개발자로서 자신을 변호해야합니다.
selfawaresoup

1
# 2 +1 저는 PHP 개발자로서 자신을 방어하는 데 너무 많은 시간을 보냈습니다.
UnkwnTech

# 2의 경우 +
Shiki

25

C (좋아, 내가 가장 좋아하는 것은 아니지만 아직 끝나지 않았다.)

  • 소켓 라이브러리 구문.
  • 기능 과부하가 없습니다.
  • C 스타일 문자열.
  • 버퍼 오버런
  • 암호화 구문. 아토 이와 같은 물건을 몇 번이나보고 이마를 때렸으며 "물론!"

편집 : 더 많은 라이브러리 코드에 의존하면 (아마도 소켓을 사용했지만 특히 나쁩니다) 더 많은 것을 생각해 낼 수는 있지만 이미 C를 고르는 데 바람 피는 것처럼 느꼈습니다. C의 좋은 부분은 죽은 말을 때리는 것과 같은 나쁜 것을 대체합니다.


22
어떤 소켓 구문? C에는 소켓 개념이 없습니다.
Ferruccio

3
오! 당신은 5를 생각 해낼 수 있습니다. 포인터 산술이 그냥 빨리 지 않습니까? :)
brian d foy

8
+1 "C 스타일 문자열"을 비웃었습니다. 그리고 @brain_d_foy : 포인터 산술은 이해하지 못하면 짜증납니다.
Chris Lutz

1
@Chris Luts : 평범한 C를 배우고 있었을 때조차도 (C ++ 또는 다른 OO 언어를 알기 전에) char 배열에 문제가 있음을 알았습니다. :)
Bill the Lizard

2
포인터 산술은 파워 톱입니다 – 매우 효율적이지만 다리 전체를 감수 할 위험이 있습니다
Thorbjørn Ravn Andersen

24

일반적인 Lisp :

  1. 키워드가 너무 많은 경우가 많습니다.
  2. 도서관 지원은 불쌍합니다.
  3. 메모리를보다 엄격하게 처리하려는 OS에서는 제대로 작동하지 않습니다.
  4. OS와의 상호 작용을위한 좋은 기능이 없습니다.
  5. "루프"기능은 잘 정의되어 있지 않으며 Lispy처럼 보이지 않습니다.

2
'루프'는 lispy가 아닐 수도 있지만 그것에 대해 잘못 정의 된 것은 무엇입니까?
다니엘 캐시디

2
나는 표준을 스스로 읽지 않았다. 나는 대부분 Paul Graham의 "On Lisp"에 가고있다. 그는이 표준은 대부분 예이며 코너 사례를 전혀 정의하지는 않는다고 말했다.
David Thornley

3
너무 까다로운 키워드를 의미하지 않습니까?
GClaramunt

나는 그것이 "거만한"것이 아니라는 것에 동의하지만 CLtLv2는 그것에 많은 시간을 소비합니다. 나는 그것이 너무 많은 방식으로 설계되었다고 생각합니다. sunsite.univie.ac.at/textbooks/cltl/clm/…
Hans Van Slooten

"루프"외에도 "포맷"도 리스프와 비슷하지 않습니다. Lisp가 내가 가장 좋아하는 언어이지만 "포맷"과 "루프"가 모두 싫어요.
Paul Reiners

24

BrainF * ck

  • 당신의 하이라이트는 당신이 튜링을 완료 했다는 것입니다 ! Perl 정규식에서 더 많은 것을 할 수 있습니다!

  • 개체 부족. 씨몬! 마치 안녕하세요 ...

  • 네트워킹 라이브러리가 없습니다. 내가 원하는 것은 웹 페이지를 긁는 것입니다.

  • 일류 기능이 없습니다. 축하합니다 — 자바 친구들과 대화를 나눕니다.

  • 저장을위한 무한 테이프. 이것은 우리가 Lisp를 쓰고있을 정도로 매우 소박합니다.


6
네임 스페이스 또는 동적 모듈 지원이 없습니다. 그러한 기초가없는 화학 플랜트 제어 시스템을 어떻게 작성할 수 있습니까?
Donal Fellows

> 10 (10 번 이동), 0 (0 삽입), +5 (5 추가)와 같은 구문 설탕은 없습니다.
Squall

23

자바 스크립트

  1. 숫자를 문자열로-숫자를 문자열로 해석하면 수학이 좌절 될 수 있습니다. 5 + 2 = 52? 아 ...
  2. 권한-모든 최고의 물건은 사용자의 권한이 필요합니다!
  3. 화면 업데이트-화면을 업데이트하려면 브라우저가 정상 상태 여야합니다. 스크립트 중간에 화면을 강제로 업데이트하는 방법이없는 것 같습니다.
  4. 느리다-구글의 크롬은 좋지만 ...
  5. 브라우저 차이로 인해 언어 사용이 검열됩니다.

4
문자열로 된 숫자는 쉽게 고정됩니다. 문자열이 있다면 구문 분석해야합니다 (x, 10). 가장 큰 실패는 10을 제외하고 '017'을 OCTAL로 해석하는 것입니다.
Orion Edwards

3
false == 0 == [] == ""그러나 null 및 NaN은 아닙니다. NaN! = NaN. null == null입니다.
Jimmy

7
typeof "문자열"== "문자열". . 대해서 typeof 새로운 String ( "다른 문자열") == ".. 개체에 새로운 문자열 ( 'A') 생성자 =="A ".constructor 대해서 typeof 새 Array () == '객체'
지미

1
for (x in object)는 함수를 반환
Jimmy

14
-1,이 목록은 대부분 언어 자체가 아니라 브라우저 문제에 관한 것입니다.
Mauricio Scheffer

20

PHP :

  • 거의 모든 특정 확장명을 모든 웹 서버에서 사용할 수 있다고 확신 할 수 는 없습니다.
  • 미래의 모든 것이 되려고 노력합니다 (고토, 폐쇄, ...)
  • 경험이없는 사용자에게 많은 보안 위험
  • 더 많은 연산자 과부하가 좋을 것입니다
  • 제대로 작동하는 방법을 배우지 못하고 나쁜 이름을 짓는 가난한 프로그래머

그럼에도 불구하고 PHP는 (스크립트) 언어. ;-)


좋아, 한 가지만 더!
brian d foy

4
포인트 5에 완전히 동의하십시오-Javascript 목록에도 있습니다.
Steve Claridge

나는 "올바른 작동 방법을 배우지 못하고 나쁜 이름을 지어주는 모든 가난한 프로그래머들"에 동의하지 않는다. "런타임 언어 구성 옵션에 대한 대량 고정"으로 바 꾸었습니다.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. Windows 만 해당
  2. 더 이상 지원되지 않습니다.
  3. 배열은 모든 수에서 시작될 수 있으며 모두 0으로 정규화됩니다.
  4. 컴파일 된 응용 프로그램은 제대로 실행하기 위해 많은 dll에 의존합니다.
  5. 브라우저 컨트롤이나 복잡한 코드 조각과 같은 많은 복잡한 컨트롤은 컴파일되지 않은 코드를 실행할 때 IDE를 중단시키는 경향이 있지만 컴파일 할 때는 제대로 작동합니다.

13
VB는 누군가가 가장 좋아하는 언어입니까? O_o. 왜 "완전히 다른 언어와 호환되지 않는 신 타즈"와 "다른 언어와 관련하여 나쁜 습관을주는 것"이 ​​아닌가?
Jonta

3
실제로 # 3은 버그가 아닌 매우 강력한 기능입니다. VB.NET이 정말 좋았습니다. AWK는 어떤 의미에서 그것을 가지고 있지만 AWK 배열에서는 실제로 위장으로 해시됩니다. (
Joe Pineda

3
1과 4에서 .NET C #에는 완전한 프레임 워크와 운영 체제가 필요하지 않습니까 ??? (이봐, 나는 너가 모노 토트라고 들었다. 그것은 여전히 ​​당신을위한 "완전한 틀"이고, 나는 데비안의 dist가 그것을 먹는 것을 의심한다). 5에 관해서는, (오늘 되돌아온) 올바른 VB6 프로그래머는 기본 "요청시 컴파일"옵션을 ON으로 유지하지 않았습니다.
jpinto3912

2
여전히 vb6을 지원해야합니다. Pet pieves : 선언 할 때 변수를 초기화 할 수없고 매개 변수가있는 생성자가 없으며 파일 당 하나의 클래스 등이 있습니다. 이러한 문제를 해결하면 언어가 10 년 더 쉬워 질 수 있습니다.
AngryHacker

14
"On Error Resume Next"는 어떻습니까? "이 코드는 F ** KED이지만 계속 실행할 수 있습니다. =)
StingyJack

18

루비는 제가 가장 좋아하는 언어입니다. 여기 제가 싫어하는 것이 있습니다 :

  • 녹색 스레드 + C 라이브러리 차단 = 대규모 실패
  • 너무 느리게
  • 표준 라이브러리 자체는 bang 사용과 일치하지 않습니다! 행동 양식
  • 모듈 포함 + 확장이 지저분합니다.
  • "Open Classes"의 범위를 지정할 수 없습니다. String # dostuff를 추가하고 싶지만, 모든 타사 라이브러리로 유출되는 것을 원하지 않습니다.
  • 바이너리 배포 패키징 솔루션이 없습니다.

3
Ruby 1.9.1을 사용해 보셨습니까? 그것은 루비 1.8.6에 비해 엄청난 속도 향상을 제공합니다
기독교 스타드 - SCHULDT에게

jrubyc을 사용해보십시오. JVM JIT FTW!
KitsuneYMG

최상위 루비 답변의 '싫어'와는 달리 합리적인 문제를 포함하여 +1.
Phrogz

17

델파이 :

  • IDE가 약간 불안정합니다.
  • 코드 통찰력이 때때로 혼란스러워집니다.
  • 디버깅은 때때로 버그가 있습니다.
  • 여러 프로젝트 파일을 업데이트하는 것은 번거로울 수 있습니다.
  • 하나 이상의 패키지를 사용할 수 없을 때 시작하면 오류 메시지가 여러 번 나타납니다.

5
이 모든 것들은 델파이 언어보다는 델파이 IDE에 대한 불만 인 것 같습니다 (AKA Object Pascal)
Dónal

11
아마도 오브젝트 파스칼이 완벽하기 때문일 것입니다. ;-)
Mark Bessey

3
나는 파티에 약간 늦었지만 어쨌든 여기에 간다 :-메소드 서명을 두 번 써야 (인터페이스 + 구현)-유닛 이름은 파일 이름과 동일해야합니다. WTF?!?
Martijn

1
begin..end가 우월하다는 것을 알았습니다. {}보다 훨씬 명확합니다. 코드를 작성하는 것보다 코드를 읽는 데 더 많은 시간을 소비합니다. 그래도, 범위 내에서 범위를 선언하면 완벽하게 합법적이지만 사례에 정의 된 열거 유형의 하위 범위를 사용할 수 없습니다. 또한 단위 전체에 대한 순방향 참조는 없습니다.
Loren Pechtel

1
@AlexanderN : 아니요, 더 생생하고 인기 있거나 훌륭한 적이 없었습니다.
Andreas Rejbrand

16

자바 스크립트

  • 모든 스크립트는 단일 글로벌 '네임 스페이스'에서 실행됩니다 ... 다른 소스의 스크립트로 작업 할 때주의해야 할 사항

  • 변수가 사용되었지만 사전에 정의되지 않은 경우 전역 변수로 간주됩니다

  • 브라우저 벤더는 원하는대로 표준을 구성하여 개발자가 그렇게 아름다운 언어를 사용하는 것보다 더 어려운 언어를 사용하도록 코딩합니다

  • 대소 문자 구분-컴파일 타임 검사로 js를 개발하기위한 적절한 IDE가 없다는 것을 고려

  • hasOwnProperty간단한 작업을 수행하기 위한 해결 방법 (예 : 메서드 사용 )


AFAIK, 브라우저 공급 업체 의 JS 언어 (DOM이 아님)에 대한 모든 확장 은 표준 프로세스가이를 달성하지 못한 경우에도 최소한 표준 채택을 추진했습니다. hasOwnProperty / 해결 방법 : 양날의 칼. "단순성"을 강요하기 위해 우리는 많은 힘과 유연성을 잃습니다. 그 불만은 항상 나를 화나게합니다. 루프를 올바르게 작성하고 객체 멤버도 확인하십시오!
eyelidlessness

15

하스켈 :

  1. 게으른 평가로 인해 공간이 누출됩니다.
  2. 수학 추상화와 관련하여 숫자 계층 구조가 구성되지 않았습니다.
  3. 엄격한 monadic IO는 디버깅하기가 더 어려울 수 있습니다.
  4. 큰 구현은 표준과 호환되지 않는 방식으로 I / O를 처리합니다. (특히 문자를 출력하면 하위 8 비트 만 출력 한 다음이 가정을 사용하여 이진 I / O를 수행하는 코드가 작성됩니다. Ick.)
  5. ($)연산자의 연관성을 변경하여 일부 표현을 더 예쁘게 만들 수 있습니다.

이들 중 대부분은 증오 수준까지 올라가지 않으며, 이들 각각에 대한 확실한 해결 방법을 수정하거나 구성하려는 사람들이 있습니다.

편집 : 포인트 5에 대해 약간의 혼란이있었습니다. 특히 일부 사람들은 내가 논쟁의 순서를 의미한다고 생각하는 것 같습니다. 내가 의미하는 바를 설명하는 대신, 사람들에게 다음 링크 ( http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity )를 알려 주면됩니다.


3
($)의 연관성을 변경하려는 이유는 무엇입니까? 'fghx'괄호는 '((fg) h) x'로, 'f $ g $ h $ x'괄호는 'f (g (hx))'로 나타냅니다.
Erik Hesselink

1
나는 <3 Haskell. 표준 라이브러리는 벡터 공간 등을 포함한 수학적 추상화의 산을 포함해야합니다. 또한 전주에는 ($)와 유사하지만 왼쪽에서 오른쪽으로 연결되는 연산자가 필요합니다. {source |> func1 |> filter func2 |> map (func3 10)}.
yfeldblum

10
Haskell 프로그래머가 하나의 문자 변수 이름을 사용하는 경향이 있습니다.
Benjamin Confino

1
왼쪽 연관 ($) 연산자는 함수 응용 프로그램이며 Haskell에서는 공백 문자로 표시됩니다. @ 정의 : 플립 기능을 사용해보십시오. (|>) = flip ($)
Apocalisp 2016 년

1
누군가 # 5의 요점을 설명 할 수 있습니까? 나는 올바른 연관성이 ($)의 요점이라고 생각했습니다.
Tim Matthews
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.