CodeReviwe – بهینه سازی کدهای مرتبط با افزودن تگ به پست
یکی از بخش های اصلی در روند تولید نرم افزار و نگهداری آن، بازبینی کدهای نوشته شده می باشد.
جدول های زیر را در نظر بگیرید، که جدوول NewsItem,BlogPost با جدول Tag رابطه ی چند به چند دارند .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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>(); } } |
در ابتدا کدهایی که برای این قسمت نوشته شده بود در بخش درج خبر جدید به صورت زیر بوده است :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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); } |
و همچنین برای قسمت به روز رسانی خبر از کدهای زیر استفاده شده بود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 را به صورت زیر تعریف میکنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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); } } |
و حال کدهای مربوط به درج را به صورت زیر بازنویسی می کنیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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); } |
و همچنین برای بروز رسانی داریم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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); } |
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.