8

アプリケーション内のどこにも呼び出されないスイッチケースを削除する処理はありますか?JavaScriptのスイッチケースからのデッドコードの削除

function execute_case(id) { 
    switch(id) { 
    case 0: 
     console.log("0"); 
     break; 
    case 1: 
     console.log("1"); 
     break; 
    case 2: 
     console.log("2"); 
     break; 
    case 3: 
     console.log("3"); 
     break; 
    default: 
     console.log("default"); 
     break; 
    } 
} 

execute_case(1); 

上記のすべてが私が持っているなら、理論的には0,2,3はデッドコードであり、決して実行されません。コードを縮小する際に、このコードを削除するインテリジェンスはありますか?

私はswitch文で200,000を超えるコードを持つコードを見ています。

おかげで、 -Vikrant

+0

ガベージコレクションstuff.iであなたの手を汚さなければならないということは、あなたのコーディングを楽しんでください。 –

+5

私は尋ねるのを躊躇しますが、200Kのケースステートメント? WTF? –

+0

コンパイラは、一番下の行が関数が呼び出される唯一の場所であることを知ることはできません。後で別のJSファイルをロードして、別のパラメータで関数を呼び出すことができます。 – Barmar

答えて

3

ません卿は、idとして

が可変である、何のコンプレッサーはこれが起こらないことを "知らない" だろう。コンプレッサーはswitchステートメントの変数値を解析せず、それらを削除する方法も知っています。

「知っている」場合、これらのケースは発生しません。自分で削除してください。

+0

実際には、ケースがヒットしないことを保証するためにあまりにも多くの "what-ifs"(変数を渡すとどうなりますか、AJAX呼び出しから来た変数は何ですか? ) –

+0

コマンド文、Brad。 OPが聞いてくれることを願っています。 –

+1

私は、コンパイラが関数が1つの場所からしか呼び出されず、その場所に定数パラメータがあることに気づくと思います。そのため、関数定義への定数伝播を行うことができます。 – Barmar

3

デッド・ケース・ステートメントのリストを明確に指定するものはありません。もしそれが別の値(有限のコードの分岐)の可能性がないか、それが存在する可能性があると言います。したがって、execute_caseに渡すことができるすべての可能な値を知っていなければ、あなたは暗闇の中にいます。 (そして私はあなたが質問を与えないと仮定します)。

あなたは何ですか doはそのコードにそのスイッチに渡される値を出力/記録する小さなロガーを配置します。それから、[良い量の]時間および/または数千回の実行で、どれがヒットしているのか、そしてどれがヒットしていないのかを追跡します。私は必ずしもヒットしていないものを削除するとは限りませんが、もはやそれらを非推奨にして、より長い期間/より多くの処刑を待って、もはや必要ではないという結論に達するまで待ちます。

+0

この場合、私はすべての可能な呼び出しを見つける方法があります。ダイナミックコールはここにありません。すべてはスイッチIDが明示的に番号である直接呼び出しです。だから、それは私にgrepを要するだろう|すべての有効なケースを取得するuniq。しかし、このセットは手動で取り外すのにまだ非常に大きい(200K)。また、今日使用されていないケースが、明示的に明示的に使用された場合、新しいものを追加すると、それをやり直さなければならないという危険性があります。小型化装置はそのすべてを処理していたであろう。特別なケースを持つminifierかもしれません(そのような場合は--strict_case_minification) – v2b

関連する問題