Was ist einfacher zu verstehen, eine große boolesche Anweisung (ziemlich komplex) oder dieselbe Anweisung, die in Prädikatmethoden unterteilt ist (viel zusätzlichen Code zum Lesen)?
Option 1, der große boolesche Ausdruck:
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));
}
Option 2: Die Bedingungen sind in Prädikatmethoden unterteilt:
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;
}
Ich bevorzuge den zweiten Ansatz, weil ich die Methodennamen als Kommentare sehe, aber ich verstehe, dass dies problematisch ist, weil Sie alle Methoden lesen müssen, um zu verstehen, was der Code tut, damit die Absicht des Codes abstrahiert wird.
if
Codeblöcke Anweisungen. Ihre Frage bezieht sich auf Boolesche Ausdrücke .