好きな言語で嫌いな5つのことは何ですか?[閉まっている]


403

最近Stack OverflowにPerl嫌いのクラスターがあったので、私は「あなたの好きな言語で嫌いな5つのこと」の質問をStack Overflowに持っていこうと思いました。あなたの好きな言語を取り、あなたがそれについて嫌いな5つのことを教えてください。それらは、単にあなたを苛立たせたり、設計上の欠陥を認めたり、パフォーマンスの問題を認識したり、その他のカテゴリの可能性があります。あなたはそれを憎む必要があり、それはあなたの好きな言語でなければなりません。

他の言語と比較したり、既に嫌いな言語について話したりしないでください。好きなことを好きな言語で話さないでください。私はあなたが嫌い​​だが許容できることを聞いて他のすべてのものを使えるようにしたいし、他の人が使ってほしかった言語について聞きたい。

誰かが私の好きな言葉を私に押し付けようとするときはいつでも、時にはインタビューの質問としてこれを尋ねます。誰かが自分のお気に入りのツールについて憎むべき5つのことを見つけることができない場合、彼はそれを主張したり、それを使用して多額の資金を引き込んだりするのに十分なほどよく知りません。彼はそれを完全に探索するのに十分な異なる状況でそれを使用していません。彼はそれを文化または宗教として擁護しています。つまり、私が彼の好きなテクノロジーを選ばなければ、私は間違っています。

私はあなたがどの言語を使うかあまり気にしません。特定の言語を使用したくないですか?その後、しないでください。あなたは十分な情報に基づいた選択をするためにデューデリジェンスを行い、それでもそれを使用しませんか?いいね。時々正しい答えは、「あなたは良い実践とバーでの多くの経験を持つ強力なプログラミングチームを持っています。Fooに変更するのはばかげているでしょう。」


これはコードレビューにとっても良い質問です。コードベースを本当に知っている人はそれについてあらゆる種類の提案をするでしょう、そしてそれをあまりよく知らない人は特定でない不満を持っています。「このプロジェクトをやり直すことができるとしたら、何を変えますか?」この空想の世界では、ユーザーとプログラマーは、嫌いなものすべてに文句を言うようになります。「より良いインターフェースが欲しい」、「モデルをビューから分離したい」、「このモジュールの代わりにこのモジュールを使用する」、「このメソッドのセットの名前を変更する」、またはそれらが本当に必要なもの現在の状況については好きではありません。これは、特定の開発者がコードベースについてどれだけ知っているかを理解する方法です。それはまた、プログラマーのどのくらいの手掛かりでもあります。

ヘイトは、人々がどれだけ知っているかを理解する唯一の側面ではありませんが、私はそれがかなり良いものであることがわかりました。彼らが嫌うものは、彼らが主題についてどれほどよく考えているかについての手がかりも私に与えます。


11
これは、古い「あなたの好きな言語」の質問に対する本当に素晴らしいスピンです。正当な理由。
Tom Leys

14
SOの.NET対象読者が多いにもかかわらず、この記事の執筆時点では24の回答があり、そのうちの1つだけ(。)が.NETまたは.NET言語に関するものであることは興味深いです。私は、これはSOまたは.NETについて言っていることは考えているが、それは...面白い
ジョンスキート

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倍になり、読みやすさが半分になります。

わかった、Scalaをチェックするべきだ。


7
@both:NPEはスタックトランスの最初の行に表示されます。これには、(ほとんどの場合)クラス、Javaファイル名、および次のような行番号が含まれます。 "at your.faulty.code.Instance(Intance.java:1234)"次に、そのファイルを開き、その行に移動します。つまり、何も割り当てられていない変数です。
OscarRyz 2009年

35
@オスカー・レイエス-ああ、私たちはそれを知っています。しかし、その行には複数の変数が存在する可能性があり、例外メッセージでは、どれがnullであるかがわかりません。
Zarkonnen、2009年

10
Scalaにもイボがあります。ただし、Javaよりもはるかに優れています。
ウィーティー2009

10
フレームワークの拡散などのための+1
Erich Kitzmueller、2010

6
@ Valentin、NullPointerExceptionが毎晩実行される巨大なログファイルにあることを想像してください。何が起こったのかを理解する必要があります...デバッグはオプションではありません。
するThorbjörnRavnアンデルセン

216

すごい、SQLがまだここで完成していないことに驚いています。それは誰もそれを愛していないことを意味すると思います:)

  • 実装間で一貫性のない構文
  • 微妙なコードの違いは、一見あいまいな理由により、パフォーマンスに大きな影響を与える可能性があります
  • テキスト操作の不十分なサポート
  • エントリーコストは簡単ですが、言語を習得するための学習曲線が急です
  • ベストプラクティスのためのコミュニティ全体での最小限の標準化。これには構文スタイルが含まれます。

...そして追加料金なしでそれを憎むいくつかのボーナス理由

  • WHERE句が最後に来るため、UPDATEまたはDELETEを時期尚早に実行して、テーブル全体を破壊することが簡単になります。代わりに、WHEREはどこかに前に移動する必要があります。
  • リレーショナル分割を実装することは困難です。
  • 値をNULLに設定できますが、NULLと等しいかどうかをテストできません。IS NULLをチェックすることはできますが、コードが複雑になるだけです。
  • 列にエイリアスを設定してから、GROUP BYエイリアス(またはSORTのような列インデックス)を設定するのではなく、GROUP列の式を完全に再指定する必要があるのはなぜですか?

7
多分、それを言語として考えるのをやめるまで、誰もそれを愛することを学ぶことができないでしょう。:)
アランムーア

4
すべてに対して+1。しかし、人々はなぜ私がORMの頭痛に我慢するのか不思議に思っています...
James Schek

2
@アランM ... Lは何を表していますか?:)
Kev

29
INSERTの構文がUPDATEとそれほど異なる理由を理解できません。そしてMERGEは理解不能です。
LaJmOn 2009年

3
IS NULLの必要性は、NULLがTRUEおよびFALSEの直後の3番目に考えられる結果であると考える場合、明確である必要があります。それは「不明」という意味なので、未知の何かが未知の別のものと一致するかどうかはわかりません。別の例:NULLがNULLと等しい場合、どのNULL値も別のNULL値と一致する可能性があるため、JOINを作成するという概念全体が不可能であることを意味します。これ(3項論理とも呼ばれます)を理解すれば、NULLに対してテストするために "IS"演算子を導入する理由を理解するかもしれません。
Alex

159

JavaScript

  1. すべてのクールなものはめちゃくちゃ複雑ですが、すべてのクールさは、あなたがそれに追従するのに苦労していると感じるほどの少量のコードにラップされています

  2. '+'は、弱く型付けされた言語で連結するための不合理な演算子の選択です。彼らは初心者を怖がらせようとしていましたか?

  3. これは、クロスブラウザー互換性の地雷原です(オンになっていてもいなくてもかまいません)。

  4. それは一般的に信頼されていません-戻るボタンのブロック、死ぬことのないポップアップなどの不快感に関連しています。

  5. 少数の異なるエラーメッセージと少数の異なるタイプ(数値、文字列、オブジェクトなど)しかないため、デバッグするのはほとんど不可能です。

それがjQuery向けではなかったとしても、以前と同じくらい嫌いでしょう:)


15
mauschに同意します。ECMAscript自体は、美しく強力な言語です。その名前を混乱させるのは厄介なブラウザ(:cough:IE)です。
TJ L

