0

私はオブジェクトを持っています。

var NavigationController = function(config) {

    if(!config) {
        config = {};
    }

    if(!config.routes) {
        config.routes = {};
    }

    var getControllerByPath = function(path) {
        // I need to get Controller (UserController) if path matches in routes (/user/me)
    };
}

私はこれを次のように使用できます...

var navController = new NavigationController({
    routes : {
        '/user/:action' : 'UserController',
        '/app/:action' : 'AppController',
        '/file/:action' : 'FileController',
        '/feedback/:action' : 'FeedbackController'
    }
});

navController.navigate(req, res);

現時点では、ルートごとに正規表現文字列を生成し、それをパス文字列に一致させていますが、機能しますが、効率的ですか?

4

1 に答える 1

0

正規表現は、この問題を解決する優れた方法のようです。スキャンして / と : を探すこともできますが、バックトラックせずに正規表現を記述することもでき、パフォーマンスの向上に役立ちます。

パフォーマンスを向上させようとすると、まったく必要のないアルゴリズムの作成に多くの時間を費やすことになります...これが、アプリのパフォーマンスの改善が必要な場所であると確信していますか? 多くの場合、事前最適化は最も一般的な間違いの 1 つです。最善の策は、アプリにロジックを組み込み、遅い部分を特定して最適化することです。

これが役に立ったことを願っています!

編集:私が話している正規表現の例:

問題が、文字列内の文字 k までのすべてを一致させることであると仮定すると、ほとんどの人は次のように提案します。

.*k

しかし、これは "hijk" や "hijkhijkh" などの文字列に一致します (それぞれ、hijk、hijkhink に一致します)。これは、この正規表現が実際に「すべてを取得し、最後の文字が k かどうかを確認してください。そうでない場合は、その文字を削除して、true になるか文字がなくなるまで逆方向に作業する」と言っているからです。

最初の k に一致させたい場合は、次のようにすることができます。

.*?k

これは、「一度に 1 文字ずつ取得し、パターン (k で終わる) に一致するかどうかを確認します。一致しない場合は、トークンが一致するか、一致するものがなくなり、一致が見つからなくなるまで取得し続けます。」

これを利用して、一度に 1 文字ずつ取得できます...貪欲な演算子は文字列をすぐにスキャンするため、O(n) から始めます。私が紹介した後者のバージョンは、最初の一致が見つかるまで機能するため、はるかに優れた最良のシナリオを持つ可能性があります...しかし、アプリでこれらを実際に試して、これがボトルネックであるかどうかをパフォーマンステストする必要があります。平均的なケースでアプリが処理するデータの種類。

于 2012-07-12T16:04:00.823 に答える