我可以再重述我的代码吗?

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
大家好,

我创建了一个类 - 它有3个方法 - 我尝试了考虑所有因素的重构代码;但是,我不确定我的代码是否有更多的改进空间

因此寻求帮助审核我的代码并建议我任何改进方式;这样我就可以改善更多并以标准方式编码


Class File:
using Base;
using Config;
using Entities;
using JsonModel;
using Model.PaymentOptions;
using Repositories;
using System.Linq;

namespace Helpers
{
    public static class PaymentOptionsHelper
    {
        public static PaymentMethod[] checkoutGroup = { PaymentMethod.AdyenDropIn, PaymentMethod.PayPalDirect, PaymentMethod.Braintree, PaymentMethod.BankTransfer, };

        /// <summary>
        /// Below method will set the Payment Type based on the low priority type retrieved from DB
        /// </summary>
        /// <param name="testConfiguration"></param>
        /// <param name="siteId"></param>
        /// <returns></returns>
        public static PaymentOptions GetPaymentOptions_Auto(TestConfigurationCDO testConfiguration, int siteId)
        {
            var paymentOptionList = SitePaymentRepository.GetSitePaymentInfoBySiteId(
                testConfiguration,
                siteId);

            var lowestPriority = paymentOptionList.Min(x => x.Priority);
            var paymentAuto = paymentOptionList.FirstOrDefault(x => x.Priority == lowestPriority);

            PaymentOptions paymentOptions;

            switch (paymentAuto.PaymentType)
            {
                case PaymentMethod.PayPalDirect:
                case PaymentMethod.Braintree:
                case PaymentMethod.BankTransfer:
                case PaymentMethod.AdyenDropIn:
                    paymentOptions = new ClientCheckoutOptions() { paymentMethod = paymentAuto.PaymentType };
                    break;

                case PaymentMethod.Klarna:
                    paymentOptions = new KlarnaOptions();
                    break;

                case PaymentMethod.PayPalExpress:
                default:
                    paymentOptions = new PaypalOptions();
                    break;
            }

            return paymentOptions;
        }

        public enum Scenario { ManualScenario_1, ManualScenario_2, ManualScenario_3, ManualScenario_4, ManualScenario_5, ManualScenario_6, ManualScenario_7, ManualScenario_8, ManualScenario_10, ManualScenario_11, ManualScenario_12, ManualScenario_13, ManualScenario_14 }

        /// <summary>
        /// Below method will set the Payment Type based on the Manual Regression Scenario
        /// </summary>
        /// <param name="testConfiguration"></param>
        /// <param name="siteId"></param>
        /// <returns></returns>
        public static PaymentOptions GetPaymentOptions_ManualRegression(SharedParameters shared_parameters, Scenario Scenario)
        {
            var cultureCode = shared_parameters.site.EnumCultureCode();

            if (cultureCode == CultureEnum.GB)
            {
                switch (Scenario)
                {
                    case Scenario.ManualScenario_1:
                    case Scenario.ManualScenario_3:
                    case Scenario.ManualScenario_10:
                        return new ClientCheckoutOptions()
                        {
                            delivery = DeliveryMethod.Billing,
                            paymentMethod = PaymentMethod.PayPalDirect
                        };

                    case Scenario.ManualScenario_5:
                        return new KlarnaOptions()
                        {
                            klarnaPaymentOptions = KlarnaPaymentOptions.PayLater,
                            delivery = DeliveryMethod.Billing
                        };

                    case Scenario.ManualScenario_8:
                    case Scenario.ManualScenario_12:
                        return new KlarnaOptions()
                        {
                            klarnaPaymentOptions = KlarnaPaymentOptions.ByCard,
                            delivery = DeliveryMethod.Billing
                        };

                    case Scenario.ManualScenario_2:
                    case Scenario.ManualScenario_4:
                    case Scenario.ManualScenario_6:
                    case Scenario.ManualScenario_7:
                    case Scenario.ManualScenario_11:
                    case Scenario.ManualScenario_13:
                    case Scenario.ManualScenario_14:
                    default:
                        return new PaypalOptions()
                        {
                            byAccount = true
                        };
                }
            }
            else
            {
                return GetPaymentOptions_NonGBCulture(shared_parameters.testConfiguration,
                shared_parameters.site.SiteId);
            }
        }

