簡體   English   中英

根據條件邏輯(C#)返回具有不同范圍的對象

[英]Return Object with different scope based on Conditional Logic (C#)

我作為開發人員(也是專業人士)已有一段時間了,但實際上從未專注於干凈/結構良好的代碼。 作為完全自學的人,我想我缺少一些基本知識。 看書永遠不會填補空白。 因此,我希望從這篇文章中獲得一些寶貴的經驗。

到目前為止,我有一個基於條件邏輯返回對象(廣告系列)的方法。

如果我可以通過“ 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. 不要更新實例(就像使用存儲庫一樣)。 針對DI的代碼(IRepository),該代碼由注入到類構造函數中的DI容器提供。

  2. 刪除將您的數據模型映射到您返回的模型的重復項(選擇(x => new Campaign())。將其作為方法或單獨的職責完全提取出來。

  3. 刪除巨大的嵌套if(user!= null)。 首先檢查此內容,如果它為null,則返回。

  4. 重構接口(IGetCampaigns)后面的兩個獲取操作,並創建兩個類。 一個獲取最新插入的內容,另一個獲取最近查看/處理的內容。 將其中一個注入另一個以形成裝飾鏈,並通過您的DI容器將其連接起來。

如果您不熟悉這些概念,可能會涉及很多東西。 如果您願意,很高興可以離線進行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM