理由を説明してくださいと、(誤)機能が実装されている言語をリストアップしてください。
嫌いな機能ではなく、有害な機能だと思うものを投稿してください。
デフォルトでNullを許可します。「兆」*ドルの間違いです。申し訳ありませんが、トニー・ホーア。地球上で利用できるほとんどすべての言語。
*最近の実際の損失を反映するように、Tony Hoareの造語を調整しました:-)
情報: http://php.net/manual/en/security.globals.php
これは、読みやすさやセキュリティ上の理由から、これまで実装された中で最悪の機能です。基本的に、受け取ったすべてのGETパラメータは変数に変換されます。
たとえば、次のURLの場合:/index.php?value=foobar
次のことができます。
<?php
echo $value; // return foobar
?>
コードを読んでいるとき、変数がどこから来ているのかを知るのは非常に混乱します。
また、機能が悪用された場合、セキュリティホールにつながる可能性があります。これがphp.netのコード例であり、悪用される可能性があることを示しています。
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
$authorized = true;
}
// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>
CおよびC++マクロ。誰かが自分のコードを台無しにするマクロの標準関数名を選択したために別のコンパイラエラーが発生した場合は、悲鳴を上げます。最後の問題のあるものを見てみましょう:
#define vector(int) new VARIANT[int];
ああ!私のSTLベクターで何をしましたか?
CおよびC++のswitchステートメントでのデフォルトのフォールスルー。
相互に変換される型に明らかな関係がない場合の暗黙的な型変換。たとえば、PHPのように、ランダムな非数値のstring
をint
に変換します。
goto :まれに問題はありませんが、誤用されることが多く、プログラムが読みにくくなります。
NONE
機能が頻繁に誤用されるからといって、それが有害になることはありません。
私見「有害であると見なされる」全体は、プログラミング言語の議論の Reductio ad Hitlerum です。
すべてではないにしても、ほとんどの「有害な」機能は、非常に有効なユースケースを持っているか、もともと持っていたか、そもそも単に便利な方法です。賛否両論を理解し、それに応じてコードを開発するのは開発者の責任です。
あなたの質問が「どの言語機能に共通の落とし穴や不幸な副作用があるか」という線に沿ったものである場合、私の答えは異なります。
[編集]明確にするために:私は非推奨のメソッドの継続的な使用を意味するのではありません。開発者が機能を減価/削除している場合は、代わりの機能を使用する必要があります。私が言及しているのは、言語の現在の部分は有害であると見なされているという概念です。
一部の人々は男性または彼が言うさまざまなことに反対しますが、多くのダグラス・クロックフォードのJavaScript:The Good Partsは基本的にこの質問がJSに適用されるものです。クロックフォードの不満の中で:
すべてのデフォルトのグローバルスコープ(DCは、関数/オブジェクトを名前空間として使用する方法と、スコープ区切り文字を使用してこれを詰め込む方法を示しています。)
with
のようなステートメント。その失敗動作は、グローバル名前空間での定義です。 (Gah!JSのモットーのように、失敗した場合はできるだけ失敗する!)
==
演算子での予期しない動作。基本的には、常に===
演算子を使用する必要があります。
セミコロン挿入。
JSの多くは、おそらく言語全体でさえも、有害であると見なされるべきですが、良い部分は非常に優れているので、それを補うことができます(少なくとも私にとっては)。
Autovivification(または他のbind-variable-on-(assign | use)機能)は、私が最も多くのバグを提供している機能です。
INTERCALのPLEASE
。それを十分に使用しないでください、それは不平を言います。使いすぎると文句を言う。
C/C++の場合:その割り当ては、非常に類似した割り当て=および比較==演算子を使用した式COMBINEDでもあります。それ自体は有害な機能ではありませんが、誤って演算子を誤って入力することで、バグ(簡単な場合もある)を簡単に導入することができます。
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
わかりました、実際には言語自体の機能ではありませんが、それでもかなり密接に関連しています。
突然、Flash/Flexアプリケーションが動作を停止し、f *が何が起こったかをほんの少しヒントを与えることができなくなります。エラーメッセージ、スタックトレース、何もありません。それは突然、画面の遷移が起こらない(または完全に間違った方法で起きる)か、ボタンがクリックに反応しなくなったか、またはコンボボックスがいくつかのエントリで埋められる代わりに空になるだけです。
その「機能」だけでも、いくつかの 肩をすくめるレポート と、私が得ている白髪の束全体の原因です。 -.-ユーザーの顔に不可解なメッセージを表示することも望ましくありませんが、少なくとも開発者が問題を修正するのに役立ちます。
しかし、Flash Playerは、ユーザーの説明に依存して、暗闇の中で手を刺し続けます(問題は、ユーザーが行っていたこととは何の関係もないコード内の完全に異なる場所から実際に発生する可能性があります)。 Debug Playerを使用する場合にのみ、実際にエラーメッセージとスタックトレースを含むポップアップウィンドウが表示されます。
ただし、特定のニュースサイトでFlash埋め込み映画を見て、使用された埋め込みプレーヤーSWFからNull参照に関するメッセージが繰り返し表示されるのは非常に興味深い場合があります。 :D
警告なしにシェルで未定義の変数を空の文字列に置き換える:rm -rf $nosuchvar/*
。
Java=パッケージのプライベート言語のデフォルトとプライベートプログラミング規約のデフォルトの修飾子にアクセスします。
変数変数 PHP内
あなただけだから$can
はあなたを意味しません$$should
LOGOで反時計回りに回転する機能。 Wtf、時計回りに回すだけ360 - x
度。
Javaおよび他の言語では、停止したスレッドが適切に終了するまでの時間を与えることなく、他のスレッドから任意にスレッドを停止できました。この機能は 非推奨 ですほぼすべての状況で発生する可能性のある膨大な量の問題を考慮します。
インデックスで始まるAWKの配列1!
DelphiのWith
ステートメントが頭に浮かびますが、便利な場合もあります。
Python 2.xの相対インポート構文。 x
の他のさまざまなライブラリのサポートを追加するパッケージx.plugins
があるとします。 x.plugins
にsqlalchemy
モジュールがあるとすると、x
にsqlalchemyサポートを追加できます。次の行をsqlalchemy.pyに追加するとどうなりますか?
import sqlalchemy
答えは、モジュールがそれ自体をインポートしようとするということです。この構文では、基本的に、実際のグローバルsqlalchemyパッケージをインポートできません。 Python 2.5は、これが相対インポートであることを指定する方法を追加しました:
from . import sqlalchemy
...しかし、最初の構文が実際に取り除かれたのはPython 3までです(ただし、Python 2.6+ with from __future__ import absolute_import
)。
Perlでは、スカラーコンテキストとリストコンテキストは扱いにくい場合があります。特定の操作を便利にするいくつかの優れた点がありますが、演算子の意味を完全に変更する(潜在的に重要なものから)コード内の距離)。
sub foo { (1..5) }
my @list = foo(); # (1,2,3,4,5)
my $length = scalar @list; # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)
それは正しくありません。
(これは、通常の範囲演算子のような動作をするものを作成することから発生するため、next if /start_regex/ .. /end_regex/
のようなループで何かを言うことができます)。
Sun.misc.unsafe は、私のお気に入りです。 「物事を実装するためにこれが必要でしたが、実際には使用する必要はないと思います」のコレクション。
FORTRAN共通ブロック。単純な間違いをした場合、アプリケーションのある部分が別の部分のグローバルを破壊する可能性があります。
FORTRANで割り当てられたgotoステートメント/ COBOL変更ステートメント。自己変更コード。危険、警告、飛行スパゲッティモンスター!!
経験の浅い開発者は、有効になっていることに依存しているため、SQLクエリで使用するためにすべてのユーザー入力がエスケープされると想定するか、無効になっていることに依存しているため、常に入力をエスケープします。
有効になっていると想定し、それが有効ではないシステムでコードを実行すると、SQLインジェクションホールが広がってしまいます。
無効になっていて無効になっていないと仮定すると、バックスラッシュが実際にDBに格納され、醜い/正しくない文字列が発生します。
両方のケースを処理するための非常に単純な方法もありません。get_magic_quotes_gpc()
を使用して有効になっているかどうかを確認し、_$_*
_配列のすべての値にstripslashes()
を適用する必要があります。 _array_map
_は再帰的ではなく、これにはカスタム関数が必要です。
オブジェクト指向(静的に型付けされたすべての言語から)。私はこの機能に賭けますが、これからも継続しますが、コストはvastly nullポインタよりも高くなります。オブジェクト指向は、動的なメッセージパッシング言語でのみ有効です。したがって、Pythonのような動的言語からも削除する必要があります(メッセージの受け渡しではなく、従来のサブルーチン呼び出しを使用しているため)。