【发布时间】:2016-04-30 15:07:08
【问题描述】:
我有下面的代码,它在我的代码中的两个地方实现了我需要的逻辑。代码以通用方式编写。
它有一个缺陷。它不检查给定对象是否已存在于 collectionToBeExtended 中。它只是添加到它,我将有两次相同的项目。
我使用这段代码管理两个集合,一个包含标签,另一个包含链接实体 (POCO)。它们没有相同的父对象,也没有接口。为了管理下面的情况,我不想为他们介绍一个新的通用界面。
为了修复上面的缺陷,我需要在 foreach 中放置自定义逻辑来检查给定对象是否已经是集合的成员。 Tag 和 Entity 对象不同,所以比较有共同点。您可以在下面看到 Tag 实现。
DRY 原则清楚地表明我不应该创建确切的实现,而是应该创建一些通用的解决方案来处理这两种情况,或者第三种和第四种情况。我的第一个想法是,我引入了一个开关,我可以在其中放置基于对象类型的自定义逻辑,但 Martin Fowler 在他的 Refactoring 书中说,switch-cases 是有味道的区域。
我目前的知识和经验不足以解决这个问题,所以非常感谢任何帮助!
通用实现:
private ICollection<T> AddTo<T> ( IEnumerable<T> toBeAdded , ICollection<T> collectionToBeExtended )
{
if ( collectionToBeExtended == null )
{
collectionToBeExtended = new List<T> ( );
}
if ( toBeAdded != null )
{
foreach ( T obj in toBeAdded )
{
collectionToBeExtended.Add(obj);
}
}
return collectionToBeExtended;
}
标签实现:
private ICollection<Tag> AddTo ( IEnumerable<Tag> toBeAdded , ICollection<Tag> collectionToBeExtended )
{
if ( collectionToBeExtended == null )
{
collectionToBeExtended = new List<Tag> ( );
}
if ( toBeAdded != null )
{
foreach ( Tag tag in toBeAdded )
{
if (!collectionToBeExtended.Any(c => c.Id == tag.Id && c.Name == tag.Name))
{
collectionToBeExtended.Add(tag);
}
}
}
return collectionToBeExtended;
}
【问题讨论】: