質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

3813閲覧

C#でclassを作成する際、全てのclassでinterfaceを継承するようにして駄目でしょうか?

super_hogehoge

総合スコア29

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/12/15 10:10

###前提・実現したいこと

いつもお世話になっております。
C#の設計周りについて教えてください。

最近設計の本を読み、SOLIDの原則等を知りました。
・依存関係逆転の原則
・インターフェース分離の法則
等を踏まえた結果、全てのclassに対して予めインターフェースを作っておけば
良いのでは無いか?という疑問を持ち始めました。

以下に具体例を書きます。
###具体例

C#

1public class Hoge : { 2 public void huga() { /**/} 3}

というclassを作ろうとした際、予め

C#

1public interface Huga 2{ 3 void huga(); 4} 5 6public class Hoge : Huga{ 7 public void huga() { /**/} 8}

のように全classに対してinterfaceを用意する

###考え

classの関数を呼ぶ場合はinterfaceを介して呼ぶことにより
処理を実装ではなく抽象に依存させることになってより再利用性の高いコードに
なるのでは?と思いました。

さらにもし「全classにinterfaceを用意する」というルールに問題が無いようでしたら
classを実装するたびに「このclassはinterfaceを用意したほうが良いのかな?要らないのかな?」
と迷わなくてすみ、考えることが一つ減って楽だなと思いました。

ダラダラと書きましたが、どのサイトを見ても設計の際 「設計が煩雑になるためinterfaceの乱用は避けよ」

的な注意書きが有るため私のアイディアが間違っているのだとは思うのですが
いまいちなぜこの考えがまずいのかが腑に落ちません。

非常に稚拙な質問で申し訳ありませんが、interfaceについての指針のような物を
いただけると非常に助かります。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

そのようなモデルが無いわけではありません。
COM はインターフェースを通じて公開されます。
つまり公開された COM オブジェクトはそのオブジェクトに対応したインターフェースを持ちます。

ただし、「公開された」という注釈がつきます。
内部ではインターフェースのない非公開のオブジェクトを使っていると思われます。

インターフェースは他者に対して公開するものです。
そのメソッドとプロパティはすべて public です。

オブジェクト指向プログラミングにおいて隠蔽は重要な意味を持ちます。なんでもかんでも公開すればいいわけではありません。
これは何でもかんでも全てインターフェースをつけるべきではないという考えに繋がります。

投稿2017/12/15 11:34

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

全てのclassに対して予めインターフェースを作っておけば良いのでは無いか?

インターフェイスは異なるコード間で交わされる契約、すなわちあるクラスがそのインターフェイスを継承していることを宣言していれば、そのクラスのクライアントはインターフェイスで定義されているすべてのメソッドが確実に実装されていることが保証される・・・ということから、その考え方はいかがなものかと思うのですが。

投稿2017/12/15 10:35

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

YAGNI(You ain't gonna need it)という言葉があります。

第三者に公開するライブラリで、事前に公開インターフェースを実クラスと切り離したいとか、すでにインターフェースに対応するクラスが複数あるとか、そういう状況でない限り、インターフェースの抽出は必要になってからやっても遅くありません。

そして、パブリックな部分の動作さえ変えなければ、クラスのままでも内部のリファクタリングは問題なく行えます。アクセス制御をきちっと考えるのが先決です。

インターフェースはカプセル化のためのものではなく、ポリモーフィズムのためのものです。

投稿2017/12/15 10:32

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問