32
@Mausch:にjavascriptのライブを行い、広大な大多数の場合?「自動車は地球温暖化に寄与せず、それが自動車を運転しているのです」と同等のことを言っています-もちろん、本当ですが、要点を逃しています-車で他に何をしますか?
jTresidder 2009

20
@Chris:はい、 "+"は強く型付けされた言語(Pythonなど)での連結に適した演算子です。型の弱い言語(JavascriptやCなど)ではひどいです。(黙って!) 'sum:' + 2 + 3は 'sum:5'ではなく 'sum:23'と決定します。JavaScriptの経験が豊富な人であれば、より良い例を示すことができます。
ShreevatsaR

5
はい、Cは弱い(例えばあなたが整数を割り当てることができますPythonの、たとえば、に比べて、入力されcharそれがなどvoid *型のポインタを介して何にも、Sキャスト何かを)静的型付けの代わりに、動的型付け、また必要で明示的なタイピングを代わりに型推論、しかしそれらは強い対弱い型付けとは無関係です。[ランダムな例:Pythonには暗黙の動的な強い型付け、Haskellには(オプションで明示的な)静的な強い型付け、Javaには明示的な(ほとんどの場合は静的な)強い型付け、Cには明示的な静的な(比較的弱い)型付けがあります。]「強く型付け」と「弱い型付け」 "実際には明確に定義されていません。
ShreevatsaR 2010

5
@ShreevatsaR古典的な例は次のとおり'3'+'2'='32'です'3'-'2'=1
Thomas Ahle

148

PHP:

1)不要な変数を作成するように強制します。

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

2)lambdasの実装は、それを使用するのeval()とほぼ同等であり、ひどく間違っているので使用したことはありません(http://www.php.net/create_functionを参照)。

3)発生する可能性のあるエラーの約80%しかキャッチできないtry / catchシステム。

4)正規表現のサポートは、通常の文字列内に記述する必要があるため、ラムダサポートと同じように不完全であり、最も習得が難しいプログラミングツールの1つを約3倍難しくしています。そしてPHPは「簡単な」言語であるはずです!??!?

5)2回書き込んだり、独自の関数を作成したり、「@」演算子を使用したりせずに、$ _ 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
変なスコープの変数は何ですか?すべてをローカルにして、グローバルを使用するときに宣言するように強制するのは良い考えです。これにより、noobは、引数や戻り値を使用するのではなく、グローバルを使用するだけの関数を作成できなくなります。
scragar 2009

24
パラメータの順序がランダムに変化する関数を忘れた
dusoft 2009年

39
verbNoun、verb_noun、noun_verb、nounverb、verbnoun、nounVerbなどを忘れた> _>
Warty

135

C ++

  • ランダムにメモリを破壊し、ほとんど見つけることができないバグを作成するのは非常に簡単です(ただし、Valgrindはこれを修正するのに長い道のりを進んでいます)。
  • テンプレートエラーメッセージ。
  • テンプレートを使用する場合、すべてを1つのファイルに含めてしまい、愚かなコンパイル時間を費やすことになります。
  • 標準ライブラリは現代のジョークです(デフォルトではまだスレッドやネットワークはありませんか?)
  • 多くの厄介なCの小さなビット(特に、short / int / unsigned / etc間のすべての変換)

13
私はSTLに同意しますが、何良いのかについてお話しします。
バーナード

22
ユニコード。私はASCIIの単純さを尊重しますが、善のために、今は21世紀に入っています。
ヴィルヘルムテル2009年

29
@Kieveli constの正確さは、実際、他の言語でプログラミングするときに私が最も見逃しているものの1つです。特に動的に型付けされたもの。raiiは私がよく見逃す大きな機能です。
ヴィルヘルムテル2009

6
C ++の問題のほとんどは、ISO標準であり、10年間ロックされています。
graham.reeds

7
+1「テンプレートエラーメッセージ」
ジョアンポルテラ

129

C#/ .NET:

  • クラスはデフォルトでシールする必要があります
  • lockステートメントはありません。代わりに、特定のロックオブジェクトがあり、Acquire使い捨てロックトークンを返すようなメソッドが必要です。当然のことですが、すべてのオブジェクトを監視する必要はありません。
  • GetHashCode()すべてがハッシュ化に適しているEquals()わけではありませんSystem.Object。代わりに、持ってIdentityComparer同じことをしているが、および維持IComparer<T>IComparable<T>IEqualityComparer<T>およびIEquatable<T>カスタムの比較のためのインターフェイスを。
  • 不変性の不十分なサポート
  • 拡張メソッドを発見するための悪い方法-名前空間を使用しているという事実よりもはるかに意識的な決定であるはずです。

それらは私の頭の上にありました-明日私に尋ねてください、そして私は別の5を考え出すでしょう:)


22
デフォルトで封印:継承はクラスに設計されるか(時間がかかり、将来のオプションが制限されます)、または禁止されます。hashCode / equals:Javaでも使えます。いつか私はそれについて長いブログ記事を書くつもりです。継承チェーンで等号が難しい理由の詳細については、Effective Javaを参照してください。
Jon Skeet

88
デフォルトでのシーリングとは、誰かがクラスから継承したいと考える可能性のあるすべての理由を考えたが、それらのいずれも意味がないと考えていることを意味します。申し訳ありませんが、私たちの誰もそれほどスマートではありません。
Ed S.

69
その場合、私はあなたが私のコードから派生するほど賢くありません。コードを壊す可能性がある将来のどのような変更を予測できないからです。これは非常に重大な問題です、IMO。コードの封印はより制限的ですが、実装の自由度と堅牢性が向上します。
Jon Skeet、

11
「goto case」構文について誰も言及していないとは信じられません。私はそれが嫌いです!
アイスティーナ

20
Jon SkeetがC#を設計しなかったのは良いことです。そうでない場合、私のリストは「1.クラスはデフォルトでシールされている、2。ロックは複雑すぎる、3。ほとんどのオブジェクトはハッシュ可能ではない」のようになります。
Gabe

113

C

  • 文字列操作。

文字列バッファを手動で処理しなければならないのは、間違いを起こしやすい苦痛です。あまりにも多くのコンピューティングが実際に文字列を移動および変更しているため(コンピューターは、大規模な処理を行うために、昔のように考えられていたほど使用されていません)、管理された言語またはC ++の文字列を使用できるのは本当に素晴らしいことですこれらを処理するオブジェクト。ストレートCでやらなければいけないときは流砂の中を泳いでいるような気がします。


50
同意した。文字列操作は、私がC.嫌いなものの5までの項目1である
BoltBait

1
DJBの安全な文字列ライブラリなどを使用してください。ほとんどの言語ではXML操作は困難であり、多くのプログラムがXML操作を行いますが、「Perlはプリミティブデータ型としてDOMノードをサポートしていないため、完全に壊れています」という投稿はあまりありません。彼らは図書館を利用しています。
スティーブジェソップ

5
Cの文字列操作は厄介ですが、言語の問題に関する限り、それは最悪ではありません。
Chris Lutz、

3
strcatは連結しますが、待ちます...宛先に十分なスペースがあります...わかりました、チェックするifステートメントを挿入する必要があります...しかし、私の文字列がヒープ上にある場合はどうなりますか?
さて

4
Cについて
嫌わ

94

「一部の言語で嫌いなこと」リストについて私が嫌う5つのことはどうですか?:D

5-オレンジ色の赤を塗ってもリンゴにはなりません。

言語が設計されるとき、デザイナーは通常、それが何のために役立つかを念頭に置いています。何か完全に異なるためにそれを使用したの仕事が、それは単にダムでないときに文句。Pythonを取ります。私は誰かが持っているか、誰かがPythonコードからexeを作成するユーティリティをいつか作ると確信しています。なぜ神の地上でそれをしたいのですか?それはきちんとしている-私を誤解しないでください-が、それは無駄です。だから文句を言うのはやめて!

適切に設計されたプロジェクトには、複数の言語のコードが含まれている可能性があります。1つの言語だけではプロジェクトを完了できないと言っているのではありません。一部のプロジェクトは、使用している言語の能力の範囲内である場合があります。

4-あなたは木の脚の上に立っていますか?

プラットフォームは、言語が何をできるかに大きく影響します。最近のガベージコレクター、またはパスカルでさえ「ガベージコレクション」の初期の試みでさえ、メモリのフェード(おそらくmalloc more ram ??)に役立ちます。コンピュータの方が高速なので、もちろん、私たちの言語にはもっと多くのことが期待されています。そして率直に言って、おそらくそうすべきです。ただし、ハッシュテーブルや文字列、またはその他のさまざまな概念を作成するコンパイラーの利便性を犠牲にすると、莫大な費用がかかります。これらは、使用されているプラ​​ットフォームに継承されない場合があります。言語に含めるのが簡単だと言うのは、あなたが立つ足がないかもしれないと私に告げるだけです。

3-誰のせいですか?

バグ。ええと。バグが大好きです。なぜバグが好きなのですか。仕事を続けることができるからです。バグがなければ、多くの閉鎖ピザ店があります。ただし、ユーザーはバグを嫌います。しかし、ここに冷たい水の少しのしぶきがあります。すべてのバグプログラマの責任です。言語ではありません。生成される可能性のあるバグの数を大幅に減らすような厳密な構文を持つ言語は、完全に役に立たない言語になります。その能力はおそらく一方では数えることができるでしょう。柔軟性またはパワーが必要ですか?バグがあります。どうして?あなたは完璧ではなく、間違いを犯すからです。Cで本当に識別可能な例を見てみましょう:

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

私たちは皆、それがどうなるか知っています。ただし、一部のユーザーが気付かないのは、その機能が非常に有益な場合があることです。何をしているのかに応じて。バッファオーバーランは、その機能のコストです。上記のコード。実際に公開したとしたら。それはまた..私とそれを言って..「私のせい」。Cが私にそれを許可したわけではありません。

2-ごみ箱に入れてはいけませんか?

私たちが理解していない言語の機能を指すのは非常に簡単です。なぜなら、私たちはそれを頻繁に使用せず、それを愚かと呼んでいるからです。そこにあると文句を言う。後藤はいつも私を楽しませる。人々は常にgotoが言語であることについて不平を言っています。しかし、私はあなたの最後のプログラムに一種のgotoが含まれていたに違いない。ブレークまたはコンティニューを使用したことがある場合は、gotoを使用しました。それはそれです。確かに、それは「安全な」後藤ですが、それはそれです。後藤さんには用途があります。continueやbreakなどの「暗黙の」gotoが使用されているか、明示的なgotoが使用されているか(実際のキーワードは「goto」を使用します)。その言語開発者は完璧ではありませんが、通常、機能が(その言語に対して)黎明期から存在している場合はそうです。おそらくその側面は、その言語を定義する品質です。意味..それは sが使用されており、下位互換性があるため、おそらくハングしていません。今日使われています。5分前のように。そして、適切に使用されています。まあ..間違いなく誰かがそれを不適切に使用していますが、それは私のリストの#3に関連しています。

1.-すべてがオブジェクトです。

わかりました。これは実際には#2のサブセットです。しかし、これは私がヘイトリストで目にする最もいらいらする不満です。すべてがオブジェクトではありません。属していない、またはオブジェクトである必要のない概念は数多くあります。それらが属していない場所に物事を置くことは醜いだけであり、プログラムの効率を低下させる可能性があります。承知しました。たぶん、言語に依存しません。これは#5にも関係しています。つまり...はい。グローバルは大丈夫です。静的メソッドに相当する関数は問題ありません。オブジェクト指向プログラミングとグローバル関数を組み合わせても問題ありません。さて、それは私たち全員が外に出て、そのオブジェクトモデルからコードを "解放"する必要があるという意味ではありません。コードのセクションまたはプロジェクト全体を設計するとき、舞台裏で何が起こるべきか組み合わせる際に考慮してください。そのコンセプトが存在する場所だけでなく、他の多くの要因。グローバル関数が目的を果たさないのに、なぜクラスや名前空間の概念の中にラップするのですか?静的メンバー変数を取得します。言語と実装にもよりますが、一般的に言えば、あなたは単にグローバルを宣言しただけです。はい、これらの非OOの概念をOOラッパーでラップする理由はいくつかあります。もちろん、自己文書化コードです。それは理にかなっています。だから..私が言うように。外出してコードを「解放」しないでください。しかし、優れた現代の言語には、オブジェクト指向モデリング以外のグローバルな概念があります。はい、私は特に、グローバルコンセプトのないOOプログラミング言語に重大な設計上の欠陥があることを指摘するつもりです。でも… 言語の意図とデザインに依存するので、特定の言語を選択するつもりはありません。ここで分析するには多すぎるためです。だれでも、コードをどこに配置し、最も効果的であるかを検討してください。機能やサポートを追加しないものにフレアをたくさん追加すると、キーボードの摩耗が早くなります。それは誰にとっても良いことではありません。まあ..おそらく、すべてがオブジェクトであると誤って教えた人からのブラウニーポイントが好きでない限り。

要するに、プログラミングはキーボードをうっかりタップするだけではありません。どのプロジェクトにも多くの設計上の考慮事項があります。私はそれが決まり文句であることを知っていますが、あらゆる角度からそれを見る必要があります。今日でもタイプセーフな言語で。あなたは単にコードを取り出してそれがうまく機能することを期待するだけではありません。確かに..それはうまくいくかもしれませんが、それについて取り組む正しい方法ではないかもしれません。全体として、特定の仕事と環境に最も適した言語と形式を選択します。しかしその背後にある考えを取り除く言語はありません。あなたが考えていないなら..あなたはただタイプしているだけです。


19
言語は完璧ではありません。言語について嫌いなもののリストを作成すると、興味深いコメントやアイデアが得られる場合があります。まず、存在を知らなかった解決策を他のユーザーに提供することができます(投稿を見ると、いくつかのことがわかったことがわかります)。第2に、それは言語開発者に対するユーザーフィードバックを構成します(ユーザーがソフトウェアについて最も嫌う5つの項目のリストを思いついたら、興味はありませんか?)、そして第3に、欠陥を熟考するのはちょっと興味深いです。あなたのツールの。
Sylverdrag

4
そのレベルでそれを表示すると、ブレークと継続はゴトですが、ループはゴトです(条件が満たされている場合はループの開始にジャンプします)、gotoは(条件が満たされていない場合はブロックを飛び越えて、関数呼び出し) goto(関数の先頭にジャンプして後でジャンプ)です...
ヘリウム

17
ソースコードから実行ファイルを作成すると「役に立たない」?何?
10

4
Perlは、80年代後半以降、Perlファイルから実行可能ファイルを作成できました。配布することが1つあります。a)Perlをインストールする必要はありません。b)プログラムのコンポーネントをインストールする必要があります。c)パスを設定してすべて実行するためのスクリプトを作成することもできます。
10

1
ただし、ソースから.exeファイルを作成できない場合、Windowsユーザーはそれを実行できません。;)
Evan Plaice

88

Java(現在、私の好きな言語です)について私が嫌う5つのことは、順不同です。

  1. 私がJava Genericsのファンであるのと同じくらい、それが設計された方法から生じる多くの奇妙な点があります。そのため、ジェネリックスには無数の厄介な制限があります(その一部は型消去の結果です)。
  2. Object.clone()およびCloneableインターフェースの動作は完全に壊れています。
  3. 高速道路を利用してすべてをオブジェクト(a.la. SmallTalk)にする代わりに、Sunはデータ型の2つの異なるカテゴリ(オブジェクトとプリミティブ)を作成しました。その結果、基本的なデータ型の2つの表現と、ボックス化/ボックス化解除などの奇妙な奇妙な表現があり、コレクションにプリミティブを配置できなくなりました。
  4. スイングが複雑すぎます。誤解しないでください。Swingを使用してできる優れた機能はたくさんありますが、これはオーバーエンジニアリングの好例です。
  5. この最後の不満は、SunおよびJava用のXMLライブラリを作成した人たちの責任です。Java XMLライブラリは非常に複雑です。単純にXMLファイルを読み取るために、使用しているパーサー(DOMまたはSAX)について心配する必要がよくあります。それぞれのAPIは同様に混乱します。XML を簡単に解析/作成するための言語のネイティブサポートは非常に便利です。
  6. java.util.Date sucks。不必要に複雑になるだけでなく、すべての便利なメソッドが廃止されました(そして複雑さを増す他のメソッドに置き換えられました)。

32
java.util.Dateのことを忘れてしまった!
TM。

3
また、「Cloneable」インターフェースには「clone()」メソッドがありません。これにより、CloneableインターフェースがOxymoronになります。また、clone()はオブジェクトを返すため、タイプセーフはウィンドウの外にあります(J2SE 5.0でジェネリックが導入された後でも、これを修正しようとする試みは見られません)。
Ryan Delucchi、2009年

2
クローン可能である限り、いわゆるシリアル化可能な「インターフェース」を含めることもできます。それを使うときはいつでも自分を刺したいです。
wds

12
ファイルを開いて読み取るなど、単純なことを行うのは困難です。
エリックジョンソン

3
@Ryan clone()は必ずしも「オブジェクト」を返す必要はありません。J2SE 5.0では、Javaは共変の戻り型を導入しました。つまり、基本クラスの任意のサブタイプを返すことができます。だから、公開MyType clone()が可能です!
ヘルパーメソッド

73

Rubyにはその速度に関連する多くの欠陥がありますが、私はそれらを嫌いではありません。また、コミュニティの伝道が行き詰まっているという欠点もありますが、それは本当に気になりません。これらは私が嫌うものです:

  • クロージャ(ブロック)には4つの異なる作成構文があり、どれも最適ではありません。エレガントな構文は不完全であり、ハッシュがあいまいであり、完全な構文は醜いです。
  • コミュニティは、「コードを読む」ことを支持して、実際のドキュメントに反対する傾向があります。私はこれが子供っぽくて怠惰だと思います。
  • 特にライブラリでのメタプログラミングの悪用は、バグを追跡するのを悪夢にします。
  • 関連する注意として、広範囲にわたるメタプログラミングは、包括的なIDEを不可能ではないにしても、作成することを困難にします。
  • 関数にブロックを渡す方法はばかげています。ブロックをパラメーターリストの外部に渡したり、アクセスするための奇妙な特別な構文(yield)が必要な理由はありません。私は、ブロックにあいまいさの少ない構文を指定する必要があった(またはハッシュが{}ではなく<>のように異なる区切り文字を使用する可能性がある)べきであり、メソッドへのパラメーターとしての受け渡しは他のすべてのパラメーターと同じである必要があると考えています。

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

    これらの奇妙な点は、ブロックが最後に渡されるパラメーターである必要があり、複数のブロックを渡すと構文が長くなるために異なり、本当に私を困らせます。


2
次第に最適化されたm17nとunicodeのサポート。1.9は依然として複雑です...
Keltia、2008

37
メタプログラミングの悪用は「慣用的なルビ」と呼ばれていると思いました:)
Slartibartfast 2009年

2
akway:他の2つの構文はlambdaProc.newです。
Myrddin Emrys

2
ドキュメンテーションに関して、私はかつてPragmatic Programmersの出版社で働いている誰かが、会社が設立されたとき、入手可能なのは日本語しかなかったのでRubyの本が欲しかったと言った話を聞いたことがあります。そのため、彼らはその本を彼らの会社が翻訳して出版することができたでしょう。しかし、代わりにソースコードを読むために彼らがしたこと:-) Rubyの本は、どうやらPragmatic Programmersを立ち上げた本の1つでした。
Arthur Reutenauer、2009年

13
これらのうち3つが言語そのものではなく、人々と関係していることが興味深いです。Rubyは、私が最も嫌う言語のままです。
Toby Hede

72

Perl

  • シギルの混合使用

    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;
    
  • 真のオブジェクト指向の欠如

    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
真のオブジェクト指向の欠如は、あなたが作ったほど悪いとは思いません。特に、使用しているCPANモジュールが必要なものを公開することを考えていない場合は、それが救世主になることがあります。そして、複数のディスパッチの欠如はさらに悪化する可能性があります:perlは強く型付けされた可能性があります;-)
Tanktalus 2008年

3
私はPerlが強く型付けされていないのが好きですが、いくつかの型情報を追加すると便利でしょう。
ブラッド・ギルバート、

13
あなたのお気に入り(あなたが批判している必要がありますPerl6の)ではありません言語批判することを選んだように思える
フルーシュミット

5
Perl 6と比較することのポイントは何ですか?あなたはperl 6があなたの問題を修正するか、それとも継続することを提案していますか?
ロバートP

2
私はもっ​​と言う必要があるとは思いません:ozonehouse.com/mark/periodic
アラファンギオン

57

私は好きなようにPHPをやります。Pythonはやりすぎです。

  • 名前空間はありません。すべてが、より大きな環境では地獄であるような非常に大きな名前空間にあります

  • 関数に関する標準の欠如:配列関数は最初の引数として針、2番目の配列としてhaystackを受け取ります(array_searchを参照)。文字列関数は、多くの場合、最初にhaystackを受け取り、次に針を受け取ります(strposを参照 )。他の関数は、単に異なる命名方式を使用します: bin2hexstrtolowercal_to_jd

    一部の関数は、通常とは異なる奇妙な戻り値を持っています。これにより、PHPは空の配列をその型のジャグリングでfalseとして効率的に解釈できる一方で、どこからともなく3番目の変数を宣言する必要があります。同じことを行う他の関数はほとんどありません。

    $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_stringmysql_real_escape_stringを参照 )。

  • 言語は、テンプレート言語から完全なバックエンド言語に進化しました。これは、誰でも必要なときに何でも出力でき、悪用されることを意味します。あなたはテンプレート言語用のテンプレートエンジンになってしまいます...

  • ファイルをインポートするのが面倒です。あなたはそれを行う4つの異なる方法があります(include、include_once、require、require_once)、それらはすべて遅い、非常に遅いです。実際、言語全体が遅いです。少なくとも、Python(フレームワークを使用している場合でも)およびRoRが収集したものよりもかなり遅いです。

