0

javascript関数は他の関数を完全に呼び出すことができることを私は知っています。私はこれを数回利用しました。

現在、特定のタグのhtml要素を検索し、タグの種類に基づいてテキストを少し追加するスクリプトに取り組んでいます。

function foo() {
dealWithH1();
dealWithH2();           
dealWithH3();
etc...          
}

私はこのような関数に関していくつかの検索を行いましたが、私が見つけられないように見えるのは、これが良い習慣であるかどうかに対する明確で一貫した答えです。私はこの方法が好きです。なぜなら、作成する関数呼び出しがたくさんあり、それが非常に整理されているからです。深く入り込む前に、このようなことをすることに明白な問題がないことを確認したいだけです。この関数foo()は目的を果たさず、で呼び出されてonLoadから、これらの他のすべての関数を呼び出す必要があります。

これは大丈夫ですか、それともこれを行うためのより推奨される方法がありますか?

4

3 に答える 3

4

関数で構成される操作の疑似DSLを作成することは完全に合理的です。

ただし、関数の機能についての説明に基づいて、次のdealWith...ように関数をより一般化することをお勧めします。

function foo() {
    tagInsert('h1', 'Text to append to h1 tag');
    tagInsert('h2', 'Text to append to h2 tag');
    tagInsert('h3', 'Text to append to h3 tag');
}

関数の本質が抽出され(指定されたタイプのすべてのタグにテキストを追加)、関数の変数がパラメーター化された(タグのタイプと追加するテキスト)ので、同じように簡単に何かを行うことができますお気に入り:

var tags = {
    'h1': {
        'en': 'Hello',
        'es': 'Hola',
        'sr@latin': 'Zdravo'
    },
    'h2': {
        'en': 'Goodbye',
        'es': 'Adios',
        'sr@latin': 'Do vidjenja'
    },
    'h3': {
        'en': 'Green',
        'es'; 'Verde',
        'sr@latin': 'Zelena'
    }
};
function foo(locale) {
    for(var tag in tags) {
        tagInsert(tag, tags[tag][locale]);
    }
}

関数の構成可能性は、実行する操作について関数が実際に呼び出されるまで延期されると大幅に改善されます。その後、まったく同じ関数を使用して、固定されたテキストセットをタグに追加するだけでなく、実行することもできます。したがって、ユーザーが使用することを好む言語は何でも。

もちろん、この柔軟性はばかげた長さにすることができ、何もできませんが、関数を集合演算子と考えるのは良いことです。関数への入力は何ですか(変数として明示的に宣言するか、グローバル)および新しい出力セットを生成するために実行される操作は何ですか?

あなたが扱っている特定のケースに対して一般的な方法で関数を書くのにそれほど余分な労力を要しない場合は、そのように書いてください。同様のアクションを行う必要があるときはいつでも、その関数を再利用できます。さまざまな入力。

覚えて...

私のtagInsert定義を額面通りに受け取らないでください。あなたが実際に何をしようとしているのかについてはほとんど何も知りません。おそらく、その一般化は実際には意味がありません。重要なのは、開発者としてのあなたは、あなたが何を達成しようとしているのかについてより良い考えを持っているべきだということです。

Larry Wallのプログラマーの美徳に従う場合は、実行する必要のある余分な作業の量を最小限に抑えるように努める必要があります。そうすれば、関数は複雑さに対して適切な程度の構成可能性に到達します。

関数を呼び出す関数は、関数の要点です。関数を何度も書き直す必要はありません。実行するアクションの大規模な必須宣言を一連の関数に分割するだけでは、関数のポイントではありません。命令型コードの反復パターンとは何ですか?また、どのようにして可能な限り怠惰になることができますか?

于 2012-06-05T18:43:48.220 に答える
3

あなたが書いたコードが完全に擬似コードではないと仮定すると、私は絶対にそれをしません:あなたは多くの異なる関数でグローバルスコープを汚染するでしょう。これらの関数は、クロージャを使用してローカルスコープでラップするか、オブジェクトのメソッドにすることができます。

また、dealWithTagH1などdealWithTagH2にも、これらの特定のタグを検索して変更する目的があるようです。それはあなたが推定できる論理です。したがって、関心のあるすべてのタイプのタグを取得してから、dealWith関数を呼び出すものが必要です。このようにして、タグを検索するコードは1つだけであり、その特定のタグを処理するさまざまな関数があります。そのようにして、より多くのロジックを切り離しました。極端な言い方をしたい場合は、戦略パターンのようなものを使用できます。

名前も変更し、各「戦略」に適切な名前を付けます(dealWithTagH1これはかなり一般的で、コードを読んだ開発者は、実装された実際の戦略についてのヒントを持っていません)。

于 2012-06-05T18:37:46.000 に答える
2

事実上すべての主流の言語関数/メソッドは安価であり、可能な限り小さくてまとまりのある関数を持つことは、保守と可読性の観点から良い習慣です。関数を作成し、それらを抽出し、階層で呼び出すことを恐れてはいけません(1つの関数が別の関数を呼び出し、次に別の関数が3番目に呼び出されます)。の使用方法も学ぶ必要があります。

関数(無名関数とクロージャを含む)はJavaScriptの主要な構成要素であり、イベントハンドラーやコールバックなど、あらゆる場所で使用されます。

画面より長い機能は避けてください(10行と言うものもあれば、5行と言うものもあります。短くしてください)。また、関数を使用して重複を減らします。たとえば、あなたのすべてdealWithH*()が非常に似ていると何かが教えてくれます。どうですか:

function foo() {
  dealWithTag('h1');
  dealWithTag('h2');           
  dealWithTag('h3');
  //etc...          
}

もちろん、あなたの場合は別々の関数の方が良いかもしれませんが、抽象化の観点から考えて、問題を一般化してみてください。

于 2012-06-05T18:33:41.477 に答える