Скажем, у меня есть
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?
Вы должны реорганизовать свой код, чтобы изолировать внутренние методы, которые предполагают, что данные хороши из открытых публичных методов, которые выполняют проверку на внешних входах.
Конечно, если вы испортите свои данные во внутренних методах, то это ваша проблема
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)
{
.....
}
}
}
Как вы можете видеть, этот подход не повторяет проверку для того же экземпляра класса.
Поскольку это общедоступный метод, нет никакой гарантии, что метод 1 (строка) ТОЛЬКО КОГДА-ЛИБО вызывается из метода1()?
Если вы уже подтвердили данные в своем методе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
может быть вызван с недопустимым вводом из других источников
Что делать, если ваш method2
будет вызван другими методами?
В общем, когда вы public
определенный метод, вы никогда не можете быть уверены, что ваш метод будет вызываться только некоторыми вызывающими абонентами и поставить проверку только на вызывающих абонентов.
Таким образом, в целом вам нужно иметь проверку внутри, чтобы убедиться, что тот, кто вызовет ваш метод, не получит исключения.
method2
изолированным так, чтобы он не мог быть вызван доmethod1
?