私はまだPHPが好きです。これはWeb開発のチェーンソーです。小規模から中規模のサイトを高速で実行し、誰でも確実にホストできるようにする必要があります(構成は異なる場合があります)。PHPはすぐそこにあり、ユビキタスなので、完全なLAMPまたはWAMPスタックをインストールするのに5分しかかかりません。さて、私は今Pythonでの作業に戻ります...


4
ポイント1は5.3に実装されていると思います:)パラメータの順序付けが改善されている一方で、ネーミングはまだ不十分です。ただし、下位互換性については同意します。
ロス

4
お奨め#4。それも私が一番気になっていたことのひとつです。
フランツ

1
速度の議論はかなり主観的だと思います。速度は、言語自体よりもコードの効率に大きく依存します。貧弱なPHPコードは高品質のpythonコードよりもおそらく低速ですが、優れたPHPは貧弱なPythonよりもパフォーマンスが良いかもしれません。
selfawaresoup

17
no_really_now_mysql_escape_the_string_im_serious()
サラリーマン

2
名前空間schmamespaces。PHPはワールドワイドウェブ上にあるため、すべてがグローバルである必要があります
Evan Plaice

50

Javaの嫌いな点をいくつか紹介します(これは私の好きな言語ではありません)。

  • ジェネリック型の消去(具体化されたジェネリックがない)
  • 1つのcatchブロックで(異なるタイプの)複数の例外をキャッチできない
  • デストラクタの欠如(finalize()は非常に貧弱な代替手段です)
  • クロージャーのサポートまたは関数をデータとして扱うことはサポートされていません(匿名の内部クラスは非常に冗長な代用です)
  • 一般にチェックされた例外、より具体的には、回復不可能な例外をチェックする(SQLExceptionなど)
  • リテラルコレクションに対する言語レベルのサポートなし
  • ジェネリッククラスのコンストラクターが呼び出されたときの型推論なし。つまり、型パラメーターは '='の両側で繰り返す必要がある

1
@Svish-ポイントは、処理している例外の種類が気にならない場合にのみ、この構成体を使用することです。言い換えれば、あなたはすべて同じようにそれらを扱いたい
ドナル

3
言語にGCがあり、GCがリリースごとにどんどん良くなっている場合、デストラクタが不足していることを欠陥とは言いません。gcが大幅に改善されたため、デストラクタはJava 1.1.8では見落とされましたが、Java 6では見落とされました。
マイクリーデル2009

7
C#は、複数の例外のキャッチを除いて、これらすべてを修正します。ジェネリックスは具体化され、デストラクタはusing / IDisposableに置き換えられ、クロージャはanonメソッドとラムダによって実装され、例外はチェックされず、コレクションリテラルがあり、構築された型を2回指定することを避けるための 'var'があります。
Daniel Earwicker、2009年

1
Javaには間違いなくクロージャーがあります。匿名の内部クラスは、スコープ内のローカルのfinal変数を閉じます。匿名内部クラスは匿名関数の適切な代用ではないが、それらクロージャーであることに同意します。
アダムJaskiewicz 2009年

2
Anon内部クラスはクロージャーではありません。「sum + = current.amount()」などのビジターコールバックを作成してみてください。閉じるが葉巻はない。
Roboprog 09年

40

C ++

  1. テンプレート構文
  2. ダイヤモンドの継承の問題
  3. 現代の言語が持っている標準ライブラリの過剰/不足(ブーストは間近ですが)。
  4. IOStreams
  5. IOStreamsで使用される構文

パイソン

  1. スペースは意味がある(時々)
  2. 下線付きキーワード
  3. 限られたスレッドのサポート(少なくとも現在)
  4. 「これ」ではなく「自分」
  5. スペースは意味がある(時々)

80
「これ」は本当にしたいので、「自分」を参照できます(ただし、他の人が従うのは難しいかもしれません)。「Self」はキーワードではないので、変数には好きな名前を付けることができます。
mipadi 2008

36
これで、Pythonでの空白(特にインデント)の意味を、その最大の利点の1つとして実際に挙げます...;)
Oliver Giesen

22
「スペースは意味がある」はpythonの最高の機能の1つです。psはこれを「将来のインポート中括弧から」のインタプリタで実行しようとする
2008

4
スレッドのサポートを除いて、Pythonのリスト全体にはほとんど同意しません。空白は意味がなく、インデントは意味があります。大きな違いがあります。
クリスチャンオダード2009

3
ワオ。空白文字/タブを特別な文字として強調表示/表示するテキストエディターを発明した人はいません(メモ帳でコーディングしていますか?)。また、タブをスペースに展開すると、火事で死にます。
偽の名前

37

Objective-C

1)名前空間はなく、手動の命名規則のみ-クラスの分離という点では問題ありませんが、名前空間内のすべてのクラス定義を1行でインポートできない(インポートcom.me.somelibraryなど)。 *)。

2)ライブラリは、RegExサポートのような重要な領域にまだいくつかの穴があります。

3)プロパティの構文は少し不格好で、プロパティを宣言するために3つの行(2つの個別のファイル)が必要です。

4)保持/解放モデルが好きですが、参照を解放して後で誤って使用するよりも簡単です。

5)実際には言語機能ではありませんが、XcodeはObjective-Cの使用と絡み合っているので、その側面について考えざるを得ません...基本的にオートコンプリートは非常に不審です。それはあなたが欲しいものがあることを見つけたときにあなたに報酬を与え、それを後で選択肢として提示するシステムのようなものです。しかし、私はオートコンプリートエンジンが好きではなかったと思います。


2
名前空間について同意し、クラスの前に文字コードを付けるのはばかげています。そして、私は実際のクラス変数の欠けているサポートを追加します、私はそれらをファイルの静的で偽ることは好きではありません。
zoul

2
Objective-Cのプロパティ。真剣に、彼らは衝撃的です、私は誇大広告を理解することができません。
Justicle '06

6
実際、私はLispとObjCのその側面が本当に好きでした。EmacsやXCodeのように、中かっこが一致するエディターが必要なだけです。私は通常、中括弧をペアで入力してから何かを入力するので、マッチングの問題に実際に遭遇することはありません... XCodeは、中かっこをダブルクリックするだけで、中かっこで囲まれた領域を強調表示することもできます。
Kendall Helmstetter Gelner、

1
@Chris S:YES/NOブール値は悪いことですか?そしてさらに重要なことに、名前付きパラメーターは悪いことだと思いますか?boolは理解できますが、named paramsは(読みやすさの点で)ObjCの最高の機能の1つです。
jbrennan

3
たぶん私はマゾですが、接頭辞付きのクラス名が好きです。それはグーグルとドキュメンテーション検索を非常に明確にします、クラスがNSStringと呼ばれる場合、どのような文字列を使用するかについての混乱は決してありません。
kubi

36

C ++

  • 文字列。
    それらはプラットフォーム文字列と相互運用できないため、半分の時間でstd :: vectorを使用することになります。コピーポリシー(書き込み時のコピーまたはディープコピー)が定義されていないため、単純な構文ではパフォーマンスを保証できません。時には、彼らは使用するのがあまり直感的でないSTLアルゴリズムに依存しています。あまりにも多くのライブラリーは、残念ながらはるかに快適に使用できます。それらを組み合わせる必要がない限り。

  • さまざまな文字列表現
    ここで、これはプラットフォームの問題の少しです-しかし、あまり堅固でない標準文字列クラスが以前に利用可能であった場合、それがもっと良かったと思います。私が頻繁に使用する次の文字列表現:

    • 汎用LPCTSTR、
    • CoTaskMemAllocによって割り当てられたLPC(W)STR、
    • BSTR、_bstr _t
    • (w)string、
    • CString、
    • std :: vector
    • 既知の長さの(w)char *バッファに範囲チェックと基本的な操作を追加するロールミークラス(sigh
  • モデルを作成します。
    who-includes-what、forward宣言、プリコンパイル済みヘッダーの最適化、少なくともインクリメンタルなビルド時間を耐えられるようにするためのインクルードなどをいじくり回して過ごしたすべての時間にうんざりしています。コードをまとめるのに多くのハードルがあるので、再利用できるので、ママの犬でさえ私の話を聞いて飽きてしまいます。

  • 解析が難しい
    これは、外部ツールを書くことと、正しく理解することを特に難しくします。そして今日、私たちC ++の連中はツールチェーンにほとんど欠けています。C#のリフレクションとデリゲートは大好きですが、それらがなくても生活できます。素晴らしいリファクタリングがなければ、私はできません。

  • スレッド化は難しすぎる
    言語はそれを(今のところ)認識していません。コンパイラーの自由は-素晴らしいですが-苦痛です。

  • 静的およびオンデマンドの初期化 技術的には、私はここでごまかしています。これは、「再利用のためのコードをまとめる」のもう1つのパズルのピースです。他のすべての再分配の問題に対する最良の解決策は、すべてをヘッダーに投げ込むことです。この問題は「旧式-あなたはできない」と言います。


確かに、その多くは厳密な言語の範囲を超えていますが、IMOツールチェーン全体を判断し、進化させる必要があります。


STLのドキュメントを探すのは、グラフィックカードを最初から作成する方法のマニュアルを探すようなものです。
aviraldg 2010

率直に言って、これらのポイントのほとんどは、C ++を適切に学習することにまったく頭を悩ませたことがないようです...インクルージョンガードはすべての C ++プログラマが知っておくべきものであるため、これは#3でかなり明白になります。ポイント#1を理解する方法もわかりませんが、混乱していstd::stringますか?多分良いドキュメントやチュートリアルstd::vector(そしてstd::string、それが決して設計されていない場所で使用することが想定されていない理由)を読むと、それを明らかにすることができます。

@nebukadnezzar:MeyersがSTLに光を当てているのを発見しましたが、それは根本的な問題を解決しません。率直に言って、これは大規模なプロジェクトを維持する必要がなかったように聞こえ、数十の深いインクルード階層で循環依存関係を探す必要がなかったようです。警備員がいることはわかっていますが、なぜ警戒する必要があるのでしょうか。ところで。すべての問題を解決できるわけではありません。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がこれを修正すると私はここにポイントがあると言います)。ストリングクラスとして10年前に採用されましたが、実際には採用されませんでした-他の不満。
peterchen

35

JavaScript

  • Objectプロトタイプを変更することができます。プログラム内のすべてのオブジェクトは新しいプロパティを取得し、おそらく何かが壊れます。

  • すべてのオブジェクトはハッシュマップですが、そのように安全に使用することは困難です。特に、キーの1つがになっ__proto__ていると、問題が発生します。

  • 関数参照時にオブジェクトを閉じません。実際、オブジェクトクロージャはまったくありません-代わりに、thisオブジェクト表記またはnew演算子で関数が呼び出されるたびに設定されます。thisプログラマが期待するものに設定されていないため、特にイベントコールバックを作成するときに、多くの混乱が生じます。

    • 結果:オブジェクト表記または演算子なしで関数呼び出すと、グローバルオブジェクトと同じに設定され、多くの破損が発生します。newthis
  • 2つの演算が根本的に異なるにもかかわらず、文字列連結も実行するためにオーバーロードされた加算演算子。数値であると予想される値が実際には文字列である場合、結果的に問題が発生します。

  • ==そして、!=演算子は型の強制を行います。異なるタイプ間の比較には、定命の者が完全に覚えることができないルールのリストが含まれます。これは===and !==演算子の存在によって緩和されます。

  • 両方nullundefined微妙に異なる、まだ冗長な意味で、存在します。どうして?

  • プロトタイプチェーンを設定するための奇妙な構文。

  • parseInt(s)Cスタイルの数値を想定しているため、先行ゼロのある値を8進数などとして扱います。少なくとも可能parseInt(s, 10)ですが、デフォルトの動作は混乱します。

  • ブロックスコープはありません。

  • 同じ変数を複数回宣言できます。

  • 宣言せずに変数を使用できます。その場合、変数はグローバルであり、おそらくプログラムを壊します。

  • with { }

  • ツールのようなJavaDocで文書化するのは本当に難しい。


3
for nullundefined:場合によっては、変数に値が割り当てられているかどうかを本当に知りたいことがあります。nullは値なので、undefinedが唯一の通知方法です。確かに、これが便利だと思ったのは、getter / setter関数を作成するときだけでした。
Zach

1
「キーの1つが偶然プロトである場合」-まあ、それは特別な意味を持つ予約語です。for変数名として使用できないと不平を言うようなものです。
nickf

5
@nickf:ハッシュのキーは文字列です。文字列には、予約語を含む任意の値を含めることができます。特に、この値"for"はハッシュキーとして有効です。__proto__予約語ではありません。ハッシュキーとして使用すると期待どおりに機能しない特別な文字列値は、連想配列がどの言語で機能するかについての合理的な期待に違反します。また、それらはEcmaScript仕様に違反しています。
Daniel Cassidy

2
トーマス:ニューラインは必ずしも声明を終わらせるわけではありません。したがって、賢明なコーダーは、すべてのステートメントをセミコロンで終了して、コードをより明確にします。
ダニエルキャシディ

2
newline may or may not end a statement depending on context私のトップ5リストの1つです
reinierpost 2010

34

