「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > # 一般的な検証を再利用可能な関数に置き換える

# 一般的な検証を再利用可能な関数に置き換える

2024 年 11 月 6 日に公開
ブラウズ:104

# Replace Generic Validation with Reusable Functions

JavaScript および TypeScript の開発者は、同じ条件を繰り返し記述していることに気づくことがよくあります。 Web 開発者であれば、おそらく次のようなコードに遭遇したことがあるでしょう:

const handleSaveTextKeydown = (event: KeyboardEvent) => {
   if (event.key === 'Enter') {
    //... save text
   }
}

この場合、event.key は文字列型であり、たとえば、'Enter ' に誤ってスペースを含めることでバグが発生しやすくなります。

この条件を関数にカプセル化してみてはいかがでしょうか?

const handleSaveTextKeydown = (event: KeyboardEvent) => {
   if (checkIsEnterKey(event.key)) {
    //... save text
   }
}

これにより、Enter キーのすべてのチェックに一貫性と信頼性が確保されます。

次に、次の検証について考えてみましょう:

type Value = null | object;

const value = {} as Value;

if (typeof value === 'object') {
  value; // value type is null | object
}

TypeScript はスマートですが、条件内の値は Value 型のままです。これは、typeof null が 'object'.

を返すためです。

したがって、次のように書く必要があります:

if (value !== null && typeof value === 'object') {
  value; // value type is object
}

多くの開発者は、これを関数にカプセル化せず、この状況に遭遇するたびに繰り返し記述する可能性があります。

人生で同じ条件を何回書いたことがありますか?

同じ間違いを何回しましたか?

今後何回同じ条件を書きますか?

私だったら、こうします:

if (checkIsObject(value)) {
  value; // value type is object
}

一般的な条件を関数にカプセル化すると、多くの利点があります。

次の例を考えてみましょう:

const array = [0, 1, 2, 3, 4, 5, null, undefined];

null 値のみを除外する配列を作成しましょう。

簡潔さを優先して次のように書くとよいでしょう:

const numbers = array.filter(Boolean);

残念ながら、これは理想的ではありません。 0 も false として評価され、除外されます。したがって、次のように書く必要があります:

const numbers = array.filter(item => item !== null && item !== undefined);

これは醜くて再利用できないコードだと思いませんか?

よりエレガントなコードを書くことができます:

const numbers = array.filter(checkIsNullish);

一般的な条件を繰り返し記述するのをやめます。それは間違いを引き起こすだけであり、コードは読みにくくなります。

私が作成した checker というライブラリを紹介します。

一般的なWeb開発や低レベル開発でよく使われる条件を関数として表現したユーティリティ関数ライブラリです。すべての関数は入力を受け取り、ブール値を返します。

この記事の執筆時点では、文字列、数値、ブール値、NULL 値などのデータ型を処理するための豊富な関数が提供されています。すべての機能はテストされ、文書化されており、簡単に使い始めることができます。

実際の例をいくつか見てみましょう。

このライブラリで提供されるパッケージはすべて JSR で公開されています。これらは、NPM、PNPM、Yarn、Bun、および Deno プロジェクトに簡単にインストールできます。

ここでは、NPM を使用した例として @checker/string パッケージを取り上げます。

  1. パッケージをインストールします

プロジェクト ディレクトリで次のコマンドを実行します:

  npx jsr add @checker/string
  1. 関数の使い方
  import { checkIsNotEmptyString, checkIsIndexFound } from "@checker/string";

  const value = "Hello";

  const formatted = value.trim();

  if (checkIsNotEmptyString(formatted)) {
    // formatted !== ''
    // When formatted is not an empty string
  }

  const index = value.indexOf("el");

  if (checkIsIndexFound(index)) {
    // index !== -1
    // When "el" is found in value
  }

私は、ブール値を反転するために !SOME_CONDITION のような論理否定演算子を使用するのが好きではありません。これは暗黙的であり、ブール値を追加または省略して単純に反転すると、多くの危険な状況が発生する可能性があるためです。

したがって、すべての関数には、対応する checkIsNot~ 関数が定義されています。

一般的な条件を関数にカプセル化します。こうすることで、コードが読みやすくなり、バグも見つけやすくなります。

読んでいただきありがとうございます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/cat394/-replace-generic-validation-with-reusable-functions-3nec?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • ハクトーバーフェストに貢献する新しい方法: フロントエンド AI で直接
    ハクトーバーフェストに貢献する新しい方法: フロントエンド AI で直接
    Hacktoberfest が帰ってきます。今年は開発者が参加できるエキサイティングな新しい方法をもたらします。 従来の GitHub プル リクエストの代わりに、Webcrumbs プラットフォーム上のフロントエンド AI を通じて直接テンプレートを作成して送信できるようになりました。 tools...
    プログラミング 2024 年 11 月 7 日に公開
  • 関数ポインタが括弧なしで使用されると、「cout」に「1」が出力されるのはなぜですか?
    関数ポインタが括弧なしで使用されると、「cout」に「1」が出力されるのはなぜですか?
    なぜ「関数を呼び出さずに関数を出力します (f() ではなく f;)。常に 1 を出力しますか?」この中でこのコードでは、括弧を使用せずに pr という名前の関数を「呼び出し」ようとします。ただし、これは実際には関数を呼び出しているわけではありません。代わりに、関数ポインタを cout 関数に渡しま...
    プログラミング 2024 年 11 月 7 日に公開
  • Web ページを高速化する
    Web ページを高速化する
    DOM とは何ですか?それは何を食べるのでしょうか? DOM (Document Object Model) は Web ページとその開発の基礎です。これは、HTML および XML ドキュメント用のプログラミング インターフェイスであり、ドキュメントの構造をツリー状のオブジェクト...
    プログラミング 2024 年 11 月 7 日に公開
  • JavaScript での require と import
    JavaScript での require と import
    コーディングを始めたとき、require() を使用してモジュールやインポートを使用して他のファイルをインポートするいくつかの js ファイルを見たことを覚えています。何が違うのか、なぜプロジェクト間で一貫性がないのかがよくわからず、いつも混乱していました。同じことを疑問に思っている場合は、読み続け...
    プログラミング 2024 年 11 月 7 日に公開
  • イメージを使用した Vite/React アプリケーションのデプロイ: 完全ガイド
    イメージを使用した Vite/React アプリケーションのデプロイ: 完全ガイド
    Vite/React アプリケーションを GitHub Pages にデプロイすることはエキサイティングなマイルストーンですが、このプロセスでは、特に画像やアセットを扱う場合、予期せぬ課題が発生することがあります。このブログ投稿では、初期導入から一般的な問題のトラブルシューティング、効果的な解決策の...
    プログラミング 2024 年 11 月 7 日に公開
  • React アプリで API 呼び出しを最適化した方法
    React アプリで API 呼び出しを最適化した方法
    React 開発者として、私たちは、複数の急速な状態変化を API と同期する必要があるシナリオによく直面します。小さな変更ごとに API 呼び出しを行うのは非効率的であり、クライアントとサーバーの両方に負担がかかる可能性があります。ここで、デバウンスと賢明な状態管理が機能します。この記事では、ペイ...
    プログラミング 2024 年 11 月 7 日に公開
  • さあ行こう!
    さあ行こう!
    GO を試す必要がある理由 Go は、高速かつ軽量で静的に型付けされたコンパイル言語で、効率的で信頼性の高いアプリケーションの構築に最適です。そのシンプルさとクリーンな構文により、特に初心者にとって、学習と使用が簡単になります。 Go の優れた機能には、ゴルーチンによる組み込み同時...
    プログラミング 2024 年 11 月 6 日に公開
  • PNG 画像を CSS データ URI の Base64 としてエンコードするにはどうすればよいですか?
    PNG 画像を CSS データ URI の Base64 としてエンコードするにはどうすればよいですか?
    CSS データ URI の PNG 画像に Base64 エンコーディングを使用するデータ URI を使用して PNG 画像を CSS スタイルシートに埋め込むには、PNG データ最初に Base64 形式にエンコードする必要があります。この手法を使用すると、外部画像ファイルをスタイルシート内に直接...
    プログラミング 2024 年 11 月 6 日に公開
  • API 時間別データの応答性の高い JavaScript カルーセル
    API 時間別データの応答性の高い JavaScript カルーセル
    I almost mistook an incomplete solution for a finished one and moved on to work on other parts of my weather app! While working on the carousel that w...
    プログラミング 2024 年 11 月 6 日に公開
  • Web 開発における PHP と JavaScript の主な違いは何ですか?
    Web 開発における PHP と JavaScript の主な違いは何ですか?
    PHP と JavaScript: サーバー側とクライアント側 PHP は JavaScript とは異なる役割を果たします。 PHPはサーバーサイドで動作します。サーバーはアプリケーションを実行します。フォームなどを処理します。フォームを送信すると、PHP がそれを処理します。一...
    プログラミング 2024 年 11 月 6 日に公開
  • C++ で構造体とクラスのメンバーを反復処理して、実行時に名前と値にアクセスするにはどうすればよいですか?
    C++ で構造体とクラスのメンバーを反復処理して、実行時に名前と値にアクセスするにはどうすればよいですか?
    構造体とクラスのメンバーの反復C では、構造体またはクラスのメンバーを反復して名前を取得することができます。そして価値観。これを実現するためのいくつかのアプローチを次に示します。マクロの使用REFLECTABLE マクロを使用して、イントロスペクションを可能にする構造体を定義できます。マクロは、構造...
    プログラミング 2024 年 11 月 6 日に公開
  • 項目 正確な答えが必要な場合は、float と double を避ける
    項目 正確な答えが必要な場合は、float と double を避ける
    float と double の問題: 科学的および数学的計算用に設計されており、2 進浮動小数点演算を実行します。 金銭の計算や正確な答えが必要な状況には適していません。 0.1 などの 10 の負の累乗を正確に表すことができないため、エラーが発生します。 例 1: ドル額を減算する際の計算が正し...
    プログラミング 2024 年 11 月 6 日に公開
  • Go で WebSocket を使用してリアルタイム通信を行う
    Go で WebSocket を使用してリアルタイム通信を行う
    チャット アプリケーション、ライブ通知、共同作業ツールなど、リアルタイムの更新が必要なアプリを構築するには、従来の HTTP よりも高速でインタラクティブな通信方法が必要です。そこで WebSocket が登場します。今日は、アプリケーションにリアルタイム機能を追加できるように、Go で WebSo...
    プログラミング 2024 年 11 月 6 日に公開
  • Python でプロキシを使用して Selenium Webdriver を実行する方法
    Python でプロキシを使用して Selenium Webdriver を実行する方法
    Python でプロキシを使用して Selenium Webdriver を実行するSelenium Webdriver スクリプトを Python スクリプトとしてエクスポートし、コマンド ラインから実行しようとすると、次のような問題が発生する場合があります。使用上の問題 プロキシの場合にエラーが...
    プログラミング 2024 年 11 月 6 日に公開
  • || がいつ行われるか演算子は JavaScript でデフォルトの演算子として機能しますか?
    || がいつ行われるか演算子は JavaScript でデフォルトの演算子として機能しますか?
    || の目的を理解するJavaScript の非ブール オペランドを持つ演算子JavaScript では、|| は演算子は論理 OR 演算子と呼ばれることが多く、通常はブール式を評価するために使用されます。ただし、 || が次のような場合に遭遇する可能性があります。演算子は非ブール値で使用されます...
    プログラミング 2024 年 11 月 6 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3