        /// <summary>
        /// Specific to NonGB Culture: Below method will set the Payment Type from pre-defined selection
        /// </summary>
        /// <param name="testConfiguration"></param>
        /// <param name="siteId"></param>
        /// <returns></returns>
        public static PaymentOptions GetPaymentOptions_NonGBCulture(TestConfigurationCDO testConfiguration, int siteId)
        {
            var paymentOptionList = SitePaymentRepository.GetSitePaymentInfoBySiteId(
            testConfiguration,
            siteId);

            var paymentAuto = paymentOptionList.First(x => checkoutGroup.Contains(x.PaymentType));

            return new ClientCheckoutOptions() { paymentMethod = paymentAuto.PaymentType };
        }
    }
}
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,897
地点
切萨皮克,va.
编程经验
10+
The enum identifiers ManualScenario_xxx is not very descriptive. You'll want to use descriptive identifiers.

我不确定你想要一个名为的对象"TestConfigurationCDO"生活在您的生产代码中,但它是您的代码和团队编码标准。

通过首先检查非GB并立即返回,可能会降低第64-112行中的缩进级别。 Switch语句升高了一个级别,因为它不需要在else子句中。所以你有代码看起来像:
C#:
if (is non-GB)
    return GetPaymentOptions_NonGBCulture( ... );

switch (scenario)
{
    :
}

123-129行非常可能被修剪进一步调整以查看类似:
C#:
return SitePaymentRepository.GetSitePaymentInfoBySiteId( ... )
                            .First( ... )
                            .Select(p => new ClientCheckoutOptions() { paymentMethod = p.PaymentType });
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,897
地点
切萨皮克,va.
编程经验
10+
第27-28行可以组合使用orderby和首先
 
解决方案

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,897
地点
切萨皮克,va.
编程经验
10+
此外,您希望根据切换语句和返回对象,决定您的团队的编码标准是什么。您是否对基类进行了变量分配,并且在第一个方法中的交换机语句之后具有单个返回语句,或者您只需在第二种方法中将混凝土类返回与交换机箱内的返回语句?
 

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
123-129行非常可能被修剪进一步调整以查看类似:
C#:
return SitePaymentRepository.GetSitePaymentInfoBySiteId( ... )
                            .First( ... )
                            .Select(p => new ClientCheckoutOptions() { paymentMethod = p.PaymentType });

之后我无法使用选择!


C#:
return SitePaymentRepository.GetSitePaymentInfoBySiteId(testConfiguration,siteId)
                            .First(x => checkoutGroup.Contains(x.PaymentType))
                            .Select(p => new ClientCheckoutOptions() { paymentMethod = p.PaymentType });
 

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
The enum identifiers ManualScenario_xxx is not very descriptive. You'll want to use descriptive identifiers.

是的,即使我认为我也没有正常使用 - 我应该在下面的单独类中调用此方法:


C#:
public void QuantityDiscount_EndToEnd_Scenario()
        {
            var param = new WorkflowParameters()
            {
                designMethod = DesignMethod.UploadImage,
                signedIn = true,
                quantity = 55,
                productId = NominatedProducts.fabric,

                paymentOptions = PaymentOptionsHelper.GetPaymentOptions_ManualRegression(shared_parameters, PaymentOptionsHelper.Scenario.ManualScenario_13)
            };
}

我只是不明白我可以定义枚举者的其他方式
 

Palak Shah.

众所周知的成员
加入
4月29日,2020年4月
消息
83
编程经验
1-3
此外,您希望根据切换语句和返回对象,决定您的团队的编码标准是什么。您是否对基类进行了变量分配,并且在第一个方法中的交换机语句之后具有单个返回语句,或者您只需在第二种方法中将混凝土类返回与交换机箱内的返回语句?

通常情况发生如第二种方法
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,897
地点
切萨皮克,va.
编程经验
10+
之后我无法使用选择!


C#:
return SitePaymentRepository.GetSitePaymentInfoBySiteId(testConfiguration,siteId)
                            .First(x => checkoutGroup.Contains(x.PaymentType))
                            .Select(p => new ClientCheckoutOptions() { paymentMethod = p.PaymentType });
你的权利。当我感觉不舒服时,我可能不应该在线。需要一个在哪里而不是第一个,然后在选择之后添加第一个。在保存的线条方面可能不值得。您必须决定是否值得用于代码可读性。
 
最佳 底部