Python:

  • 静的型付けの欠如
  • デフォルト引数の処理(具体的には、将来の呼び出し元のデフォルト引数変更できるという事実!)
  • 必要なアンダースコアが多すぎる(コンストラクタを呼び出す必要がある__init__
  • 適切なプライベートメンバーと関数の欠如(規約では、アンダースコアで始まるほとんどのものがプライベートであると言っていますが、それ以外のものは例外です__getattr__
  • printファイルにINGするための面白い構文(ただし、Python 3で修正されています)

10
静的型を使用するオプションが欲しいです。
Greg Hewgill、

4
ところで:initは実際にはコンストラクタではなく、そこに入るとオブジェクトはすでに作成されています(自分が何であるかを推測してください...)。コンストラクターは、インスタンス化されるクラスにアクセスできる新しいものです。
アンドレ・

90
静的型付けを好むなら、なぜPythonがお気に入りの言語なのですか?
finnw 2008

9
finnw:静的型付けは、一部の種類のプログラムには最適で、他の型には実際には必要ありません。私は通常、静的型付けの欠如を気にしませんが、必要な場合は、少なくともオプションがあると本当にいいです。
グレッグヒューギル

8
静的型付けの欠如は機能であり、機能の欠落ではないということです...
10

32

C#

  • 私は可能性がしたいswitch()任意の型に、それはcase任意の式である可能性があります。

  • 'readonly'フィールド/ private setautoprops ではオブジェクト初期化構文を使用できません。一般的に、不変の型を作成するための言語の助けが必要です。

  • 使用{}のための名前空間クラスメソッドプロパティ/インデクサブロック複数文のブロック配列初期化子。彼らが遠く離れているか不一致であるとき、あなたがどこにいるかを理解するのを難しくします。

  • 書いて嫌い(from x in y ... select).Z()です。クエリ構文に不足しているため、メソッド呼び出し構文にフォールバックする必要はありません。

  • doようなクエリ構文の句が必要ですforeach。しかし、それは実際にはクエリではありません。

私は本当にここに達しています。C#は素晴らしいと思うし、壊れているものを見つけるのは難しい。


14
あらゆるタイプのスイッチのための1
oɔɯǝɹ

スイッチの問題の+1、および私がこれまで実際に考えていなかった{}の問題
Maslow

{}が嫌いです。()に似すぎています。基本的にワンライナーでない限り、私は常に同じレベルにそれらを置くので、ミスマッチは私にとって大した問題ではありませんでした。
Loren Pechtel、2010年

2
linqクエリの場合は+1。特に、1つのオブジェクトのみを返す場合。(from x in y select).first()の代わりに、a(from x in y select top 1)または実際のSQL構文により近いものを使用しないでください。
AdmSteck 2010年

必要に応じて任意の型でswitch()を実行でき、その場合は任意の式である可能性があります。F#パターンマッチングを確認してください。c-sharpcorner.com/UploadFile/mgold/...
gradbot

26

PHP

  1. サーバーを制御しない場合、デバッグ機能はありません。
  2. 悪質なPHPコードが大量に浮かんでいるため、すべてのPHPプログラマに悪名が付きます
  3. 一貫性のない関数の命名
  4. 必要に応じて静的型付き変数を使用できない(90%の確率で動的型付けの大ファンです)
  5. REGISTER_GLOBALSは悪魔です

25
REGISTER_GLOBALSは私の犬を食べました:(
Pim Jager

2
1:xdebugとMacGDBpなどのGUIクライアントをお勧めします。これにより、いくつかの苦痛が本当に緩和されます...他の点についても同意します。
Jonas Due Vesterheden、2008年

5
#2:なんてこった、私から始めないで。私は常に、PHP開発者として、多くの人々がPHPで作成する混乱を目にしたことのない人々から身を守る必要があります。
selfawaresoup

1
#2の+1私はPHP開発者として自分自身を守るために多くの時間を費やしました。
UnkwnTech 2010年

#2の+1-給与も下がる:(
Shiki

25

C(OK、それは私のお気に入りではありませんが、まだ行われていません。)

  • ソケットライブラリの構文。
  • 関数のオーバーロードはありません。
  • Cスタイルの文字列。
  • バッファオーバーラン。
  • 不可解な構文。あと何回あといを調べて、おでこを叩いて「もちろん!」と叫んだ回数がわかりません。

編集:おそらくライブラリコードをもっと頼むと(ソケットでやったように、それらは特に悪いです)もっと多くを思いつくかもしれませんが、私はすでにCを選ぶために浮気しているように感じました。 Cの良い部分と悪い部分を取り替えて、まるで死んだ馬を倒すようなものだ。


22
どんなソケット構文?Cにはソケットの概念はありません。
Ferruccio

3
ああ、召し上がれ!あなたは5つを考え出すことができます。ポインター算術演算は、たんに吸いませんか?:)
brian d foy 08/11/11

8
+1「Cスタイルの弦」を笑った。そして、@ brain_d_foy:ポインタの計算は、理解できない場合にのみ問題があります。
Chris Lutz、

1
@Chris Luts:(C ++や他のOO言語を知る前に)プレーンなCを学んでいたときでさえ、char配列に問題があることを知っていました。:)
リザード

2
ポインタ演算は、電力のこぎりである-非常に効率的な、しかし、あなたはあなたの全体の足を取ってリスク
するThorbjörnRavnアンデルセン

24

Common Lisp:

  1. キーワードは冗長すぎることがよくあります。
  2. ライブラリのサポートは哀れです。
  3. メモリをより厳密に処理したいOSではうまく機能しません。
  4. OSと対話するための優れた機能がありません。
  5. 「ループ」機能は明確に定義されておらず、Lispyには見えません。

2
'loop'はlispyではないかもしれませんが、それについて十分に定義されていないものは何ですか?
Daniel Cassidy

2
私は標準を自分で読んだことがありませんが、主にPaul Grahamの「On Lisp」を使用しています。彼は、標準は主に例であり、コーナーケースをまったく定義していないと言います。
David Thornley、

3
キーワードがあまりにも言葉っぽいという意味ではありませんか?
GClaramunt、

「リッシー」ではないことに同意しますが、CLtLv2は多くの時間を費やしています。私はそれがあまりにも多くのことをするように設計されたと思います。 sunsite.univie.ac.at/textbooks/cltl/clm/...
ハンス・ヴァンSlooten

「ループ」に加えて、「フォーマット」もあまりLisplikeではありません。Lispは私の好きな言語ですが、「フォーマット」と「ループ」はどちらも嫌いです。
ポールライナーズ2010年

24

BrainF * ck

  • あなたのハイライトは、あなたがチューリングを完成させたことです!Perl正規表現でもっとできる!

  • オブジェクトの欠如。さあ、人!それは、のようなものだこんにちは ...

  • ネットワークライブラリはありません。私が欲しいのは、ウェブページ、GOSHをこするだけです。

  • ファーストクラスの機能はありません。おめでとうございます。Javaの友達と妥協することになります。

  • ストレージ用の無限のテープだけです。これは非常に大げさなので、Lispを作成することもできます。


6
名前空間や動的モジュールのサポートはありません。そのような基本なしで化学プラント制御システムを作成することをどのように期待できますか?
ドナルフェロー2010年

> 10(10回移動)、0(ゼロを挿入)、+ 5(5を追加)などの構文糖はありません。
スコール2011

23

JavaScript

  1. 数値を文字列として-数値が文字列として解釈されると、数学がイライラすることがあります。5 + 2 = 52?うーん...
  2. 権限-最高のものはすべてユーザーの許可が必要です!
  3. 画面の更新-画面を更新するには、ブラウザが安定した状態になっている必要があります。スクリプトの途中で画面を強制的に更新する方法はないようです。
  4. 遅い-GoogleのChromeはいいですが...
  5. ブラウザの違いにより、この言語の使用は[検閲済み]になります。

4
文字列としての数値は簡単に修正できます。文字列を取得したことがある場合は、parseInt(x、10)する必要があります。巨大な失敗は、あなたが、10を省略したときであり、それは '017'をOCTALとして解釈します
オリオンエドワーズ

3
false == 0 == [] == ""ですが、nullとNaNはそうではありません。NaN!= NaN。null == null。
ジミー

7
typeof "a string" == "string"。typeof new String( "another string")== "object。new String( 'a')。constructor ==" a ".constructor。typeof new Array()== 'object'
Jimmy

1
for(x in object)は関数を返します
Jimmy

14
-1、このリストは主にブラウザ自体の問題に関するものであり、言語自体に関するものではありません。
Mauricio Scheffer、

20

PHP:

  • ほとんどの一般的な拡張機能がすべてのWebサーバーで利用可能であるかどうかを確認することはできません。
  • 将来はすべてになることを試みます(goto、クロージャ、...)
  • 未経験ユーザーのための多くのセキュリティリスク
  • より多くの演算子のオーバーロードがいいでしょう
  • それを適切に機能させる方法を学び、悪い名前を付けないすべての貧しいプログラマー

それでもPHPは、(スクリプト)言語。;-)


