タグ付けされた質問 「interfaces」

インターフェイスへのプログラミングなど、インターフェイスに関連する設計上の考慮事項に関する質問。

4
インターフェースまたはクラスを返す
メソッドがあるとしましょう public List<User> GetBatchOfUsers(IEnumerable<int> userIDs) { List<User> users = new List<User>(); // some database stuff return users; } を返すのではなく、インターフェイス(IListまたはのいずれかIEnumerable)を返す方がよいことを読みましたList。私がそうすることについて聞いたいくつかの議論は、それがデータを隠すことであり、API開発者に後日データの内部表現を変更する柔軟性を与えます。 を返すだけの私の懸念IEnumerableは、ランダムアクセスやCountプロパティなどの機能を失うことです。 IEnumerableメソッドとして動作するための最小限の要件である、メソッドにデータを送信するための最高の柔軟性を消費者に与えるため、パラメーターとしてを受け入れることには意味があることを知っています。 戻り値型のベストプラクティスは何ですか?
9 c#  interfaces  class 

1
暗黙的インターフェイスと明示的インターフェイス
コンパイル時のポリモーフィズムと実行時のポリモーフィズムの実際の制限を理解していると思います。しかし、明示的なインターフェイス(実行時の多態性、つまり仮想関数とポインタ/参照)と暗黙的なインターフェイス(コンパイル時の多態性、つまりテンプレート)の概念的な違いは何ですか。 私の考えでは、同じ明示的インターフェースを提供する2つのオブジェクトは同じタイプのオブジェクトである(または共通の祖先を持っている)必要がありますが、同じ暗黙的インターフェースを提供する2つのオブジェクトは同じタイプのオブジェクトである必要はありません。両方が提供するインターフェースは、まったく異なる機能を持つことができます。 これについて何か考えはありますか? また、2つのオブジェクトが同じ暗黙のインターフェイスを提供する場合、これらのオブジェクトがそのインターフェイスを宣言する基本オブジェクトから継承しないようにする理由(仮想関数ルックアップテーブルなどの動的ディスパッチが不要であるという技術的な利点以外)それを明示的なインターフェースにしていますか?別の言い方をすると、同じ暗黙のインターフェースを提供する(したがって、サンプルテンプレートクラスの型として使用できる)2つのオブジェクトが、そのインターフェースを明示的にする基本クラスから継承しないようにできますか? 関連する投稿: https://stackoverflow.com/a/7264550/635125 https://stackoverflow.com/a/7264689/635125 https://stackoverflow.com/a/8009872/635125 この質問をより具体的にする例を次に示します。 暗黙的なインターフェース: class Class1 { public: void interfaceFunc(); void otherFunc1(); }; class Class2 { public: void interfaceFunc(); void otherFunc2(); }; template <typename T> class UseClass { public: void run(T & obj) { obj.interfaceFunc(); } }; 明示的なインターフェース: class InterfaceClass { public: virtual void …

3
Ruby(またはその他の動的言語)のインターフェイスの代わりに何を使用できますか?
私の目標は、クラス間のコントラクトを定義することです。 私はダックタイピングとすべてが好きですが、アプリケーションの異なるレイヤー間のインターフェースを定義して、外部から呼び出すメソッドと、他のレイヤーで使用してはならないアクセサリメソッドを明確に定義したいです。 たとえば、Javaでは、get()やsave()などのメソッドを使用してPersistorインターフェースを定義してから、データベースで永続化する必要のあるすべてのメソッドを使用してJdbcPersistorクラスを定義できます。また、リモートレストサーバーに保存するための他の方法を備えた別のRestPersistorもあります。 Rubyでインターフェイスを要求するのではなく、この区別を維持するためのきちんとした方法があるかどうかを確認するだけです。私はRubyが好きですが、Rubyを使用する小規模なプロジェクトにのみ取り組みました。

1
多層プロジェクトでは、インターフェイスをどこに定義する必要がありますか?
3つのサブプロジェクト(データアクセスプロジェクト、ビジネスロジックプロジェクト、プレゼンテーションプロジェクト)で構成される多層プロジェクトがあります。インターフェイスをどこに定義すればよいですか?DALとBLLの両方で定義されたインターフェイスがあるはずだと思います。インターフェイスに基づく「テスト」データを使用してビジネスロジックレイヤーをテストする状況では、おそらく、インターフェイス? これをどのように配置すべきかに関するベストプラクティスまたはアイデアはありますか?

2
オプション機能:デフォルトのメソッドまたは分離されたインターフェース
専用インターフェースは、ドメイン固有のタイプ階層でオプション機能を公開するための良い方法のようです。ただし、これらはデコレータおよび複合パターンの使用を妨げます。これは、この種の階層でも一般的です。 特に、おそらくこれらのインターフェイスの可能な組み合わせごとにデコレータ/コンポジットを実装する必要はないでしょう。そのため、多くの場合、すべてのオプションのインターフェイスを実装し、型チェックを使用して呼び出しを選択的に転送します。これにより、インターフェイスを分離する目的が損なわれます。 Javaコレクションフレームワークが使用する別の方法は、すべての操作を基本型に含め、それらをダミーの実装で埋めることです。Java 8のデフォルトメソッドは、この使用をさらに容易にします。 ある意味で、これは、データベースの世界では、null許容列の議論のように感じられます。より実用的な後者のアプローチに対して強い議論はありますか?

4
インターフェイスの拡張メソッドをinterface.csファイルに含める必要がありますか?
この設定を想像してください: public interface IMass{ double Mass {get;} } public static class IMassExtension { public static double ToKg(this IMass massObject) { return massObject.Mass / 1000.0; } public static double CalculateInteractiveGravity(this IMass massObject, IMass otherMassObject) { return blah; } } 拡張クラスをインターフェースと同じファイル(つまり、IMass.cs)に配置してもよいですか、それとも別のファイル(IMassExtension.cs)に配置する必要がありますか? ここでは基本クラスは使用できません。想像してみて public class Person : Animal, IMass {} そして public class …

7
インターフェイスの実装を強制して特定の方法で動作させる方法
次のインターフェースがあるとします public interface IUserRepository { User GetByID(int userID); } ユーザーが見つからない場合、このインターフェイスの実装者に例外をスローさせるにはどうすればよいですか? コードだけで行うことは不可能だと思うので、意図した動作を実装するように実装者にどのように強制しますか?コード、ドキュメントなどを通じてですか? この例では、具体的な実装により、 UserNotFoundException public class SomeClass { private readonly IUserRepository _userRepository; public SomeClass(IUserRepository userRepository) { _userRepository = userRepository; } public void DisplayUser() { try { var user = _userRepository.GetByID(5); MessageBox.Show("Hello " + user.Name); } catch (UserNotFoundException) { MessageBox.Show("User not found"); …

4
「プライベート」インターフェースの使用例?
インターフェイスがクラスのパブリックプロパティと関数を定義する方法と同様の方法で、クラスの特定の内部プロパティと関数を適切に定義できる有効なユースケースがあるかどうか疑問に思いました。 人間を説明するクラスを構築する必要があるタスクを想像してみてください。 明らかに、各人間はヒューマノイドクリーチャーですが、すべてのヒューマノイドクリーチャーが人間であるとは限らないため、おそらく次のような機能を持つインターフェースIHumanoidがあります(ボディプランをクラスにハードコードすることは役に立たないため)。 public interface IHumanoid { function get head():IHead; function get torso():ITorso; function get leftArm():IArm; function get rightArm():IArm; function get leftLeg():ILeg; function get rightLeg():ILeg; } さらに、そして明らかに、各人間は哺乳動物ですが、すべての哺乳動物が人間であるとは限らないため、どこかに浮かぶ男性と女性の2つの定義を持つ別のインターフェイスIMammalがおそらくあります。 public interface IMammal { function procreate(partner:IMammal):void; } public interface IMaleMammal extends IMammal { function inseminate(female:IFemaleMammal):void; } public interface IFemaleMammal extends IMammal { function …

11
インターフェースがメンバーよりもメソッドを必要とするのはなぜですか?
...これにより、ゲッターとセッターを作成する必要が生じますが、実際にはまったく無関係です。ほとんど(すべて?)の言語のインターフェイスで、メンバーフィールドがインターフェイス仕様を満たすことを許可しないのは、言語設計上の理由がありますか? ほとんどの現存する言語では、メンバーはメソッドとは根本的に異なる方法で扱われますが、これは当てはまりますか?理論的な言語では、(a)引数なしのメソッドをゲッターとして指定し、読み取り可能なメンバーをそのインプリメンターとして受け入れ、(b)単一引数のメソッドをセッターとして指定したが受け入れられたインターフェイスはありませんでしたか?変数の宣言時に変数への直接アクセス制御の指定をサポートする言語が与えられた場合、その実装者としての書き込み可能なメンバーフィールド 複数の継承を許可するプロトタイプ言語(一部の回答者が作成した非常に有効なポイントに対処するため)は、このようなものに最適です。 このようなものがすでに存在する場合はお知らせください。

3
テキストユーザーインターフェイス(TUI)はどのように機能しますか?
私は最近、古いCOBOLプログラムを移植するよう割り当てられました。GUIに慣れていて、TUIがどのように機能するのか理解できません。私はグーグルでたくさん検索しましたが、何も見つかりませんでした。 コンソールアプリケーションが行ごとに出力できることは知っていましたが、端末画面に色などをどのように描画しますか?このすべてがどのように描かれていますか?端末はどういうわけかそれをサポートしていますか?基準はありますか?私は本当に混乱しています。

5
ライブラリに求められる基本原則は何ですか?
プログラミング言語で好きな構文と機能について話します。ここで、お気に入りの(または任意の)言語のライブラリで、コアとなる原則または機能についてお尋ねしますか? 例として、リスト+ =リストエレメントのみを許可するのではなく、リスト+ = anotherListを追加することが有効です(ただし、これは悪い考えと見なされる場合もあります)。

3
前提条件の確認
私は、クライアントが設計上の契約の最後に留まっていることを保証する目的で、入力を検証するためのランタイムチェックを行うかどうかという質問に対する確かな答えを見つけたいと思っていました。たとえば、単純なクラスコンストラクターを考えます。 class Foo { public: Foo( BarHandle bar ) { FooHandle handle = GetFooHandle( bar ); if( handle == NULL ) { throw std::exception( "invalid FooHandle" ); } } }; この場合、ユーザーはFoo有効ななしでを作成しようとするべきではないと主張しますBarHandle。がコンストラクタのbar内部で有効であることを確認するのは適切ではないようですFoo。そのFooコンストラクタに有効な が必要なことを単純に文書化した場合BarHandle、それで十分ではありませんか?これは、契約による設計の前提条件を強制する適切な方法ですか? これまでのところ、私が読んだことはすべて、これについてさまざまな意見があります。50%の人がそれbarが有効であることを確認すると言うようですが、他の50%は私がそれをすべきではないと言っています。たとえば、ユーザーBarHandleが正しいことを確認したが、2番目の(そして不要な)チェックを行う場合を考えてください。もFooコンストラクタの内部で行われています。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.