CodeReviwe - بهینه سازی کدهای مرتبط با افزودن تگ به پست

 جدول های زیر را در نظر بگیرید، که جدوول NewsItem,BlogPost با جدول Tag رابطه ی چند به چند دارند .

 public class Tag:BaseEntity
{
    public string Name { get; set; }
    public virtual ICollection<Blog.BlogPost> BlogPosts { get; set; }
    public virtual ICollection<News.NewsItem> NewsItems { get; set; }

}
 public class BlogPost : BaseContent, IAuditable
    {
    public virtual ICollection<Tag> Tags { get; set; }
}


public class NewsItem : BaseContent, IAuditable
    {
    public virtual ICollection<Tag> Tags { get; set; }

    public NewsItem()
    {
        Tags = new List<Tag>();
    }
}

در ابتدا کدهایی که برای این قسمت نوشته شده بود در بخش درج خبر جدید به صورت زیر بوده است :

 public void Insert(AddNewsItemViewModel newsItemViewModel)
    {
        if (newsItemViewModel == null)
            throw new ArgumentNullException("newsItem");

        var model = Mapper.Map<NewsItem>(newsItemViewModel);

        if(newsItemViewModel.Tags.Any()) // Tags is `string[]`
        {
            var listOfActualTags = _tagService.GetTagsByName(newsItemViewModel.Tags); // return List<Tag> 
            var listOfActualTagNames = listOfActualTags.Select(x => x.Name.ToLower()).ToList();

            foreach (var tag in newsItemViewModel.Tags)
            {
                if (!listOfActualTagNames.Contains(tag.ToLowerInvariant().Trim()))
                {
                    Tag tagModel = new Tag { Name=tag};
                    _tagService.Insert(tagModel);
                    model.Tags.Add(tagModel);
                }
            }

            model.MetaKeywords =string.Join(",",newsItemViewModel.Tags);
        }
        _uow.MarkAsAdded(model);
    }

و همچنین برای قسمت به روز رسانی خبر از کدهای زیر استفاده شده بود :

 public void Update(EditNewsItemViewModel newsItemViewModel)
    {
        if (newsItemViewModel == null)
            throw new ArgumentNullException("newsItem");
        var model = GetById(newsItemViewModel.Id);
        model = Mapper.Map(newsItemViewModel, model);
        if (model.Tags != null && model.Tags.Any())
            model.Tags.Clear();

        var listOfActualTags = _tagService.GetTagsByName(newsItemViewModel.Tags); // return List<Tag>
        var listOfActualTagNames = listOfActualTags.Select(x => x.Name.ToLower()).ToList();

        foreach (var tag in newsItemViewModel.Tags)
        {
            Tag tagModel = new Tag { Name = tag };
            if (!listOfActualTagNames.Contains(tag.ToLowerInvariant().Trim()))
            {

                _tagService.Insert(tagModel);
                model.Tags.Add(tagModel);
            }
            else
                model.Tags.Add(tagModel);
        }

        model.MetaKeywords = string.Join(",", newsItemViewModel.Tags);

        _uow.MarkAsChanged(model);
    }

مشکل اساسی که در این کدهای دیده می شود ، کدهای مرتبط با به روزرسانی و افوزدن تگ ها می باشد ، همین کدهایی که برای درج و به روز رسانی تگ ها نوشته شده است باید برای جدول BlogPost هم تکرار شود که کیفیت کار را پایین می آورد ، در ادامه سعی میکنیم این کدها را تا حدودی بهینه کنیم .برای این منظور ابتدا در یک کلاس (در اینجا TagService)  ، متدAddTagToInsert را به صورت زیر تعریف میکنیم :

public void AddTagsToList(ICollection<Tag> tagList, string[] tagNames)
{
  var listOfActualTags = GetTagsByName(tagNames);

  foreach (var tagName in tagNames)
  {
    var tag = listOfActualTags.FirstOrDefault(t => t.Name == tagName);

    if (tag == null)
    {
      tag = new Tag { Name = tagName };
      Insert(tag);
    }

    tagList.Add(tag);
  }
}

و حال کدهای مربوط به درج را به صورت زیر بازنویسی می کنیم :

public void Insert(AddNewsItemViewModel newsItemViewModel)
{
  if (newsItemViewModel == null)
    throw new ArgumentNullException("newsItem");

  var model = Mapper.Map<NewsItem>(newsItemViewModel);

  if(newsItemViewModel.Tags.Any())
  {
    _tagService.AddTagsToList(model.Tags, newsItemViewModel.Tags);

    model.MetaKeywords = string.Join(",", newsItemViewModel.Tags);
  }

  _uow.MarkAsAdded(model);
}

و همچنین برای بروز رسانی داریم :

public void Update(EditNewsItemViewModel newsItemViewModel)
{
  if (newsItemViewModel == null)
      throw new ArgumentNullException("newsItem");
  var model = GetById(newsItemViewModel.Id);
  model = Mapper.Map(newsItemViewModel, model);
  if (model.Tags != null && model.Tags.Any())
    model.Tags.Clear();

  if(newsItemViewModel.Tags.Any())
  {
    _tagService.AddTagsToList(model.Tags, newsItemViewModel.Tags);

    model.MetaKeywords = string.Join(",", newsItemViewModel.Tags);
  }

  _uow.MarkAsChanged(model);
}

یکی از کارهای اساسی و مهم در روند توسعه یک پروژه ، بازبینی کدهای نوشته شده و بهبود کیفیت آنها می باشد ، که باید به این مسئله توجه زیادی نمود .


توسط : عثمان رحیمی  3 ماه قبل ، یکشنبه 1 مرداد 1396 ساعت 00:34  0  217

نظر شما برای ما مهم است و به ما در بهبود سایت کمک میکند.


ارسال نظر
  • نام (اختیاری ) :
  • پست الکترونیک :
  • توضیحات :

مطالب مرتبط