あと1つだけです。
brian d foy 08/11/11

4
ポイント5に完全に同意します。Javascriptリストにも掲載されます。
スティーブクラリッジ

「適切に機能させる方法を学ばず、悪い名前を付けているすべての貧しいプログラマー」には同意しません。私はそれを「ランタイム言語構成オプションに大規模にタックイン」と置き換えます。
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. Windowsのみ。
  2. サポートされなくなりました。
  3. 配列は、すべて0に正規化されるのではなく、任意の数で開始できます。
  4. コンパイルされたアプリケーションは、適切に実行するために多くのDLLに依存しています。
  5. ブラウザーコントロールやコードの複雑な部分などの多くの複雑なコントロールは、コンパイルされていないコードを実行するとIDEを破壊する傾向がありますが、コンパイルすると正常に動作します。

13
VBは誰かのお気に入りの言語ですか?O_o。ここに「他の言語とは完全に異なり、互換性のないsyntaz」や「他の言語に関して悪い習慣を与える」のではないのですか?
Jonta、

3
私は実際には#3をバグではなく非常に強力な機能だと思っています。AWKはある意味でそれを持っていますが、AWKの配列は実際には偽装されたハッシュです:(
Joe Pineda

3
1と4で、.NET C#は完全なフレームワークとオペレーティングシステムを必要としませんか??? (ねえ、あなたはあなたのモノビゴットを聞いた...それはまだあなたのための「完全なフレームワーク」であり、debian distがこれを食べることは疑わしい)。5に関して、
正直

2
まだ時々vb6をサポートする必要があります。ペットのパイブ:宣言時に変数を初期化できない、パラメーター化されたコンストラクターがない、ファイルごとに1つのクラスなど...これらの問題が修正される場合、言語はさらに10年間簡単に続行できます。
AngryHacker 2009

14
「On Error Resume Next」については
どうでしょう

18

Rubyは私のお気に入りの言語です。ここに私が好きではないものがあります。

  • 緑のスレッド+ Cライブラリのブロック=巨大な失敗
  • ひどく遅い
  • 標準ライブラリ自体は、bangの使用と矛盾しています!メソッド
  • モジュールのインクルード+拡張は面倒です。
  • 「オープンクラス」はスコープできません-String#dostuffを追加したいのですが、それをすべてのサードパーティライブラリにリークしたくありません。
  • バイナリ展開パッケージソリューションはありません。

3
Ruby 1.9.1を試しましたか?Ruby 1.8.6に比べて大幅な高速化を実現
Christian Stade-Schuldt 2009

jrubycを試してください。JVM JIT FTW!
KitsuneYMG

評価の高いRubyの答えから「嫌い」ではなく、合理的な問題を含めるための+1。
Phrogz

17

Delphi:

  • IDEは少し不安定です。
  • コードの洞察が混乱することがあります。
  • デバッグにはバグがある場合があります。
  • 複数のプロジェクトファイルを更新するのは面倒な場合があります。
  • 1つ以上のパッケージが利用できないときに起動すると、エラーメッセージが数回表示されます。

5
Delphi the language(AKA Object Pascal)
–Dónal

11
おそらくそれはObject Pascalが完璧だからです;-)
Mark Bessey

3
私はパーティーに少し遅れましたが、とにかくここに行きます:-メソッドのシグネチャを2回書き留める必要があります(インターフェース+実装)-ユニット名はファイル名と同一である必要があります。WTF?!?
Martijn

1
私は始まりが..終わりが優れていることに気づきます-それらは{}よりもはるかに明確です。コードを書くよりもコードを読むことに多くの時間を費やします。ただし、不便な点があります。ケース内で範囲を宣言することは完全に合法ですが、ケースでは列挙型の定義された部分範囲を使用することはできません。また、ユニット間の前方参照はありません。
Loren Pechtel、2010年

1
@AlexanderN:いいえ、これまで以上に活​​気があり、人気があり、素晴らしいことはありません。
Andreas Rejbrand

16

JavaScript

  • すべてのスクリプトは単一のグローバルな「名前空間」で実行されます...さまざまなソースからのスクリプトを操作するときに注意する必要があるもの

  • 変数が使用されているが事前に定義されていない場合、その変数はグローバル変数と見なされます

  • ブラウザーベンダーは標準どおりに標準を作成しており、このような美しい言語を使用する開発者向けのコーディングを必要以上に難しくしています

  • 大文字と小文字の区別-コンパイル時のチェックを行うjsを開発するための適切なIDEがないことを考慮

  • hasOwnPropertyいくつかの、それ以外の場合は単純な操作を実行するための回避策(メソッドの使用など)。


AFAIK、ブラウザーベンダーによるJS 言語(DOMではない)のすべての拡張機能は、標準プロセスがそれを達成できなかったとしても、少なくとも標準の採用を推し進められています。hasOwnProperty / workarounds:両刃の剣。「単純さ」を強制するために、私たちは多くの力と柔軟性を失います。その不満はいつも私を怒らせます。ループを正しく記述してください(オブジェクトメンバーもチェックしてください)。
まぶたのない2009

15

Haskell:

  1. 遅延評価によるスペースリーク。
  2. 数学的抽象化に関して構築されていない数値階層。
  3. 厳密なモナディックIOは、デバッグを困難にする可能性があります。
  4. 大きな実装は、標準と完全に互換性がないように見える方法でI / Oを処理します。(特に、文字を出力すると下位8ビットのみが出力されます。その後、この仮定を使用してバイナリI / Oを行うコードが構築されます。Ick。)
  5. 結合性($)オペレータは、いくつかの表現がきれいにするために変更することができます。

これらのほとんどは憎悪のレベルに達しておらず、これらのそれぞれに対して確実な回避策を修正または構築しようとする人々がいます。

編集:ポイント5については混乱がありました。特に、私は引数の順序を意味していると思う人もいますが、そうではありません。私が何を意味しているのかを説明するのではなく、人々に次のリンクhttp://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativityを示し、それをうまく表現しています。


3
($)の結合性を変更したいのはなぜですか?'((fg)h)x'としての 'fghx'ブラケットと 'f(g(hx))'としての 'f $ g $ h $ x'ブラケット
Erik

1
私は3ハスケル。標準ライブラリは、ベクトル空間などを含む数学的抽象概念の山を含む必要があります。プレリュードには、($)のように左から右にチェーンする演算子も必要です{source |> func1 |> filter func2 |> map(func3 10)}。
yfeldblum 2008年

10
あなたは本当に悪いものを見逃しました:Haskellプログラマーが1文字の変数名を使用する傾向。
ベンジャミンコンフィノ

1
左結合($)演算子は単なる関数適用であり、Haskellではスペース文字で表されます。@正義:フリップ機能を試してください。(|>)=反転($)
Apocalisp '06 /

1
誰かが#5のポイントを説明できますか?正しい連想性が($)のすべてのポイントであると思いました。
Tim Matthews、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.