問題タブ [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.
c++ - Windows API と GetClassName()? 別名?
GetClassName() と呼ばれるメンバーを持つ C++ の動的クラス システムを持つコードがいくつかあります。ただし、Windows ヘッダーを含む大規模なプロジェクトに含めると、すべてが崩壊しました。どうやら Windows は #define GetClassName (GetClassNameA または GetClassNameW) を使用してすべてを台無しにしてしまい、仮想コール ツリーがすべて台無しになり、暗闇の中で愚かなコンパイラ デバッグで 1 日を失い、何が間違っていたのかを突き止めようとしました。
したがって、#define にこのように恐ろしく衝突しやすい名前を使用したことで Microsoft をののしっていることに加えて (正直なところ、誰かがこれのために撃たれるべきだ!)、私は 3 つの目的を求めています。
- GetClassName() の別の適切な名前は何ですか?
- とにかくこれを修正する方法はありますか?将来的には、私のコード ベースの他の開発者が同様の運命に苦しむことはありません。
- そして後世のために、他の誰かがこの同様に不可解なエラーに遭遇したとき
c++ - 新しいメンバ関数を d ポインタ クラスに追加すると、バイナリ互換性が失われますか?
新しいメンバー関数を d ポインター クラス定義に追加すると、バイナリ互換性が失われますか?
たとえば、以下の新しい定義は、元の定義と比較してバイナリ互換性を壊しますか? (副次的な質問ですが、新しい .so が古い .so と比較してバイナリ互換性を損なうかどうかを教えてくれるツールはありますか? そうでない場合、手動で確認するにはどうすればよいですか?)
オリジナル:
新しい:
参考:ヘッダーではなく、ccファイルでdポインタークラスを指定する必要があることを理解しています。上記の例は、バイナリ互換性の問題に焦点を当てるために考案されました。
java - パッケージ外での Java クラスの直接拡張を禁止する
私はとのパッケージを持っています
そしてこれら
パッケージのユーザーには Player が必要ですが、パッケージを壊さずに使用するには、 Player を直接拡張しないようにする必要があります。代わりに、提供されているサブクラスの 1 つを拡張する必要があります。
質問: ユーザーが Player を直接拡張できないようにするにはどうすればよいですか?
この禁止が意図されていることを明らかにする方法を探しています。
java - 誰かが Java インターフェイスの可視性の選択を要約できますか?
私は本当に2つの質問があります:
1) パッケージ プライベート インターフェイスを使用するのはいつですか?
2)パッケージ外の実装のために閉じられたパブリックインターフェイスを持つ方法はありますか?
api - API がオーバーエンジニアリングされるのはいつですか?
私は、単純なことを単純にしない過度に設計された API を扱うことを嫌います。それにもかかわらず、私はオープンソース ライブラリの API の設計に取り組んでおり、オーバーエンジニアリングの罠に陥っていると感じ始めています。もちろん、私はひどいことを書いたので、確かに言うことはできません。したがって、それがどのように機能するかは、他の誰よりも私には明らかです。API が過度に設計されている可能性があることを示す、開発者の観点から見た警告サインにはどのようなものがありますか?
.net - DialogResultがWPFでnull許容ブール値であるのはなぜですか?
ダイアログの結果がWPFでnull許容のブール値であるという事実について、誰かが良い説明を思いつくことができますか?これはいつも私を困惑させてきました。WinFormsでは、それは列挙型であり、それは私にとってはるかに理にかなっています。
objective-c - ココアに欠けているものは何ですか?
ココアに何か追加できるとしたら、何を追加しますか? 大小を問わず、Cocoa に欠けていると思われる機能はありますか? フレームワークの省略のために、何度も発明しなければならなかった車輪があるのではないでしょうか?
objective-c - Objective-C メソッドはいつ定義しますか?
私は Objective-C を学んでおり、C/C++ のバックグラウンドを持っています。
オブジェクト指向 C++ では、親クラスで宣言されている場合でも、定義 (実装) する前に常にメソッドを宣言する必要があります。
手続き型の C、IIRC では、同じコンパイル単位 (つまり、同じファイル) 内の別のものからのみ呼び出される限り、関数を定義するだけで済みます。 「extern」を使用して他の場所で宣言しないでください)。
現在、Objective-C では、ヘッダー ファイルでセレクターを宣言する必要があるのは、セレクターが外部で使用される場合のみであり、.m ファイルでセレクターを作成して、それらを内部で呼び出すことができるようです。 .m ファイル。また、デリゲート メソッドまたは継承されたメソッドが (再) 定義されることはないようです。
私は正しい軌道に乗っていますか?Objective-C でセレクターを定義する必要があるのはいつですか?
objective-c - キーを予測可能な順序で格納する辞書構造に名前を付けますか?
注:私の特定のコンテキストはObjective-Cですが、私の質問は実際にはプログラミング言語の選択を超えています。また、誰かが文句を言うので「主観的」とタグ付けしましたが、個人的にはほぼ完全に客観的だと思います。また、この関連するSOの質問を知っていますが、これはより大きな問題だったので、これを別の質問にする方がよいと思いました。よく読んで理解せずに質問を批判しないでください。ありがとう!
私たちのほとんどは、選択した言語に応じて、キーと値の関連付けを格納する辞書の抽象データ型に精通しています。これをマップ、辞書、連想配列、ハッシュなどと呼びます。辞書の簡単な定義は、次の3つのプロパティで要約できます。
- 値はキーによってアクセスされます(配列のようなインデックスではなく)。
- 各キーは値に関連付けられています。
- 各キーは一意である必要があります。
その他のプロパティは、間違いなく、特定の目的のための便利さまたは専門分野です。たとえば、一部の言語(特に、PHPやPythonなどのスクリプト言語)は、辞書と配列の間の境界線を曖昧にし、辞書の順序を提供します。これは便利ですが、そのような追加は辞書の基本的な特性ではありません。純粋な意味では、辞書の実際の実装の詳細は関係ありません。
私の質問では、最も重要な観察事項は、キーが列挙される順序が定義されていないことです。辞書は、最も便利な順序でキーを提供する場合があり、必要に応じてキーを整理するのはクライアントの責任です。
自然にソートされた順序(オブジェクトの比較に基づく)や挿入順序など、特定のキーの順序を課すカスタム辞書を作成しました。前者にSortedDictionaryのいくつかのバリアント(実際にはすでに実装済み)という名前を付けるのは明らかですが、後者の方が問題があります。LinkedHashMapとLinkedMap(Java)、OrderedDictionary(.NET)、OrderedDictionary(Flash)、OrderedDict(Python)、およびOrderedDictionary ( Objective-C)を見てきました。これらのいくつかはより成熟しており、いくつかはより概念実証です。
LinkedHashMapは、Javaコレクションの従来の実装に従って名前が付けられています。二重リンクリストを使用して挿入順序を追跡するため「リンク」、HashMapをサブクラス化するため「ハッシュ」です。ユーザーがそれについて心配する必要がないという事実に加えて、クラス名は実際にはそれが何をするかを示していません。順序付きを使用することは既存のコード間のコンセンサスのように見えますが、このトピックに関するWeb検索でも、「順序付き」と「並べ替え」の間の理解できる混乱が明らかになり、同じように感じます。.NET実装には、明らかな誤称についてのコメントもあり、順序付けの特定のポイントでオブジェクトを取得および挿入できるため、代わりに「IndexedDictionary」にする必要があることを示唆しています。
フレームワークとAPIを設計していて、クラスにできるだけインテリジェントな名前を付けたいと思っています。私の見解では、インデックス付けはおそらく機能し(人々がそれをどのように解釈するかによって、また辞書の宣伝された機能に基づいて)、順序付けは不正確であり、混乱する可能性が非常に高く、 「すぐに」リンクされます(Monty Pythonに謝罪します) )。;-)
ユーザーとして、あなたにとって最も意味のある名前は何ですか?クラスが何をしているのかを正確に表す特定の名前はありますか?(必要に応じて、InsertionOrderDictionaryのような少し長い名前を使用することを嫌いではありません。)
編集:もう1つの強力な可能性(以下の私の回答で説明)はIndexedDictionaryです。ユーザーが特定のインデックスにキーを挿入したり、キーを並べ替えたりすることを許可しても意味がないため、「挿入順序」はあまり好きではありません。