2016-05-11 11 views
0

all!私は次の問題に直面している。いくつかの空き領域がある場合、タイプRoomの例オブジェクトのための新しいリストを作成しなければならない方法を考えてみましょうか、そうでないタイプRoomConflictのリストオブジェクトを返すので、擬似コードは、次のようになります。いくつかの条件によって異なるメソッドを返すc#

どう
public [some type] CreateRooms(){ 
if(there is some space){ 
    return new List<Room>(){new Room(), new Room()}; 
} 
else{ 
    return new List<RoomConflict>(){new RoomConflict(), new RoomConflict()} 
}} 

そのような方法を作成するには? objectdynamicタイプを使用する必要がありますか。またはKeyValuePair<List<Room>,List<RoomConflict>>か、使用されていないパラメータにnullを渡します。どのような解決策が良いですか?

+1

ベースクラスまたはインターフェイスを作成して返すことができます。 – Sybren

+0

'RoomConflict'は' Room'から継承していますか?あるいは、それらが同じ 'インターフェース 'か、同じ'基本クラス'から継承していますか? –

+0

私は[抽象ファクトリ](http://www.dotnet-tricks.com/Tutorial/designpatterns/4EJN020613-Abstract-Factory-Design-Pattern---C)のデザインパターンを見ていきます。 –

答えて

1

行いRoomRoomConflictの両方をチェックnullを使用してスコットの答えを実証するために、いくつかの共通のインターフェイスを実装する?つまり、呼び出し元は結果をIRoomとしてキャストし、返されたオブジェクトは実際にはRoomRoomConflictかどうかを知ることなく使用できますか?答えがいいえの場合、答えはあなたがやっていることをやろうとしないことです。

誰かがメソッドを呼び出すと、結果がどのタイプであるかを調べる必要はありません。たとえば、誰かがメソッドを呼び出して結果を取得し、返されたオブジェクトがRoomまたはRoomConflictであるかどうかを確認する必要はありません。強く型付けされたプログラミングの要点は、それをする必要がないということです。

これらのクラスの使い方を知らなくても、利用可能な部屋がある場合はリストを返し、利用可能な部屋がない場合は空のリストを返すことをおすすめします。この方法では、メソッドは常にList<Room>を返し、存在しない場合はリストが空になります。

RoomConflictRoomConflictとの取引は、異なる方法または異なるクラスにする必要がありますどのような機能が、おそらくその後、完全に異なるオブジェクトである場合。学習するベストプラクティスの1つは、各クラスに1つの責任を負わせ、1つのクラスまたは1つのメソッドを無関係なものにすることを試みないことです。

+0

ええ、私はまた、これは非常に良いアプローチではないと思っているが、あなたはそれをより明確にする:) –

1

メソッドを呼び出すコードが知っている場合、どのクラスが返されるかはジェネリックの使用を検討できます。そうでない場合は、平文Objectを使用するか、両方のタイプを保持できるラッパークラスを作成します。そのうちの1つはnullです。

しかし、正しい解決策は、メソッド内の条件をチェックし、RoomConfictを返すメソッドまたはRoomを返すメソッドを呼び出すメソッドを呼び出すコードに条件を設定することだと思います。

0

代わりRoomConflictクラスを作成するの競合がある場合に、特定のコンテキストに基づいて、私はnullを返すことをお勧め..

次に、あなただけのnull

EDITを処理する必要があるもの取り扱うその後、チェックしている可能性が:ちょうど

void BuildHouse() 
    { 
     List<Room> rooms = CreateRooms(); 
     foreach (Room room in rooms) 
     { 
      if(room != null) 
      { 
       //paint room 
      } 
      else 
      { 
       //expand lot 
      } 
     } 
    } 
+0

矛盾した 'Rooms'を表示するので、これが必要です –

+0

'CreateRooms'を呼び出す人は' null'チェックでこれを行うことができます。 –

+0

@IhorKorotenko私の編集を参照してください。うまくいけば助けられるかもしれない –

0

dynamicタイプのうち、objectの中からお選びください。このメソッドの呼び出し元によって異なります。

dynamicは実行時に型をバインドしますが、コンパイル時のチェックとオブジェクト型への戻り型のボクシング(追加操作)は行います。どちらの場合も、呼び出し元は戻り値の型を評価して戻り値の型をキャストする必要があります。

0

私が通常このような状況を処理する方法は、成功を含む応答タイプを作成し、成功した場合は値を返し、成功しなかった場合は理由を作成します。だからあなたの場合のために、それは次のようになります。

public class RoomRequestResult 
{ 
    public bool Success { get; set; } 
    public Room ResultValue { get; set } 
    public RoomConflict FailureReason { get; set; } 
} 

をそれでは、あなたの戻り値の型はIEnumerable<RoomRequestResult>だろうし、得られたコレクションの各要素は、自己記述になります。

関連する問題