5

次のクラスがあるとしましょう。

public class Ticket {
  public int Id { get; set; }
  public string Event { get; set; }
  ...
}

public class TicketService {
  public void acceptTicket(Ticket ticket) {
    ...
  }

  ...
}

私の質問は、チケットエンティティに関連する静的ヘルパーメソッド(サービスクラスのように状態を必要としない)を追加するのに最適な場所はどこですか?(これは、システム全体の他の多くのエンティティ/サービスの中で1つのエンティティ/サービスであることを覚えておいてください)。

今、私は次の可能性を考えています:

  1. 独自の.csファイルにTicketHelperという新しいクラスを作成します。
  2. 静的ヘルパークラスをTicketクラスに直接作成します
  3. Serviceクラスに直接静的Helperクラスを作成します
  4. 他のサービスメソッドと同じように、メソッドをサービスクラスに直接追加するだけです。
  5. ...これらよりも優れたソリューションですか?

わかりやすくするために、これが#2または#3の意味です。

public class TicketService {
  public void acceptTicket(Ticket ticket) {
    ...
  }

  ...

  public static class Helper {
    public static Dictionary<string, List<Ticket>> groupByName(List<Ticket> tickets) {
      // returns the map of name/tickets
    }
  }
}

この場合、APIは次のようになります。

Ticket ticket = new Ticket();
List<Ticket> tickets = new List<Tickets>();
TicketService service = new TicketService();
service.acceptTicket(ticket);

// leaving out the creation of a list of tickets...
var groups = TicketService.Helper.groupByName(tickets);
4

4 に答える 4

3

これには拡張メソッドを使用できます。TicketExtensionsそれらを別のクラスで作成します。

public static class TicketExtensions {
  public static Dictionary<string, List<Ticket>> groupByName(this List<Ticket> tickets) {
    // returns the map of name/tickets
  }
}

...

var ticket = new Ticket();
var tickets = new List<Tickets>();
var service = new TicketService();
service.acceptTicket(ticket);

// leaving out the creation of a list of tickets...
var groups = tickets.groupByName();

また、具体的なコレクション クラスよりもIEnumerable<T>IList<T>またはのようなインターフェイスを使用することをお勧めします。IDictionary<K, V>

于 2012-12-23T14:11:43.553 に答える
2

さらに別の可能性は、シングルトン パターンを使用することです。

次の利点があります。

  • インターフェイスを実装できる
  • 依存性注入シナリオでメソッドまたはコンストラクターに渡すことができるオブジェクトを提供する
  • 静的動作の提供
public interface ITicketHelper
{
    void HelpThis(Ticket t);
    IList<Ticket> HelpThat();
}

public class TicketHelper : ITicketHelper
{
    public static readonly TicketHelper Instance = new TicketHelper();

    private TicketHelper()
    { ... }

    public void HelpThis(Ticket t)
    { ... }

    public IList<Ticket> HelpThat()
    { ... }
}

使用法

 var result = TicketHelper.Instance.HelpThat();
于 2012-12-23T15:05:32.707 に答える
1

答えは、メソッドを呼び出すことを期待している人によって異なると思います。

個人的には、静的メソッドは複数のエンティティで機能するため、TicketServiceクラスに配置し、サービス自体に対してプライベートにします。

次に、サービスのインスタンスメソッドを作成して、サービスのすべてのコンシューマーに機能を公開します。これにより、APIがよりクリーンになり、静的メソッドであるかどうかの実装の詳細を知る必要がなくなります。

于 2012-12-23T14:02:45.693 に答える