Считается ли читабельным вызывать методы внутри условия IF? - PullRequest
1 голос
/ 22 сентября 2011

Считается ли этот способ написания условий IF хорошим стилем программирования на языках Java и C # или нет?

if (checkIfIdInFirstRange()){
    //call Range1 handling method
}else if(checkIfIdInSecondRange()){
    //call Range2 handling method
}else{
    //call error handling method
}

Я задаюсь вопросом о методе внутри самого условия IF, или было бы лучше сделать так:

int idInRange = getIdInRange();
//handle isInRange

Ответы [ 8 ]

6 голосов
/ 22 сентября 2011

Я думаю, что все в порядке.

Еще лучше, если вы сформулируете свои методы как вопрос или выражаете выражение if

if (thisConditionIsTrue()){
    // Do this
}elseif(anotherConditionIsTrue()){
    // Do this instead
}elseif(isThisParameterOkay(someParameter)){
    // Yeh do this
}

Некоторые хардкорные пуристы даже скажут, что еслиу вас> 3 уровня отступа, ваш метод слишком вложенный и должен быть разбит на более мелкие методы.

4 голосов
/ 22 сентября 2011

ИМХО это хорошая практика кодирования , пока вызовы методов не имеют побочных эффектов.

, например

, если checkIfIdInFirstRange(), то все в порядке:

private bool checkIfIdInFirstRange()
{
  return firstRange.Contains(ID);
}

Но это может привести к путанице:

private bool checkIfIdInFirstRange()
{
  SomeStringProperty = "totally new value that no caller would ever expect after a call to this method";

  return firstRange.Contains(ID);
}

Другое возможное решение - в зависимости от реального типа вашей проблемы - может определить интерфейс / базовый класс и использовать полиморфизм.

пример:

internal abstract class A
{
  public void DoSomething(int ID)
  { 
     if(IsInRange(ID))
       DoSomethingProtected(ID);
  }

  protected abstract bool IsInRange(int ID);

  protected abstract void DoSomethingProtected(int ID);
}


internal class B : A
{
  private List<int> firstRange = new List<int> { 42, 23, 5};
  protected override bool IsInRange(int ID)
  {
     return firstRange.Contains(ID); 
  }
  protected override void DoSomethingProtected(int ID)
  {
    Console.WriteLine("{0}", ID);
  } 
}


public class Program
{
  public static void Main(string[] args)
  {
     B foo = new B();
     foo.DoSomething(3);
     foo.DoSomething(42);
  }
}

ВНИМАНИЕ: код написан без IDE.

1 голос
/ 22 сентября 2011

Это хороший стиль, если методы, которые вы вызываете, не просто делают что-то более понятное, если бы они были закодированы на месте:

if ( a > 0 && a < 10 ) doSomething();

лучше

if ( isInRange(a, 0, 10) ) doSomething();
1 голос
/ 22 сентября 2011

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

Например, это безопасно:

if (isResourceAvailable() && isResourceValid()) {
    ...
}

, хотя это может быть:

bool resAvailable = isResourceAvailable();
bool resValid = isResourceValid(); // can you call that alone?

if (resAvailable  && resValid ) {
    ...
}
1 голос
/ 22 сентября 2011

Да.Было бы намного более читабельным, если бы вы использовали только немного пробелов.Сложив его так, трудно сказать, где все начинается и заканчивается, и else if() выглядит как вызов функции.

if ( checkIfIdInFirstRange() ) {
    //call Range1 handling method
} 
else if ( checkIfIdInSecondRange() ) {
    //call Range2 handling method
}
else {
    //call error handling method
}

Создание дополнительной переменной может затруднить чтение кода, поскольку вам необходимо определить их все перед стеком if / else.Однако все зависит от случая.Иногда может быть лучше использовать переменную, если вы будете использовать дорогостоящую функцию много раз или если у переменной будет более описательное имя, чем у функции.

0 голосов
/ 22 сентября 2011

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

if (idInFirstRange()){
    //call Range1 handling method
}else if(idInSecondRange()){
    //call Range2 handling method
}else{

Кроме того, обычное соглашение для функций, возвращающих bool, заключается в том, что они начинаются с is - isIdInFirstRange

Наконец, попытайтесь избежать такой лестницы, если иное (и переключаться). Попробуйте использовать словари в таких случаях. (https://stackoverflow.com/questions/6506340/if-if-else-or-switch-case/6506403#6506403)

0 голосов
/ 22 сентября 2011

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

0 голосов
/ 22 сентября 2011

Да, в основном это зависит от кодера, но объявление int немного более читабельно.

...