私は以前にいくつかのコードをリファクタリングしていましたが、イテレータブロックの実装を知りました。クライアントがあるデータのためにextrernal APIを呼び出すシステムの統合レイヤーでは、APIから返されたデータを取得し、ロジックレイヤーで使用されるビジネスエンティティのコレクションに変換する一連のトランスレータを持っています。一般的な翻訳者クラスは次のようになります。イテレータブロックの正しい使い方
// translate a collection of entities coming back from an extrernal source into business entities
public static IEnumerable<MyBusinessEnt> Translate(IEnumerable<My3rdPartyEnt> ents) {
// for each 3rd party ent, create business ent and return collection
return from ent in ents
select new MyBusinessEnt {
Id = ent.Id,
Code = ent.Code
};
}
今日、私は次のコードを発見しました。ここでも、トランスレータクラスです。パラメータのコレクションをメソッドの戻り値の型に変換するのが目的です。しかし、この時には、反復子ブロックです:
// same implementation of a translator but as an iterator block
public static IEnumerable<MyBusinessEnt> Translate(IEnumerable<My3rdPartyEnt> ents) {
foreach(var ent in ents)
{
yield return new MyBusinessEnt {
Id = ent.Id,
Code = ent.Code
};
}
}
私の質問は:これは反復子ブロックの有効利用のですか?このようにして翻訳者クラスを作成することの利点はわかりません。これは予期しない動作を引き起こす可能性がありますか?
私には完全に妥当と思われます.2つのエンティティ間でコンパイルセーフな変換を行います。何が問題なの? –