Для Надлежащей практики кодирования, мы все еще должны проверить данные снова в method2, если мы уже проверили в method1 и method1 передает эти данные в method2?

0

Скажем, у меня есть

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

Для хорошей практики кодирования,

нам все еще нужно снова проверять данные в методе2, если мы уже проверили его в методе 1, а метод1 передает эти данные методу2?

  • 0
    Ответ зависит. Является ли method2 изолированным так, чтобы он не мог быть вызван до method1 ?
Теги:
validation

4 ответа

2
Лучший ответ

Вы должны реорганизовать свой код, чтобы изолировать внутренние методы, которые предполагают, что данные хороши из открытых публичных методов, которые выполняют проверку на внешних входах.
Конечно, если вы испортите свои данные во внутренних методах, то это ваша проблема

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){

}

Другой подход, но я действительно не могу рекомендовать его, потому что он приводит к сложному состоянию - это использование глобальной логической переменной уровня класса, которая содержит результат проверки. Повторяю, на всякий случай, если ваши проверки сложны и дороги, чтобы повторить (простая проверка нуля - это не дорогостоящая операция)

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)
         {
              .....
         }
     }
}

Как вы можете видеть, этот подход не повторяет проверку для того же экземпляра класса.

  • 0
    я думаю, что мне нравится это решение
  • 0
    но даже если это конфиденциально, вы не уверены, что кто-то не будет использовать передачу непроверенных данных этому методу. Например, я и мой друг, возможно, использую один и тот же компьютер и все кодируем один и тот же класс, если мой друг вызовет этот закрытый метод в этом классе, у него могут возникнуть проблемы, если он не проверит. Так как с этим бороться?
Показать ещё 6 комментариев
5

Поскольку это общедоступный метод, нет никакой гарантии, что метод 1 (строка) ТОЛЬКО КОГДА-ЛИБО вызывается из метода1()?

0

Если вы уже подтвердили данные в своем методе1, и нет никаких шансов, что данные могут быть изменены между вызовами метода2,
то нет необходимости снова проверять его.

Согласно отредактированному вопросу, если вы модифицируете данные после проверки в method1 то вы должны подтвердить его снова в method2 в особых обстоятельствах

бывший
Дело 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
  }

В приведенном выше случае, даже если вы не проверяете s в method2 он не создаст проблем, если method2 не 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 может быть вызван с недопустимым вводом из других источников

  • 0
    я немного изменил свой квест, s1 используется, чтобы сделать что-то в method1, поэтому нам нужно проверить его в method1
0

Что делать, если ваш method2 будет вызван другими методами?

В общем, когда вы public определенный метод, вы никогда не можете быть уверены, что ваш метод будет вызываться только некоторыми вызывающими абонентами и поставить проверку только на вызывающих абонентов.

Таким образом, в целом вам нужно иметь проверку внутри, чтобы убедиться, что тот, кто вызовет ваш метод, не получит исключения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню