가장 좋아하는 언어에 대해 싫어하는 다섯 가지는 무엇입니까? [닫은]
최근 Stack Overflow에 Perl-hate 클러스터가 있었기 때문에 " 좋아하는 언어에 대해 싫어하는 5 가지 "질문을 Stack Overflow 로 가져 오겠다고 생각했습니다 . 당신이 가장 좋아하는 언어를 가지고 당신이 싫어하는 다섯 가지를 말해주세요. 문제가 될 수도 있고, 디자인 결함을 인정하거나, 성능 문제를 인정하거나, 기타 범주 일 수도 있습니다. 당신은 그것을 미워해야하며, 가장 좋아하는 언어 여야합니다.
다른 언어와 비교하지 말고 이미 싫어하는 언어에 대해서는 이야기하지 마십시오. 좋아하는 언어로 좋아하는 것에 대해 이야기하지 마십시오. 나는 당신이 싫어하지만 용납하는 것들을 듣고 싶어서 다른 것들을 모두 사용할 수 있고, 다른 사람들이 사용하기를 원하는 언어에 대해 듣고 싶습니다.
나는 누군가가 나에게 가장 좋아하는 언어를 강요하려 할 때마다, 때로는 인터뷰 질문으로 이것을 요구합니다. 누군가 자신이 좋아하는 도구에 대해 미워할 다섯 가지를 찾을 수 없다면 도구를 옹호하거나 사용하여 큰 돈을 벌 수있는 도구를 충분히 알지 못합니다. 그는 그것을 완전히 탐구하기에 충분히 다른 상황에서 그것을 사용하지 않았습니다. 그는 그것을 문화 나 종교로 옹호하고 있습니다. 즉, 제가 좋아하는 기술을 선택하지 않으면 잘못되었습니다.
나는 당신이 사용하는 언어를별로 신경 쓰지 않습니다. 특정 언어를 사용하고 싶지 않습니까? 그럼 하지마 당신은 현명한 선택을하기 위해 실사를 겪고 여전히 그것을 사용하지 않습니까? 좋아. 때로는 정답은 "좋은 연습과 Bar에 대한 경험이 많은 강력한 프로그래밍 팀이 있습니다. Foo로 변경하는 것은 어리석은 일입니다."
이것은 코드 검토에도 좋은 질문입니다. 실제로 코드베이스를 아는 사람들은 그것에 대한 모든 종류의 제안을 할 것이고, 그것을 잘 모르는 사람들은 비 특정 불만을 가지고 있습니다. "이 프로젝트에서 다시 시작할 수 있다면 어떻게 다르게 할 것입니까?" 이 환상의 땅에서 사용자와 프로그래머는 자신이 싫어하는 모든 것에 대해 불평합니다. "더 나은 인터페이스를 원합니다", "모델과 뷰를 분리하고 싶습니다", "이 모듈 대신이 모듈을 사용하겠습니다", "이 메소드 세트의 이름을 바꿉니다"또는 실제로 그들이하는 모든 것 현재 상황이 마음에 들지 않습니다. 이것이 특정 개발자가 코드베이스에 대해 얼마나 많이 알고 있는지에 대한 처리 방법입니다. 또한 프로그래머가 얼마나 많은지에 대한 단서이기도합니다.
증오 만이 사람들이 얼마나 많이 알고 있는지 알아내는 유일한 차원은 아니지만 꽤 좋은 것으로 나타났습니다. 그들이 싫어하는 것들은 또한 그들이 그 주제에 대해 얼마나 잘 생각하고 있는지에 대한 단서를 제공합니다.
Java에 대해 싫어하는 5 가지 :
- 일류 기능이 없습니다.
- 형식 유추가 없습니다.
- 예를 들어 그래픽과 같은 기본 설정이 부족합니다.
- NullPointerException에 null에 대한 추가 정보가 포함되어 있지 않습니다.
- 무의식적으로 "구성 가능한"프레임 워크 / 서비스 제공자 인터페이스 / 팩토리 클래스 / 종속성 주입 시스템의 확산. 구성 가능성은 거의 사용되지 않으며 DRY는 엄중하게 위반되며 크기는 4 배, 가독성은 절반으로 줄어 듭니다.
스칼라를 확인해야합니다.
와우, SQL 이 아직 여기에 있지 않은 것에 놀랐 습니다. 아무도 그것을 사랑한다는 것을 의미하는 것 같아요 :)
- 여러 구현에서 일관되지 않은 구문
- 미묘한 코드 차이로 인해 모호한 이유 때문에 성능이 크게 저하 될 수 있습니다.
- 텍스트 조작에 대한 지원 부족
- 쉬운 입학 비용이지만 언어 숙달을위한 가파른 학습 곡선
- 모범 사례를위한 커뮤니티 전체의 최소 표준화에는 구문 스타일이 포함됩니다.
... 추가 비용없이 증오해야 할 몇 가지 보너스 이유
- WHERE 절이 마지막에 오기 때문에 UPDATE 또는 DELETE를 조기에 쉽게 실행하여 전체 테이블을 파괴 할 수 있습니다. 대신, 어디로 가야합니까?
- 관계 분할을 구현하기가 어렵습니다.
- 값을 NULL로 설정할 수 있지만 NULL과 같은지 테스트 할 수 없습니다. IS NULL을 확인할 수 있지만 필자의 의견으로는 코드가 복잡해집니다.
- 열에 별칭을 설정 한 다음 별칭으로 GROUP BY 별칭 (또는 SORT에서와 같이 열 인덱스)을 설정하지 않고 GROUPed 열에 대한 수식을 완전히 다시 지정해야하는 이유는 무엇입니까?
자바 스크립트 :
가장 멋진 것들은 모두 복잡하지만, 그 차가움은 너무 적은 양의 코드로 싸여있어 그것을 따르려고 애쓰는 것에 대해 어리석은 느낌입니다.
'+'는 약한 유형의 언어로 연결하기 위해 부당한 선택 연산자입니다. 그들은 멍청한 놈들 을 놀라게 하려고 했습니까?
브라우저 간 호환성 마인 필드입니다 (켜져 있어도 상관 없습니다)
일반적으로 신뢰할 수 없습니다-뒤로 버튼 차단, 절대 죽지 않는 팝업 등과 같은 쓰레기와 관련이 있습니다.
몇 가지 다른 오류 메시지와 몇 가지 다른 유형 (Number, String, Object 등)이 있기 때문에 디버깅이 거의 불가능합니다.
jQuery가 아니었다면 아마도 내가 사용했던 것만 큼 미워했을 것입니다 :)
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) 보너스 답변 : '@'. 코드를 올바르게 작성하는 데 방해가되지 않으면 '@'만 추가하면 나중에 코드를 디버깅해야하는 사람에게는 너무 나빠질 수 있습니다.
C ++
- 무작위로 메모리를 손상시키고 찾기가 거의 불가능한 버그를 만들기에는 너무 쉽습니다 ( Valgrind 는이를 해결하기 위해 먼 길을 갔지만 ).
- 템플릿 오류 메시지
- 템플릿을 사용할 때 모든 것을 하나의 파일에 포함시킨 다음 어리석은 컴파일 시간을 가져야합니다.
- 표준 라이브러리는 현대에 농담입니다 (기본적으로 스레드 또는 네트워크가 없습니까?)
- 불쾌한 C 비트가 많이 나옵니다 (특히 short / int / signed / etc 사이의 모든 변환).
C # / .NET :
- 클래스는 기본적으로 봉인되어야합니다
lock
명령문 이 없어야합니다 . 대신 특정 잠금 오브젝트가 있어야하고Acquire
일회용 잠금 토큰을 리턴하는 메소드가 있어야합니다 . 결론 : 모든 개체에 대한 모니터가있는 것은 아닙니다.GetHashCode()
과Equals()
에 안System.Object
모든 것이의 적절한 해시 -. 대신,이IdentityComparer
같은 일을하는을하고, 유지IComparer<T>
,IComparable<T>
,IEqualityComparer<T>
및IEquatable<T>
사용자 정의 비교를위한 인터페이스를.- 불변성에 대한 빈약 한 지원
- 확장 방법을 발견하는 잘못된 방법-네임 스페이스를 사용한다는 사실보다 훨씬 더 의식적인 결정이어야합니다.
그것들은 내 머리 꼭대기에서 벗어났습니다. 내일 묻고 다른 5를 생각해 낼 것입니다. :)
씨
- 문자열 조작.
문자열 버퍼를 수동으로 처리해야하는 것은 오류가 발생하기 쉽습니다. 너무 많은 컴퓨팅이 실제로 문자열을 이동하고 수정하기 때문에 (컴퓨터는 사람들이 생각했던 것처럼 많은 수의 크 런칭에 많이 사용되지 않습니다) 관리되는 언어 또는 C ++의 문자열을 사용하는 것이 정말 좋습니다 이것들을 다루는 객체. 똑바로 C로해야 할 때, 빠른 모래에서 수영하는 느낌이 듭니다.
"어떤 언어에 대해 싫어하는 것"목록에 대해 내가 싫어하는 다섯 가지는 어떻습니까? :디
5- 주황색을 칠해도 사과가 아닙니다.
언어를 디자인 할 때 디자이너는 일반적으로 유용한 언어를 염두에 둡니다. 뭔가 완전히 다른 것이 사용 깡통 작동하지만 그렇지 않은 경우 불평 그냥 바보입니다. 파이썬을 가져 가라. 누군가가 있거나 언젠가 파이썬 코드에서 exe를 만드는 유틸리티를 만들 것이라고 확신합니다. 왜 하나님의 땅에 당신이 할 싶어 그렇게? 깔끔하지만 — 나를 오해하지는 않지만 — 사용하지 않습니다. 그것에 대해 불평을 중지하십시오!
잘 설계된 프로젝트에는 여러 언어의 코드가 포함될 수 있습니다. 한 언어로만 프로젝트를 완료 할 수는 없습니다. 어떤 프로젝트는 당신이 사용하는 언어의 능력 안에있을 수 있습니다.
4- 당신은 나무 다리에 서 있습니까?
플랫폼은 언어의 기능에 큰 영향을 줄 수 있습니다. 오늘날 가비지 수집기 나 심지어 "가비지 수집"에서의 초기 파스칼 시도로 메모리 페이드 (어쩌면 malloc 더 많은 램 ??)를 도울 수 있습니다. 컴퓨터가 더 빠르기 때문에 우리는 더 많은 언어를 기대합니다. 그리고 솔직히 말해서 우리는 아마해야 할 것입니다. 그러나 해시 테이블이나 문자열 또는 다양한 다른 개념을 작성하기 위해 컴파일러의 편의를 위해 많은 비용이 듭니다. 이러한 것들은 사용되는 플랫폼에 상속되지 않을 수 있습니다. 언어에 포함하기 쉽다고 말하면 다리가 없을 수도 있습니다.
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 프로그래밍 언어에는 심각한 디자인 결함이있을 가능성이 높습니다. 다시 .. 언어의 의도와 디자인에 따라 다르므로 특정 언어를 선택하려고 시도하지 않고 여기에 분석 할 언어가 너무 많습니다. 누구든지, 코드가 어디에 살고 가장 효과적인지를 고려해야합니다. 기능을 추가하지 않거나 지원하지 않는 무언가에 플레어를 추가하면 키보드가 더 빨리 마모됩니다. 아무도 좋은 일을하지 않습니다. 글쎄 .. 당신이 아마 당신에게 잘못 가르친 사람의 브라우니 점을 좋아하지 않는 한 모든 것이 대상이라는 것을.
간단히 말해서 프로그래밍은 키보드를 무심코 두드리는 것이 아닙니다. 모든 프로젝트에는 많은 디자인 고려 사항이 있습니다. 나는 그것이 진부한 것을 알고 있지만, 당신은 모든 각도에서 그것을 봐야합니다. 오늘날에도 안전한 유형의 언어입니다. 코드를 정리하지 않고 잘 작동 할 것으로 기대합니다. 물론 .. 그것은 효과가있을 수 있지만, 올바른 방법이 아닐 수도 있습니다. 전반적으로 특정 작업과 환경에 가장 적합한 언어와 형식을 선택하십시오. 그러나 어떤 언어도 그 뒤에있는 생각을 빼앗아 가지 않습니다 . 당신이 생각하지 않으면 .. 당신은 입력입니다.
Java 에 대해 내가 싫어하는 다섯 가지 (현재 가장 좋아하는 언어)는 특별한 순서가 없습니다.
- 내가 Java Generics의 팬인 것처럼, 설계 방식에서 발생하는 많은 이상한 점이 있습니다. 따라서 제네릭에 대한 수많은 성가신 한계가 있습니다 (일부는 유형 삭제의 결과입니다).
- Object.clone () 및 Cloneable 인터페이스 작동 방식이 완전히 손상되었습니다.
- Sun은 고속 도로를 이용하고 모든 것을 객체 (예 : SmallTalk)로 만드는 대신, 객체와 프리미티브라는 두 가지 고유 한 데이터 유형 범주를 만들었습니다. 결과적으로 기본 데이터 유형과 boxing / unboxing과 같은 기발한 호기심과 프리미티브를 컬렉션에 넣을 수없는 두 가지 표현 이 있습니다 .
- 스윙이 너무 복잡합니다. 잘못 이해하지 마십시오 : Swing으로 할 수있는 멋진 것들이 많이 있지만 과잉 엔지니어링의 훌륭한 예입니다.
- 이 최종 불만은 Sun과 Java 용 XML 라이브러리를 작성한 사람들의 잘못입니다. Java XML 라이브러리는 너무 복잡합니다. XML 파일을 읽기 위해 DOM 또는 SAX와 같은 파서를 사용하는 경우가 종종 있습니다. 각각의 API는 똑같이 혼란 스럽습니다. XML 을 쉽게 파싱 / 작성 하기위한 언어의 기본 지원은 매우 좋을 것입니다.
- java.util.Date가 짜증납니다. 불필요하게 복잡 할뿐만 아니라 모든 유용한 방법은 더 이상 사용되지 않으며 복잡성을 증가시키는 다른 방법으로 대체되었습니다.
루비 는 그 속도와 관련된 많은 결점을 가지고 있지만, 나는 그것을 싫어하지 않습니다. 또한 지역 사회 전도에 결함이 있지만 실제로 저를 귀찮게하지는 않습니다. 이것들은 내가 싫어하는 것입니다 :
- 클로저 (블록)에는 서로 다른 4 가지 생성 구문이 있으며 최적의 구문은 없습니다. 우아한 구문은 불완전하고 해시로 모호하며 전체 구문은 추악합니다.
- 커뮤니티는 '코드 읽기'를 선호하여 실제 문서에 위배되는 경향이 있습니다. 나는이 유치하고 게으른 것을 발견한다.
- 특히 라이브러리에서 메타 프로그래밍 남용은 버그를 추적하는 악몽을 만듭니다.
- 관련 메모에서 광범위한 메타 프로그래밍은 포괄적 인 IDE를 만드는 것이 불가능하지는 않지만 어렵게 만듭니다.
기능으로 전달되는 블록은 바보입니다. 매개 변수 목록 외부로 블록을 전달하거나 액세스 (수율)하기 위해 이상한 특수 구문을 가져야하는 이유는 없습니다. 블록에 덜 모호한 구문이 주어 졌거나 해시가 다른 구분 기호를 사용할 수 있었을 것입니다. {} 대신 <>가 아닌 <> 일 수 있습니다.
object.method(1, {|a| a.bar}, "blah")
블록과 같은 이러한 이상한 점은 마지막으로 전달 된 매개 변수이어야하며 둘 이상의 블록을 전달하는 것은 더 긴 구문으로 다르므로 실제로 성가시다.
펄
시길의 혼합 사용
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) { ... }
나는 때때로 그것을 좋아하고 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 분 밖에 걸리지 않습니다. 글쎄, 나는 지금 파이썬으로 다시 일할 것입니다 ...
Java에 대해 싫어하는 점은 다음과 같습니다 (내가 가장 좋아하는 언어는 아님).
- 제네릭 형식 삭제 (즉, 제네릭 제네릭 없음)
- 단일 catch 블록에서 여러 유형의 여러 예외를 포착 할 수 없음
- 소멸자 부족 (finalize ()는 매우 가난한 대체물입니다)
- 클로저를 지원하거나 함수를 데이터로 취급하지 않음 (익명 내부 클래스는 매우 장황한 대체물입니다)
- 일반적으로 확인 된 예외 또는 더 구체적으로 복구 할 수없는 예외를 확인합니다 (예 : SQLException)
- 리터럴 콜렉션에 대한 언어 레벨 지원이 없습니다.
- 제네릭 클래스의 생성자가 호출 될 때 유형 유추가 없습니다. 즉, 유형 매개 변수는 '='의 양쪽에서 반복되어야합니다.
C ++
- 템플릿 구문
- 다이아몬드 상속 문제
- 현대 언어가 가지고있는 표준 라이브러리의 과도 / 부족
- IOStream
- IOStream에 사용되는 구문
파이썬
- 공백은 의미가 있습니다 (때로는)
- 밑줄이 그어진 키워드
- 제한된 스레드 지원 (적어도 현재)
- "this"대신 "self"
- 공백은 의미가 있습니다 (때로는)
목표 -C
1) 네임 스페이스가없고 수동 명명 규칙 만 있습니다. 클래스 분리 측면에서 그 점을 신경 쓰지 않지만 가져 오기 com.me.somelibrary와 같이 네임 스페이스의 모든 클래스 정의를 한 줄로 가져올 수는 없습니다. *).
2) 라이브러리에는 여전히 RegEx 지원과 같은 중요한 영역에 약간의 구멍이 있습니다.
3) 속성 구문은 약간 어색하며 속성을 선언하려면 세 줄 (두 개의 별도 파일로)이 필요합니다.
4) 유지 / 해제 모델이 마음에 들지만 참조를 해제 한 다음 나중에 실수로 사용하는 것보다 쉽습니다.
5) 실제로 언어 기능은 아니지만 Xcode는 Objective-C의 사용과 너무 얽혀 있습니다. 그 측면에 대해 생각할 수는 없습니다 ... 기본적으로 자동 완성은 매우 만족 스럽습니다. 그것은 당신이 원하는 것을 찾은 것에 대해 보상하고 나중에 선택으로 제시하는 시스템과 같습니다. 그러나 자동 완성 엔진을 좋아하지 않았다고 가정합니다.
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 전체 툴체인을 판단하고 발전시켜야합니다.
자바 스크립트 :
Object
프로토 타입을 수정할 수 있습니다. 프로그램의 모든 단일 객체는 새로운 속성을 가져오고 무언가가 깨질 수 있습니다.모든 객체는 해시 맵이지만 안전하게 사용하기는 어렵습니다. 특히 키 중 하나가이면
__proto__
문제가있는 것입니다.함수 참조 시간에 객체가 닫히지 않습니다. 실제로,
this
객체 표기법이나new
연산자 로 함수를 호출 할 때마다 객체 클로저가 전혀 설정 되지 않습니다 .this
프로그래머가 기대하는 것으로 설정되어 있지 않기 때문에 특히 이벤트 콜백을 생성 할 때 많은 혼란이 발생 합니다.- 추론 : 함수 호출 이없는 개체 또는 표기법
new
연산자 결과this
집합 인 훨씬 파손 결과 글로벌 물체 동일.
- 추론 : 함수 호출 이없는 개체 또는 표기법
두 연산자가 근본적으로 다르더라도 문자열 연산자를 연결하기 위해 오버로드 된 덧셈 연산자. 숫자로 예상되는 값이 실제로 문자열 인 경우 통증이 발생합니다.
==
및!=
연산자는 타입 강제 변환을 수행합니다. 다른 유형의 비교에는 필사자가 완전히 기억할 수없는 규칙 목록이 포함됩니다. 이는 연산자===
와!==
연산자 의 존재에 의해 완화됩니다 .모두
null
와undefined
미묘하게 다른, 아직 중복 의미로 존재한다. 왜?프로토 타입 체인 설정을위한 이상한 구문.
parseInt(s)
C 스타일 숫자가 필요하므로 앞에 0이있는 값을 8 진수 등으로 처리합니다. 최소한parseInt(s, 10)
기본 동작은 혼란 스럽습니다.블록 범위가 없습니다.
동일한 변수를 두 번 이상 선언 할 수 있습니다.
선언하지 않고 변수를 사용할 수 있습니다.이 경우 전역 변수 일 수 있으며 프로그램을 손상시킬 수 있습니다.
with { }
.정말 도구 등의 JavaDoc에 문서화하기 어렵다.
파이썬 :
- 정적 타이핑 부족
- 기본 인수 처리 (특히 향후 발신자 의 기본 인수 를 변경할 수 있다는 사실 !)
- 필요한 밑줄이 너무 많습니다 (생성자를 호출해야합니다
__init__
). - 적절한 개인 구성원 및 기능 부족 (컨벤션에서는 밑줄로 시작하는 대부분의 항목이 개인 정보
__getattr__
가 아니라고 말합니다. print
파일에 대한 재미있는 구문 (하지만 파이썬 3에서는 수정 중입니다)
씨#
나는
switch()
어떤 유형 으로든 할 수 있으면 좋겠다case
.'읽기 전용'필드 /
private set
autoprops 와 함께 객체 초기화 구문을 사용할 수 없습니다 . 일반적으로 불변 유형을 만드는 데 언어 도움이 필요합니다.의 사용
{}
에 대한 네임 스페이스 와 클래스 와 방법 및 특성 / 인덱서 블록 및 다중 문 블록 및 배열 이니셜 라이저 . 멀리 떨어져 있거나 불일치하는 위치를 파악하기가 어렵습니다.나는 글쓰기가 싫어
(from x in y ... select).Z()
. 쿼리 구문에 무언가가 없기 때문에 메서드 호출 구문으로 돌아가고 싶지 않습니다.do
쿼리 구문에 대한 절을 원합니다foreach
. 그러나 그것은 실제로 쿼리가 아닙니다.
나는 정말로 여기에 도달하고있다. 나는 C #이 환상적이라고 생각하며 깨진 부분을 찾기가 어렵습니다.
PHP
- 서버를 제어하지 않으면 디버깅 기능이 없습니다.
- 많은 PHP 코드가 떠 다니면 모든 PHP 프로그래머에게 나쁜 이름이됩니다.
- 일관되지 않은 함수 이름
- 원하는 경우 정적 유형 변수를 사용할 수 없음 (나는 90 %의 동적 타이핑을 좋아하는 팬입니다)
- REGISTER_GLOBALS는 악마입니다
C (좋아, 내가 가장 좋아하는 것은 아니지만 아직 끝나지 않았다.)
- 소켓 라이브러리 구문.
- 기능 과부하가 없습니다.
- C 스타일 문자열.
- 버퍼 오버런
- 암호화 구문. 아토 이와 같은 물건을 몇 번이나보고 이마를 때렸으며 "물론!"
편집 : 소켓 코드와 같이 더 많은 라이브러리 코드를 사용하면 더 많은 결과를 얻을 수는 있지만, 특히 나쁘다.하지만 이미 C를 선택하려고 속이는 것처럼 느꼈다. C의 좋은 부분은 죽은 말을 때리는 것과 같은 나쁜 것을 대체합니다.
일반적인 Lisp :
- 키워드가 너무 많은 경우가 많습니다.
- 도서관 지원은 불쌍합니다.
- 메모리를보다 엄격하게 처리하려는 OS에서는 제대로 작동하지 않습니다.
- OS와의 상호 작용을위한 좋은 기능이 없습니다.
- "루프"기능은 잘 정의되어 있지 않으며 Lispy처럼 보이지 않습니다.
BrainF * ck
당신의 하이라이트는 당신이 튜링을 완료 했다는 것입니다 ! Perl 정규식에서 더 많은 것을 할 수 있습니다!
개체 부족. 씨몬! 마치 안녕하세요 ...
네트워킹 라이브러리가 없습니다. 내가 원하는 것은 웹 페이지를 긁는 것입니다.
일류 기능이 없습니다. 축하합니다 — 자바 친구들과 대화를 나눕니다.
저장을위한 무한 테이프. 이것은 우리가 Lisp를 쓰고있을 정도로 매우 소박합니다.
자바 스크립트
- 숫자를 문자열로-숫자를 문자열로 해석하면 수학이 좌절 될 수 있습니다. 5 + 2 = 52? 아 ...
- 권한-모든 최고의 물건은 사용자의 권한이 필요합니다!
- 화면 업데이트-화면을 업데이트하려면 브라우저가 정상 상태 여야합니다. 스크립트 중간에 화면을 강제로 업데이트하는 방법이없는 것 같습니다.
- 느리다-구글의 크롬은 좋지만 ...
- 브라우저 차이로 인해 언어 사용이 검열됩니다.
PHP :
- 거의 모든 특정 확장명을 모든 웹 서버에서 사용할 수 있다고 확신 할 수 는 없습니다.
- 미래의 모든 것이 되려고 노력합니다 (goto, closures ... ...)
- 경험이없는 사용자에게 많은 보안 위험
- 더 많은 연산자 과부하가 좋을 것입니다
- 제대로 작동하는 방법을 배우지 못하고 나쁜 이름을 부여하는 모든 가난한 프로그래머
그럼에도 불구하고 PHP는 (스크립트) 언어. ;-)
VB6
- Windows 만 해당
- 더 이상 지원되지 않습니다.
- 배열은 모든 수에서 시작될 수 있으며 모두 0으로 정규화됩니다.
- 컴파일 된 응용 프로그램은 제대로 실행하기 위해 많은 dll에 의존합니다.
- 브라우저 컨트롤이나 복잡한 코드 조각과 같은 많은 복잡한 컨트롤은 컴파일되지 않은 코드를 실행할 때 IDE를 중단시키는 경향이 있지만 컴파일 할 때는 제대로 작동합니다.
루비는 제가 가장 좋아하는 언어입니다. 여기 제가 싫어하는 것이 있습니다 :
- 녹색 스레드 + C 라이브러리 차단 = 대규모 실패
- 너무 느려
- 표준 라이브러리 자체는 bang 사용과 일치하지 않습니다! 행동 양식
- 모듈 포함 + 확장이 지저분합니다.
- "Open Classes"의 범위를 지정할 수 없습니다-String # dostuff를 추가하고 싶지만, 모든 타사 라이브러리로 유출하고 싶지는 않습니다.
- 바이너리 배포 패키징 솔루션이 없습니다.
델파이 :
- IDE가 약간 불안정합니다.
- 코드 통찰력이 때때로 혼란스러워집니다.
- 디버깅은 때때로 버그가 있습니다.
- 여러 프로젝트 파일을 업데이트하는 것은 번거로울 수 있습니다.
- 하나 이상의 패키지를 사용할 수 없을 때 시작하면 오류 메시지가 여러 번 나타납니다.
자바 스크립트
모든 스크립트는 단일 글로벌 '네임 스페이스'에서 실행됩니다 ... 다른 소스의 스크립트로 작업 할 때주의해야 할 사항
변수가 사용되었지만 미리 정의되지 않은 경우 전역 변수로 간주됩니다
브라우저 벤더는 원하는대로 표준을 구성하여 개발자가 그렇게 아름다운 언어를 사용하는 것보다 더 어려운 언어를 사용하도록 코딩합니다
대소 문자 구분-컴파일 타임 검사로 js를 개발하기위한 적절한 IDE가 없다는 것을 고려
hasOwnProperty
간단한 작업을 수행하기 위한 해결 방법 (예 : 메서드 사용 )
하스켈 :
- 게으른 평가로 인해 공간이 누출됩니다.
- 수학 추상화와 관련하여 숫자 계층 구조가 구성되지 않았습니다.
- 엄격한 monadic IO는 디버깅하기가 더 어려울 수 있습니다.
- 큰 구현은 표준과 호환되지 않는 방식으로 I / O를 처리합니다. (특히 문자를 출력하면 하위 8 비트 만 출력 한 다음이 가정을 사용하여 이진 I / O를 수행하는 코드가 작성됩니다. Ick.)
($)
연산자의 연관성을 변경하여 일부 표현을 더 예쁘게 만들 수 있습니다.
이들 중 대부분은 증오 수준까지 올라가지 않으며, 이들 각각에 대한 확실한 해결 방법을 수정하거나 구성하려는 사람들이 있습니다.
편집 : 포인트 5에 대해 약간의 혼란이있었습니다. 특히 일부 사람들은 내가 논쟁의 순서를 의미한다고 생각하는 것 같습니다. 내가 의미하는 바를 설명하기보다는 사람들에게 다음 링크 ( http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity )를 알려 주면됩니다.
'development' 카테고리의 다른 글
현재 표시된 조각을 어떻게 얻습니까? (0) | 2020.02.21 |
---|---|
JavaScript 객체의 내용을 인쇄 하시겠습니까? (0) | 2020.02.21 |
PHP 스크립트를 어떻게 디버깅합니까? (0) | 2020.02.21 |
정의 : HashSet이란 무엇입니까? (0) | 2020.02.21 |
Vim 80 열 레이아웃 문제 (0) | 2020.02.20 |