問題タブ [api-design]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
531 参照

c# - 内部およびプライベート API で保護

私は約 12 人の開発チームで働いており、厳密に社内のみで使用する適切な API セットを構築しています。通常、すべてのクラスとインターフェイスは public です。API のコンシューマ (内部ではあるが) がファクトリを使用する必要があるように、いくつかのコンストラクタを内部にすることの価値をよく考えてきました。

これはあなたとあなたのチームが実践していることですか?

これは単体テストにどのように影響しますか? ファクトリを介してクラスを単体テストしても問題ないと思いますか、または PrivateObject のようなものを介してコンストラクターにアクセスしますか?

0 投票する
6 に答える
4178 参照

c++ - クラスを拡張し、バイナリの下位互換性を維持する

既存のライブラリに新しい機能を追加しようとしています。ルート クラスがアクセサを持つように、クラス階層に新しいデータを追加する必要があります。誰でもこのデータを取得できるのは、サブクラスのみが設定できるようにする必要があります (つまり、public getter と protected setter)。

下位互換性を維持するために、次のことを行ってはならないことはわかっています (リストには、問題に関連するアクションのみが含まれています)。

  • 仮想機能の追加または削除
  • メンバー変数の追加または削除
  • 既存のメンバー変数の型を変更する
  • 既存の関数のシグネチャを変更

このデータを階層に追加するには 2 つの方法が考えられます。新しいメンバー変数をルート クラスに追加する方法と、純粋な仮想アクセサー関数を追加する方法 (データをサブクラスに格納できるようにする方法) です。ただし、下位互換性を維持するために、これらのいずれも実行できません。

ライブラリは広範囲にpimplイディオムを使用していますが、残念ながら、私が修正しなければならないルート クラスはこのイディオムを使用していません。ただし、サブクラスはこのイディオムを使用します。

私が考えることができる唯一の解決策は、静的ハッシュマップでメンバー変数をシミュレートすることです。したがって、静的ハッシュ マップを作成し、この新しいメンバーをそこに格納して、静的アクセサーを実装することができます。このようなもの(疑似C ++で):

さて、この解決策は機能するかもしれませんが、非常に醜いと思います (もちろん、非静的アクセサー関数を追加することもできますが、これでは醜さが取り除かれません)。

他の解決策はありますか?

ありがとうございました。

0 投票する
1 に答える
227 参照

api-design - パブリックAPIを作成するためのベストプラクティスを証明する調査データはどこにありますか?

内部プライベートAPIを「公開」することは、パブリックAPI候補を作成し、内部で使用し、満足したら公開するというベストプラクティスと比較して、悪い考えであると管理者(製品管理など)に説得する必要があります。誰かが私が議論をするのを助ける研究論文のようないくつかの事実を見つけるのを手伝ってくれる?

0 投票する
1 に答える
199 参照

c# - URLルーターAPIの設計に関する質問

Webフレームワーク用のURLルーターを作成しています。できるだけ使いやすいものにしようとしています。APIは次のようになります。

その正規表現に一致するURLをそのメソッドにルーティングする場所。これは次のようになります。

型キャストを自動的に処理します。

(?<id>...)とメソッドが取る引数の間には相関関係があります。View()関数は、名前キャプチャによって提供されるすべての引数を受け入れる必要があります。ただし、オプションである限り、より多くの引数を受け入れることができます。たとえば、関数を呼び出すView(int id, int extraArg=2)必要がないため、その正規表現も関数と一致します。extraArg

問題は、そのルートも関数と一致する必要があるView()かどうかです-引数なしで?キャプチャは簡単に破棄でき、id関数を正常に呼び出すことができます。または、(現在のように)例外をスローする必要がありますか?

0 投票する
1 に答える
28 参照

c# - グローバル ルートの前または後にインライン ルートをチェックする必要がありますか?

私は Web フレームワークを書いていますが、1 つの優れた機能 (IMO) は、関数の Web アドレスを次のようにインラインで定義できることです。

そして、その関数はアクセス時に自動的に呼び出さ/profile:someusernamesomeusername、関数に渡されて自動的に型キャストされます。

