基于条件逻辑(C#)返回具有不同范围的对象

时间:2015-07-17 12:02:08

标签: c#

我现在已经是一名开发人员(也是专业人士),并且从未专注于清洁/结构良好的代码。完全自学成才,我想我错过了一些基础知识。阅读书籍永远不会填补空白。所以我希望从这篇文章中获得一些很好的经验。

所以到目前为止,我有一个基于条件逻辑返回对象(Campaign)的方法。

如果我可以通过" CampaignViewMode"来获取对象。然后它一定是"观看"因此GET ELSE最后插入

  • 1,获取最近查看过的(Cookie)
  • 2,其他只是获得最后一次插入。

非常基本,但代码有严重的代码味道" (重复)。在一个理想的世界里,我想删除条件。

  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;
    }

你能否指出我正确的方向去除条件或最后减少"气味" ?

非常感谢您的时间!

此致

1 个答案:

答案 0 :(得分:1)

这里有很多事情要做。这就是我要做的事。

  1. 不要新建实例(就像使用存储库一样)。反对摘要(IRepository)的代码,它由注入类构造函数的DI容器提供。

  2. 删除将您的数据模型映射到您返回的模型的重复项(选择(x =>新的Campaign())。将其作为一种方法或单独的责任完全提取出来。

  3. 删除巨大的嵌套if(user!= null)。请事先检查一下,如果为空则返回。

  4. 重构接口(IGetCampaigns)后面的两个提取操作并创建两个类;获取最新插入的一个,以及获取最后一个已查看/工作的一个。将一个注入另一个以形成装饰链,由DI容器连接。

  5. 如果你不熟悉这些概念,可能会有很多东西;如果你愿意的话,很高兴通过这个离线。