我现在已经是一名开发人员(也是专业人士),并且从未专注于清洁/结构良好的代码。完全自学成才,我想我错过了一些基础知识。阅读书籍永远不会填补空白。所以我希望从这篇文章中获得一些很好的经验。
所以到目前为止,我有一个基于条件逻辑返回对象(Campaign)的方法。
如果我可以通过" 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;
}
你能否指出我正确的方向去除条件或最后减少"气味" ?
非常感谢您的时间!
此致
答案 0 :(得分:1)
这里有很多事情要做。这就是我要做的事。
不要新建实例(就像使用存储库一样)。反对摘要(IRepository)的代码,它由注入类构造函数的DI容器提供。
删除将您的数据模型映射到您返回的模型的重复项(选择(x =>新的Campaign())。将其作为一种方法或单独的责任完全提取出来。
删除巨大的嵌套if(user!= null)。请事先检查一下,如果为空则返回。
重构接口(IGetCampaigns)后面的两个提取操作并创建两个类;获取最新插入的一个,以及获取最后一个已查看/工作的一个。将一个注入另一个以形成装饰链,由DI容器连接。
如果你不熟悉这些概念,可能会有很多东西;如果你愿意的话,很高兴通过这个离线。