Co jest łatwiejsze do zrozumienia, duża instrukcja boolowska (dość złożona) lub ta sama instrukcja w podziale na metody predykatów (dużo dodatkowego kodu do odczytania)?
Opcja 1, duże wyrażenie logiczne:
private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal)
{
return propVal.PropertyId == context.Definition.Id
&& !repo.ParentId.HasValue || repo.ParentId == propVal.ParentId
&& ((propVal.SecondaryFilter.HasValue && context.SecondaryFilter.HasValue && propVal.SecondaryFilter.Value == context.SecondaryFilter) || (!context.SecondaryFilter.HasValue && !propVal.SecondaryFilter.HasValue));
}
Opcja 2, warunki w podziale na metody predykatów:
private static bool ContextMatchesProp(CurrentSearchContext context, TValToMatch propVal)
{
return MatchesDefinitionId(context, propVal)
&& MatchesParentId(propVal)
&& (MatchedSecondaryFilter(context, propVal) || HasNoSecondaryFilter(context, propVal));
}
private static bool HasNoSecondaryFilter(CurrentSearchContext context, TValToMatch propVal)
{
return (!context.No.HasValue && !propVal.SecondaryFilter.HasValue);
}
private static bool MatchedSecondaryFilter(CurrentSearchContext context, TValToMatch propVal)
{
return (propVal.SecondaryFilter.HasValue && context.No.HasValue && propVal.SecondaryFilter.Value == context.No);
}
private bool MatchesParentId(TValToMatch propVal)
{
return (!repo.ParentId.HasValue || repo.ParentId == propVal.ParentId);
}
private static bool MatchesDefinitionId(CurrentSearchContext context, TValToMatch propVal)
{
return propVal.PropertyId == context.Definition.Id;
}
Wolę drugie podejście, ponieważ widzę nazwy metod jako komentarze, ale rozumiem, że jest to problematyczne, ponieważ musisz przeczytać wszystkie metody, aby zrozumieć, co robi kod, więc abstrahuje on od intencji kodu.
if
instrukcji w żadnym bloku kodu. Twoje pytanie dotyczy wyrażeń logicznych .