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

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

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

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

Q&A

解決済

3回答

3067閲覧

【c#】インターフェースの使い方

syogakusya

総合スコア67

C#

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

0グッド

0クリップ

投稿2016/10/18 03:58

編集2016/10/18 11:45

###質問
以下のようなインターフェースの使い方がおかしくないかを教えてください。
いろんなクラスをnewするときに各クラスのコンストラクタに設定値を渡しているコードです。

###該当のソースコード

C#

1class A 23 IAInitializer a; 4 5 public A(IAInitializer a) 67 this.a = a; 8910 11interface IAInitializer 1213 public int ConfigurationValue1{get;1415 16 17 18// 同じようなB,Cクラスと初期設定値クラス 19//class B... 20//class C... 21 22class ABCUser 2324 public ABCUser(AppWholeConfig cof) 2526 var a = new A(cof); 27 var b = new B(cof); 28 var c = new C(cof); 293031 32// appconf,DBの設定テーブル内のデータ等アプリで使う全ての設定値 33class AppWholeConfig : IAInitializer,IBInitializer,ICInitializer 3435 public int ConfigurationValue1{get;36 37 // IB,ICInitializerの実装 38 // public string .... 3940 41 42

いままではA,B,CクラスそれぞれのためにAInitialize,BInitialize,CInitializeクラスを定義し、それとは別にAppWholeConfigクラスを作って各クラスをnewするときに必要な設定値クラスのインスタンスをつくっていたのですが、上記のようにひとつのクラスにインターフェースをたくさん実装してさまざまな設定値として使う方法を思いつきました。
このやり方がバッドプラクティスでないなら、楽なのでこのやり方を活用していきたいです。不安に思ったのはなんとなくA.aの参照インスタンスの実際の型はAppWholeConfigで、そこにはBクラスやCクラスの設定値も含まれているということです。なんとなく慣れないため、是非がわかりません。

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

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

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

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

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

KSwordOfHaste

2016/10/18 06:02

質問されるということはどこかに不安要素があると思いますがそれを書くべきです。そうすればより明快な回答が得られると思います。
syogakusya

2016/10/18 11:49

ご指摘ありがとうございます。加筆致しました。
guest

回答3

0

ベストアンサー

正直あまりいい書き方、というかあまり意味のある書き方ではないのかなと思います。
やりたいことに対して手間だけがかかっている印象です。

前の回答者様の回答を見た上での回答なのでちょっとずるいですが、
質問者様のやりたいことを実現したいなら単に全ての設定の情報を持たせたクラスを一つ作ればいいだけだと思います。で、どこからでも使えるようにシングルトンとして実装するといいかもしれませんね。

C#

1public sealed class AppWholeConfig 2{ 3 private static AppWholeConfig instance = new AppWholeConfig(); 4 public static AppWholeConfig Instance { 5 get { 6 return instance; 7 } 8 } 9 10 private AppWholeConfig() 11 { 12 ConfigurationValue1 = 1; 13 } 14 15 public int ConfigurationValue1{get;set;} 16 public string Path1 {get;set;} 17} 18 19 20///使い方 21int data1 = AppWholeConfig.Instance.ConfigurationValue1; 22AppWholeConfig.Instance.Path1 = @"C:\Work";

投稿2016/10/19 01:32

編集2016/10/19 01:50
ishi9

総合スコア1294

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

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

syogakusya

2016/10/19 01:58

それだとA,B,Cクラスから見えなくてよいものが見えてしまうので掲題のようにしてみました。
guest

0

こんにちは。

AとAInitialize, B, Cの関係はどういった関係なのですか。
コンストラクタでインターフェースで受け取る形は多くはDI的に使いたい場合だと思うのですが、AppWholeConfigとしてまとめることでそれが崩れたりはしないのですか。

単一クラスとして依存性が排除されているのであれば問題ないかもしれませんが、いずれにせよそれぞれのオブジェクトの関係性に注目したほうが良いと個人的には思います。

投稿2016/10/18 16:09

Tak1wa

総合スコア4791

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

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

syogakusya

2016/10/19 00:09

私自身開発は初心者で、また業務としても小規模なシステムばかりを1〜2人で作っていて、要件が決まったら内部設計や外部設計もなくいきなり見切り発車でプログラムやデータベースを作っていくようなら感じです。(そういった概念は資格の勉強などで初めて知りました。) なのでインターフェースの設計とかDIとかオブジェクトの関係性とか依存性とかいったことがいまいちピンときません。 インターフェースを使えば個別に設定値クラスを作らなくてもいいから楽だと思っただけでした。 たとえばAクラスはDBサーバーからデータを受け取るクラスで、DB接続情報や受信間隔などの設定値が必要です。BクラスはDBから受け取ったデータをファイルに出力するクラスで、ディレクトリやファイル名が必要です。CクラスはBクラスが作った過去のファイルを削除するクラスで、ディレクトリや作成されてからファイルが削除されるまでの期間などが必要です。 なのでいままでのやり方でいけばAInitializeはDB接続情報や受信間隔のフィールド(プロパティ)があるだけのPOCOで、BInitialize、CInitializeなども同様にPOCOです。 ABCUserクラスで個別にA,B,CInitializeクラスのインスタンスを生成し、A,B,Cクラスのコンストラクタに渡します。
syogakusya

2016/10/19 02:07

すみません、もっと意見を聞きたかったのですが操作ミスでベストアンサーを決定してしまいました。 意見は引き続き募集してますので、よろしければお願いします。
guest

0

つたない回答かも知れませんがご容赦を・・・どういう点を気にされているか最初よりわかってきたのですが、まだ抽象的な気がします。

一般論としてはIA,IB,ICを個別なインターフェースとして設計するということは「別のもの」という気がするのでそれらをMIXしたインターフェースが設計上破たんする危険があるかどうかによると思います。例えば「多重継承は注意して使わないと違う意味のものの名前が衝突したとき破たんする」という問題がありますね?IA,IB,ICが多数の初期化情報を提供していてそれらが別々の人によって設計されるという状況なのだとしたら、IA設計者がIB,ICのメンバーを意識したくないので最終的にIABCに統合するよといわれてもあまりうれしくない気がします。

一方でIA,IB,ICがどういったものとなるか一人の設計者の頭のなかで十分に整理可能なくらいの十分小さなものであれば統合しても別にかまわないだろうとも思えます。しかしもしそうならIA,IB,ICと別にする必要もなく最初からIABCを設計すればいいような気がします。

いいかわるいかあえていえば個人的にはあまりよくない気がしました。とはいえ機能の断片をインターフェースとしてそれをMIX-INするといった用途は普通にあるので質問者さんの目的がそういったものならばよくないとはいえない気もしました。

一般論ではなく「これこれの機能をIA,IB,ICにもたせたんだけどどうだろう」という問いのほうがいいかも知れません。

投稿2016/10/18 12:32

KSwordOfHaste

総合スコア18392

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

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

syogakusya

2016/10/18 12:59 編集

回答ありがとうございます。 実装したいインターフェースのメンバの名前が被った場合についてですが、それはインターフェースの明示的な実装とかそういった問題ではないですか? 単純にメンバの名前が被るというだけなら、明示的な実装を行うことで解決できるかと思うのですが、意味が違いますか?
KSwordOfHaste

2016/10/18 14:10

そういう意味です。回避できますが回避をきにしなくてよい選択肢があれば自分はそちらを好むという程度の話です。バッドプラクティスとまでは思いません。程度次第でどっちにも倒れる話だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問