对于记录事务的目的,我需要告诉用户是否提供必要的字段/信息。 如果是,我将用*替换真实信息。 如果不是,我会将此请求作为失败的请求,并返回" false"值。
以下是数据定义类和方法。
public class CreditCard
{
public string brand { get; set; }
public string billingphone { get; set; }
}
class Program
{
static void Main(string[] args)
{
CreditCard creditcard =new CreditCard(){brand="VISA", billingphone="777-111-2222"};
bool IsVerified= SanitizePaymnetData(creditcard);
}
private bool SanitizePaymnetData(ref CreditCard creditcard)
{
bool isDataSanitized = true;
if(!String.IsNullOrEmpty(creditcard.brand))
{
creditcard.brand ="*";
}
else
{
isDataSanitized = false;
}
if (!String.IsNullOrEmpty(creditcard.billingphone))
{
creditcard.billing_phone = "*";
}
else
{
isDataSanitized = false;
}
return isDataSanitized;
}
}
" SanitizePaymentData"方法看起来很难看。 有没有办法让它更整洁干净?
答案 0 :(得分:4)
我在这里看到的主要问题可能是可维护性。在向CreditCard
添加字段时,您必须在SantitzePaymentData()
中添加其他检查。如果其他开发人员稍后对此进行了处理,他们可能不会意识到这一要求,或者您可能会在以后忘记这一点,并且敏感信息将开始显示在您的日志中。由于这不会产生异常或编译错误,因此可能需要一段时间才能发现这种情况。
我不知道这是一个真实的项目,还是您正在学习的东西,但当您决定添加其他付款方式(如电汇)时会出现另一个问题。然后,您必须创建另一个适用于新付款类的SanitizePaymentData()
函数,但它将基本上与原始方法中的代码重复。这种重复工作违反了DRY原则,并在您的项目中造成混乱。
在我看来,更清洁的方法是在类中使用将敏感字段标记为需要清理的属性,然后让记录器做出适当的响应。
public class CreditCard
{
[SanitizeInLog]
public string Brand {get; set;}
[SanitizeInLog]
public string BillingPhone {get; set;}
}
现在,您的日志记录方法/类可以简单地检查字段上是否存在这些属性,并将其切换为“*”或其他任何内容。