JavaScript API の設計原則

Feb 07, 2017 pm 02:52 PM
api javascript 設計原則

少し前に、ネイティブ モジュール API (iOS および Android モジュールは JavaScript インターフェイスにカプセル化されています) を整理して最適化したので、JavaScript API の設計に関するいくつかの記事を勉強しました。古い記事ですが、非常に有益だったので記録しておきます。ここ。

優れた API 設計: 自己記述的でありながら抽象化の目標を達成します。

適切に設計された API を使用すると、開発者はマニュアルやドキュメントを頻繁に保管する必要がなく、テクニカル サポート コミュニティに頻繁にアクセスする必要もありません。

スムーズなインターフェイス

メソッドチェーン: スムーズで読みやすく、理解しやすい

//常见的 API 调用方式:改变一些颜色,添加事件监听
var elem = document.getElementById("foobar");
elem.style.background = "red";
elem.style.color = "green";
elem.addEventListener('click', function(event) {
  alert("hello world!");
}, true);
//(设想的)方法链 API
DOMHelper.getElementById('foobar')
  .setStyle("background", "red")
  .setStyle("color", "green")
  .addEvent("click", function(event) {
    alert("hello world");
  });
ログイン後にコピー

Set 操作と get 操作を 1 つに組み合わせることができ、メソッドが増えるほど、ドキュメントを書くのが難しくなる可能性があります

var $elem = jQuery("#foobar");
//setter
$elem.setCss("background", "green");
//getter
$elem.getCss("color") === "red";
//getter, setter 合二为一
$elem.css("background", "green");
$elem.css("color") === "red";
ログイン後にコピー

一貫性

関連性インターフェースはそのまま 一貫したスタイルと、使い慣れた快適な感覚を伝える一連の API により、開発者の新しいツールへの適応が大幅に容易になります。

物事に名前を付ける: 短く、自己記述的で、そして最も重要なのは一貫性です

「コンピューター サイエンスにおける難しい問題は 2 つだけです。キャッシュの無効化と名前の付け方です。」
「コンピューター サイエンス コミュニティでは、頭痛の種は 2 つだけです。それはキャッシュです。無効化と命名の問題」
— Phil Karlton

好きな言葉遣いを選んで、そのまま使いましょう。スタイルを選択し、それを維持します。

パラメータを処理するとき

、提供したメソッドが人々によってどのように使用されるかを考慮する必要があります。繰り返し呼び出されるでしょうか?なぜ繰り返し呼び出されるのですか?開発者が重複呼び出しを減らすために API はどのように役立ちますか?
マップ マッピング パラメーター、コールバック、またはシリアル化された属性名を受け取ることで、API がクリーンになるだけでなく、より快適かつ効率的に使用できるようになります。

jQuery の css() メソッドは DOM 要素のスタイルを設定できます:

jQuery("#some-selector")
  .css("background", "red")
  .css("color", "white")
  .css("font-weight", "bold")
  .css("padding", 10);
ログイン後にコピー

このメソッドは JSON オブジェクトを受け入れることができます:

jQuery("#some-selector").css({
  "background" : "red",
  "color" : "white",
  "font-weight" : "bold",
  "padding" : 10
});
//通过传一个 map 映射绑定事件
jQuery("#some-selector").on({
  "click" : myClickHandler,
  "keyup" : myKeyupHandler,
  "change" : myChangeHandler
});
//为多个事件绑定同一个处理函数
jQuery("#some-selector").on("click keyup change", myEventHandler);
ログイン後にコピー

型の処理

メソッドを定義するときは、どのパラメーターを受け取ることができるかを決定する必要があります。人々が私たちのコードをどのように使用するかはわかりませんが、より前向きになって、どのようなパラメータのタイプをサポートするかを検討することはできます。

//原来的代码
DateInterval.prototype.days = function(start, end) {
  return Math.floor((end - start) / 86400000);
};
//修改后的代码
DateInterval.prototype.days = function(start, end) {
  if (!(start instanceof Date)) {
    start = new Date(start);
  }
  if (!(end instanceof Date)) {
    end = new Date(end);
  }
  return Math.floor((end.getTime() - start.getTime()) / 86400000);
};
ログイン後にコピー

わずか 6 行のコードで、私たちのメソッドは Date オブジェクト、数値タイムスタンプ、さらには Sat Sep 08 2012 15:34:35 GMT+0200 (CEST) のような文字列を受け取るのに十分強力です

渡されるパラメータのタイプ (文字列、数値、ブール値) は、次のように変換できます:

function castaway(some_string, some_integer, some_boolean) {
  some_string += "";
  some_integer += 0; // parseInt(some_integer, 10) 更安全些
  some_boolean = !!some_boolean;
}
ログイン後にコピー

未定義の処理

API をより堅牢にするために、実際の未定義の値が渡されるかどうかを識別する必要があります。 、引数オブジェクトを確認できます:

function testUndefined(expecting, someArgument) {
  if (someArgument === undefined) {
    console.log("someArgument 是 undefined");
  }
  if (arguments.length > 1) {
    console.log("然而它实际是传进来的");
  }
}
testUndefined("foo");
// 结果: someArgument 是 undefined
testUndefined("foo", undefined);
// 结果:  someArgument 是 undefined , 然而它实际是传进来的
ログイン後にコピー

パラメータに名前を付けます

event.initMouseEvent(
  "click", true, true, window,
  123, 101, 202, 101, 202,
  true, false, false, false,
  1, null);
ログイン後にコピー

Event.initMouseEvent このメソッドは、ドキュメントを読まずに、各パラメータの意味を誰が理解できるでしょうか。

各パラメータに名前を付け、デフォルト値を割り当てます。できれば

event.initMouseEvent(
  type="click",
  canBubble=true,
  cancelable=true,
  view=window,
  detail=123,
  screenX=101,
  screenY=202,
  clientX=101,
  clientY=202,
  ctrlKey=true,
  altKey=false,
  shiftKey=false,
  metaKey=false,
  button=1,
  relatedTarget=null);
ログイン後にコピー

ES6、またはHarmonyには「デフォルトパラメータ値」と「残りのパラメータ」があります。

パラメータは JSON オブジェクトを受け取ります

大量のパラメータを受け取る代わりに、JSON オブジェクトを受け取る方が良いです:

function nightmare(accepts, async, beforeSend, cache, complete, /* 等28个参数 */) {
  if (accepts === "text") {
    // 准备接收纯文本
  }
}
function dream(options) {
  options = options || {};
  if (options.accepts === "text") {
    // 准备接收纯文本
  }
}
ログイン後にコピー

呼び出しも簡単です:

nightmare("text", true, undefined, false, undefined, /* 等28个参数 */);
dream({
  accepts: "text",
  async: true,
  cache: false
});
ログイン後にコピー

パラメータのデフォルト値

を持つことが最善ですjQuery.extend( ) http://underscorejs.org/#extend) および Protoype の Object.extend を介したパラメーターのデフォルト値。デフォルト値をオーバーライドできます。

var default_options = {
  accepts: "text",
  async: true,
  beforeSend: null,
  cache: false,
  complete: null,
  // …
};
function dream(options) {
  var o = jQuery.extend({}, default_options, options || {});
  console.log(o.accepts);
}
dream({ async: false });
// prints: "text"
ログイン後にコピー

拡張性

コールバック

コールバックを通じて、API ユーザーはコードの特定の部分をオーバーライドできます。カスタマイズが必要な一部の関数を構成可能なコールバック関数に開くと、API ユーザーがデフォルトのコードを簡単にオーバーライドできるようになります。

API インターフェースがコールバックを受け取ったら、必ずそれを文書化し、コード例を提供してください。

イベント

ネイティブ イベントとの名前の重複を避けるために、イベント インターフェイスの名前を知っておくことが最善です。

エラーの処理

すべてのエラーが開発者にとってコードのデバッグに役立つわけではありません:

// jQuery 允许这么写
$(document.body).on('click', {});
// 点击时报错
//   TypeError: ((p.event.special[l.origType] || {}).handle || l.handler).apply is not a function
//   in jQuery.min.js on Line 3
ログイン後にコピー

そのようなエラーはデバッグが困難です。開発者の時間を無駄にせず、開発者にどのような間違いを犯したかを直接伝えてください:

if (Object.prototype.toString.call(callback) !== '[object Function]') { // 看备注
  throw new TypeError("callback is not a function!");
}
ログイン後にコピー

備考: コールバックのタイプ=== 「関数」は古いブラウザでは問題が発生し、オブジェクトは関数として扱われます。

予測可能性

優れた API は予測可能であり、開発者は例に基づいてその使用法を推測できます。

Modernizr の機能検出はその一例です:

a) HTML5、CSS の概念、API に完全に一致する属性名を使用します

b) 個々の検出は一貫して true または false の値を返します

// 所有这些属性都返回 'true' 或 'false'
Modernizr.geolocation
Modernizr.localstorage
Modernizr.webworkers
Modernizr.canvas
Modernizr.borderradius
Modernizr.boxshadow
Modernizr.flexbox
ログイン後にコピー

開発者に依存します 馴染みのある概念は、予測可能な目的にも役立ちます。

jQuery のセレクター構文は、CSS1 ~ CSS3 セレクターを DOM セレクター エンジンで直接使用できる例です。

$("#grid") // Selects by ID
$("ul.nav > li") // All LIs for the UL with class "nav"
$("ul li:nth-child(2)") // Second item in each list
ログイン後にコピー

比例調整

優れた API は、必ずしも小さい API である必要はありません。API のサイズは、その機能に見合ったものでなければなりません。

たとえば、有名な日付解析および書式設定ライブラリである Moment.js は、その API が簡潔かつ機能的であると言えます。

Moment.js のような関数固有のライブラリの場合、API が焦点を絞って小さいことを確認することが重要です。

API ドキュメントの作成

ソフトウェア開発で最も難しいタスクの 1 つは、ドキュメントを作成することです。実際、最大の不満は、使いやすいドキュメント ツールがないことです。

以下は自動ドキュメント生成ツールです:

  • YUIDoc (Node.js、npmが必要)

  • JsDoc Toolkit (Node.js、npmが必要)

  • Markdox (Node.js、npmが必要) )

  • dox(node.js、npmが必要)

  • docco(node.js、python、coffeescriptが必要)

  • jsduck(ruby、gemが必要)

  • jsdoc3(Javaが必要)

最も重要なことは、ドキュメントとコードが同時に更新されていることを確認することです。

参考文献:

優れた API 設計

より良い JavaScript API の設計

素晴らしい JavaScript API 設計の秘密

経由: http://jinlong.github.io/2015/08/31/secrets-of-awesome -javascript -api-design/

上記は JavaScript API 設計原則の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

Oracle API使用ガイド: データ・インタフェース・テクノロジの探求 Oracle API使用ガイド: データ・インタフェース・テクノロジの探求 Mar 07, 2024 am 11:12 AM

Oracle は世界的に有名なデータベース管理システム プロバイダーであり、その API (アプリケーション プログラミング インターフェイス) は、開発者が Oracle データベースと簡単に対話して統合するのに役立つ強力なツールです。この記事では、Oracle API 使用ガイドを詳しく掘り下げ、開発プロセス中にデータ インターフェイス テクノロジを利用する方法を読者に示し、具体的なコード例を示します。 1.オラクル

Oracle API統合戦略分析: システム間のシームレスな通信の実現 Oracle API統合戦略分析: システム間のシームレスな通信の実現 Mar 07, 2024 pm 10:09 PM

OracleAPI統合戦略分析: システム間のシームレスな通信を実現するには、特定のコード・サンプルが必要です。今日のデジタル時代では、社内の企業システムは相互に通信してデータを共有する必要があり、OracleAPIは、システム間のシームレスな通信を実現するための重要なツールの1つです。システム。この記事では、OracleAPIの基本概念と原則から始まり、API統合戦略について説明し、最後に読者がOracleAPIをよりよく理解して適用できるように具体的なコード例を示します。 1. 基本的な Oracle API

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

Laravel APIのエラー問題に対処する方法 Laravel APIのエラー問題に対処する方法 Mar 06, 2024 pm 05:18 PM

タイトル: Laravel API エラーの問題に対処する方法、具体的なコード例が必要です Laravel を開発していると、API エラーが頻繁に発生します。これらのエラーは、プログラム コードのロジック エラー、データベース クエリの問題、外部 API リクエストの失敗など、さまざまな理由で発生する可能性があります。これらのエラー レポートをどのように処理するかは重要な問題であり、この記事では、特定のコード例を使用して、Laravel API エラー レポートを効果的に処理する方法を示します。 1. Laravelでのエラー処理

Insomnia チュートリアル: PHP API インターフェイスの使用方法 Insomnia チュートリアル: PHP API インターフェイスの使用方法 Jan 22, 2024 am 11:21 AM

PHP API インターフェイス: Insomnia の使用方法 Insomnia は強力な API テストおよびデバッグ ツールです。開発者が API インターフェイスを迅速かつ簡単にテストおよび検証するのに役立ちます。PHP を含む複数のプログラミング言語とプロトコルをサポートしています。この記事では、Insomnia を使用して PHPAPI インターフェイスをテストする方法を紹介します。ステップ 1: Insomnia をインストールするInsomnia は、Windows、MacOS、Linux をサポートするクロスプラットフォーム アプリケーションです。

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具体的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

See all articles