C# 为了获得良好的编码实践,如果我们已经在method1&;中进行了验证,那么我们还需要在method2中再次验证数据吗;method1将数据传递给method2?

C# 为了获得良好的编码实践,如果我们已经在method1&;中进行了验证,那么我们还需要在method2中再次验证数据吗;method1将数据传递给method2?,c#,java,php,c++,validation,C#,Java,Php,C++,Validation,假设我有 public void method1(){ String s1=""; String s1=getText(); if(MyValidation.isOk(s1)){ dosomethingWith s1 here then method2(s1); } } public void method1(String s1){ if(MyValidation.isOk(s1)){ // do we need

假设我有

public void method1(){
    String s1="";
    String s1=getText();
    if(MyValidation.isOk(s1)){
       dosomethingWith s1 here
       then
       method2(s1);
    }
}

public void method1(String s1){
    if(MyValidation.isOk(s1)){ // do we need this line of code??
        //do something
    }
}
对于良好的编码实践


如果我们已经在method1中验证了数据,那么我们还需要在method2中再次验证数据吗?method1将数据传递给method2?

因为它是一个公共方法,所以不能保证method1(字符串)只会从method1()调用,是吗?

如果您的
method2
会被其他方法调用呢

通常,当您将某个方法
设置为公共时
永远无法确保您的方法将仅由某些调用者调用,并且仅对调用者进行验证


因此,总而言之,您需要在内部进行验证,以确保调用您的方法的人不会出现异常

如果您已经验证了method1中的数据,并且在调用method2之间不可能修改数据,
那么就不需要再次验证它了

根据编辑的问题,如果在
method1
中验证后修改数据,则在特殊情况下必须在
method2
中再次验证

ex
案例1

  public void method1(string s)
  {
        if(s!=null)
        {
            // do something with s here. 
            // but not make it null
            method2(s) ; 
        }
  }
  public void method2(string s)
  {
          // do something with s
  }
在上述情况下,即使不在
method2
中选中
s
,也不会产生问题,除非从其他方法调用
method2

案例2

     public void method1(string s)
     {
        if(s!=null)
        {
            // do something with s here. 
             String temp = s ; 
             s = null ; 
             method2(s) ; 
        }
  }
      public void method2(string s)
      {
            // do something with s
       }
在案例2中,如果不在
method2
中检查条件,可能会有危险


无论如何,我的建议是,仅当需要检查条件时,才检查这两种方法中的条件,即有可能使用来自其他来源的无效输入调用
method2

您应该重构代码,将假定数据良好的内部方法与公开的公共方法隔离开来对外部输入执行验证。
当然,如果您在内部方法中弄乱了数据,那么这就是您的问题

public void method1(){
    String s1="";
    String s1=getText();
    if(MyValidation.isOk(s1)){
       RunSomethingInternalForMethod1(s1);
       // or
       // if(RunSomethingInternalForMethod1(s1))
       //     RunSomethingInternalForMethod2(s1);
    }
}

public void method2(String s1){
    if(MyValidation.isOk(s1)){ 
        RunSomethingInternalForMethod2(s1);
    }
}

// PRIVATE HERE ... NO WAY TO CALL THIS FROM CODE EXTERNAL TO THIS CLASS
private void RunSomethingInternalForMethod1(string s1){
    .....
    // You could call the additional internal code here, or add this 
    // call after the public method1, you could even change the return value
    // of this method and call the second one only if this one is successful
    RunSomethingInternalForMethod2(s1);
}
private void RunSomethingInternalForMethod2(string s1){

}
另一种方法,但我确实不能推荐它,因为它会导致复杂的状态,这是通过使用包含验证结果的全局类级布尔变量实现的。我重复我自己的话,以防您的验证重复起来既复杂又昂贵(简单的空检查不是昂贵的操作)


正如您所见,这种方法不会对类的同一实例重复验证

答案要看情况而定。
method2
是否被隔离在这样的地方,以至于在
method1
之前无法调用它?我对我的任务进行了一些修改,s1用于在method1中执行某些操作,因此我们需要在method1中验证它。我想我喜欢这个解决方案,但即使它是私有的,你也不确定有人不会使用passunchecked数据传递给该方法。例如,我和我的朋友可能共享同一台计算机&所有人都在编写同一个类,如果我的朋友调用该类中的私有方法,那么如果他不检查,他可能会遇到问题。那么如何处理呢?当然这是一个问题,但是篡改仅限于来自您自己类的代码,而不是来自外部方法的代码。因此,控制发生的事情应该很容易。OOP的原则之一是隐藏实现细节以避免难以跟踪错误。因此,我们无法确定如果两个人在同一个类上工作,你是否想出另一种方法,如果同一个人滥用私有方法而忘记该方法没有验证,该怎么办
public Class Test
{
     private bool _validatedOK = false;

     public void method1()
     {

         if(!_validatedOK) 
              _validatedOK = MyValidation.isOk(s1);
         if{_validatedOK)
         {
              ......
              method2();
         }
     }
     public void method2()
     {

         if(!_validatedOK) 
              _validatedOK = MyValidation.isOk(s1);
         if{_validatedOK)
         {
              .....
         }
     }
}