しかし、古いやり方が好きな人のために、すべてのルートを 1 か所で指定することもできます:

今、私は 2 つの異なるメソッドを処理する順序を決定しようとしています。

OOH、グローバルルートを最初に置くということは、インラインルートが奪われる前にすべての特別なケースを前もって処理できることを意味しますが、OTOH、グローバルルートを前に置くと、そこにすべてのフォールバックルートを置くことはできません. ですので、どの順番がいいのか一概には言えません...

私が推測するもう1つの解決策は、優先キューを使用することであり、ユーザーは特定のルートに高い優先度または低い優先度を与えることができます.

0 投票する
2 に答える
79 参照

c# - コントロールをクライアント アプリに戻し、API から再度入力を求めるにはどうすればよいですか?

純粋な API を作成すると、いくつかの課題が生じるようです。たとえば、私は winforms/asp.net アプリを作成することに慣れており、入力が無効な場合、プログラムでダイアログ ボックス/Web ページを表示できます。

ただし、API は、それが実行される可能性のある GUI アプリを認識しません。TakeString (String s) というメソッドがあり、文字列 (s) が 5 文字を超えてはならない場合、クライアントに制御を返すにはどうすればよいでしょうか? 例外はやり過ぎのように思えますか? メソッドで何かを返す場合、単純な戻りは機能しません。

ありがとう

0 投票する
7 に答える
2992 参照

java - 適切なレベルのインターフェース粒度を取得する

私は現在、いくつかの API 設計作業を行っており、後でさまざまな具体的なクラスによって実装される抽象化としての多数のインターフェイスの仕様が含まれます。

たまたま私は Java を使用していますが、この質問は、同様のインターフェイスの概念をサポートする言語に関係があると思います。

多くの場合、次のオプションがあることに気付きました。

  • さまざまなメソッドを備えた大規模なインターフェイスを作成する
  • それぞれが全範囲のメソッドのサブセットを含む複数のインターフェイスを作成する (単一の具体的なクラスは、おそらくこれらのインターフェイスのいくつかまたはすべてを実装する必要があります)

各アプローチの長所/短所は何ですか?

0 投票する
3 に答える
3011 参照

javascript - JavaScript API 開発のグッド プラクティス

JavaScript API を設計するための適切なアプローチは何ですか?

私は JavaScript に比較的慣れていませんが、主に「JavaScript: The Good Parts」から、この言語の重要な優れた機能を学んでいます。現在、私は統計学を教える Web ベースのツールを設計しています。JavaScript API の設計方法を理解していないため、コード ベースが扱いにくくなっています。

私のバックグラウンドは Java と C++ であり、インターフェイスを設計し、それらのインターフェイスを個別に実装することに慣れています。明らかに、これは JavaScript ではうまく機能しません。

助けと提案をありがとう。

更新: ツールの最終バージョンはこちら: http://www.lock5stat.com/statkey/index.html

0 投票する
2 に答える
2728 参照

c - 非同期 C API 設計のベスト プラクティス

いくつかの機能用に C API を設計しようとしていますが、公開された機能には時間がかかる可能性があるため、非同期にしたいと考えています。ブロッキング API の使用は、API のユーザーが多くの同時呼び出しを行う必要があるため、おそらくお勧めできません。

非同期操作が完了したことをユーザーに通知できるようにインターフェイスを設計する正しい方法は何ですか?

いくつかの異なるアプローチを考えることができますが、これに関するベスト プラクティスを認識しているとは言えません。同様の API を使用した経験のある人はいますか?

この例では、回答を含む int を返すことを意図しています。

コールバック関数:

ポーリング:

プラットフォーム固有のイベント キュー

通常、この API のユーザーはイベント駆動型であるため、以下のような設計はおそらく適切ではありません。

先物:

プラットフォーム固有の「先物」/イベント:

0 投票する
2 に答える
1901 参照

c - バイト数と文字数

一部の API では文字数が必要です。

また、一部の API ではバイト数が必要です。

関数またはデータ構造を設計するとき、cb または cch をどのように決定しますか? なぜ?
呼び出し元の API をより適切に設計するには、これについて何を知っておく必要がありますか?