[英]Return Object with different scope based on Conditional Logic (C#)
我作為開發人員(也是專業人士)已有一段時間了,但實際上從未專注於干凈/結構良好的代碼。 作為完全自學的人,我想我缺少一些基本知識。 看書永遠不會填補空白。 因此,我希望從這篇文章中獲得一些寶貴的經驗。
到目前為止,我有一個基於條件邏輯返回對象(廣告系列)的方法。
如果我可以通過“ CampaignViewMode”獲取對象,則必須已對其進行“查看”,因此,GET ELSE獲取最后插入的對象
很基本,但是代碼有嚴重的“代碼味道”(重復)。 在理想的世界中,我想刪除條件。
public Campaign GetDefaultCampaign()
{
Campaign campaign = null;
using (UserRepository userRepo = new UserRepository())
{
var user = userRepo.GetLoggedInUser();
if (user != null)
{
string campaignViewMode = "";
if (HttpContext.Current.Request.Cookies["CampaignViewMode"] != null)
{
campaignViewMode = HttpContext.Current.Request.Cookies["CampaignViewMode"].Value.ToString();
}
//Get Last worked on/viewed
campaign = _context.tbl_Campaign
.Where(x => x.Name == campaignViewMode & x.tbl_UserToCampaign
.Where(z => z.UserId == user.UserId & z.CampaignId == x.CampaignId)
.Select(u => u.UserId)
.FirstOrDefault() == user.UserId)
.Select(y => new Campaign()
{
CampaignId = y.CampaignId,
Name = y.Name,
WebName = y.WebName,
DateAdded = y.DateAdded
}).FirstOrDefault();
//Or get last inserted
if (campaign == null)
{
campaign = _context.tbl_Campaign
.Where(x => x.Name == campaignViewMode & x.tbl_UserToCampaign
.Where(z => z.UserId == user.UserId & z.CampaignId == x.CampaignId)
.Select(u => u.UserId)
.OrderByDescending(d => d.DateAdded).FirstOrDefault() == user.UserId)
.Select(y => new Campaign()
{
CampaignId = y.CampaignId,
Name = y.Name,
WebName = y.WebName,
DateAdded = y.DateAdded
}).FirstOrDefault();
}
}
}
return campaign;
}
您能為我指出消除條件的正確方向,還是最后減少“異味”?
完全感謝您的時間!
問候,
這里有很多事。 這就是我要做的。
不要更新實例(就像使用存儲庫一樣)。 針對DI的代碼(IRepository),該代碼由注入到類構造函數中的DI容器提供。
刪除將您的數據模型映射到您返回的模型的重復項(選擇(x => new Campaign())。將其作為方法或單獨的職責完全提取出來。
刪除巨大的嵌套if(user!= null)。 首先檢查此內容,如果它為null,則返回。
重構接口(IGetCampaigns)后面的兩個獲取操作,並創建兩個類。 一個獲取最新插入的內容,另一個獲取最近查看/處理的內容。 將其中一個注入另一個以形成裝飾鏈,並通過您的DI容器將其連接起來。
如果您不熟悉這些概念,可能會涉及很多東西。 如果您願意,很高興可以離線進行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.