Например, когда у вас есть такой цикл:
List<Employee> retiredEmployees = new List<Employee>();
foreach (Employee employee in EmployeeList)
{
if (employee.IsRetired)
retiredEmployees.Add(employee);
}
Используя предикат, вы должны изменить его на:
retiredEmployees = EmployeeList.FindAll(e => e.IsRetired);
Но я считаю, что в целом "если утверждение считается злом" дискуссия, predicate
против if
только что упоминается как частный случай использования ООП и функционального программирования по сравнению с процедурным программированием. Эту парадигму можно легко обобщить для любого типа делегата (не только предиката) или любого использования ООП для замены условного:
Например, если вы просматриваете свой код, вы можете легко найти такой код:
public class Employee
{
private bool _isRetired;
private double _amount;
public double GetPayAmount()
{
if (_isRetired)
return _amount * 0.9;
else
return _amount;
}
}
Сторонники чистого ООП скажут вам, что вам необходимо немедленно извлечь другого типа сотрудника и обрабатывать каждую ветвь как отдельный подтип, что удалит «утверждение зла, если» :
public interface IEmployee
{
double GetPayAmount();
}
public class Employee : IEmployee
{
private double _amount;
public double GetPayAmount()
{
return _amount;
}
}
public class RetiredEmployee : IEmployee
{
private double _amount;
public double GetPayAmount()
{
return _amount * 0.9;
}
}
Хотя код легче поддерживать таким образом, объем кода во втором случае явно удвоился. Для такой простой иерархии нет необходимости выполнять рефакторинг на этом этапе. Если вы решите, что вам нужно еще много особых случаев, то ваше условие может стать слишком сложным, и вы сможете легко изменить его позже.