Цикл for
является обязательным, алгоритмы декларативными. Когда вы пишете std::max_element
, очевидно, что вам нужно, когда вы используете цикл для достижения того же самого, это не обязательно так.
Алгоритмы также могут иметь небольшое преимущество в производительности. Например, при обходе std::deque
специализированный алгоритм может избежать избыточной проверки того, перемещает ли данный инкремент указатель за границу фрагмента.
Однако сложные выражения функторов быстро делают вызовы алгоритма нечитаемыми. Если явный цикл более читабелен, используйте его. Если вызов алгоритма может быть выражен без десятиуровневых выражений связывания, то все равно предпочитайте его. Читаемость здесь важнее, чем производительность , здесь , потому что этот вид оптимизации - то, что Кнут так классно приписывает Хоару; вы сможете без проблем использовать другую конструкцию, если поймете, что это узкое место.
This isn't specific to fluent, but is fundamental to the NHibernate mapping. We use an interceptor to specify the Kind. It is similar to the approach in this blog post which lists a couple alternatives. There is also a proposed patch (NH-1135) for handling UtcDateTime and LocalDateTime natively. I'd encourage you to vote for it.
public class InterceptorBase : EmptyInterceptor
{
public override bool OnLoad(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
ConvertDatabaseDateTimeToUtc(state, types);
return true;
}
private void ConvertDatabaseDateTimeToUtc(object[] state, IList<IType> types)
{
for (int i = 0; i < types.Count; i++)
{
if (types[i].ReturnedClass != typeof(DateTime))
continue;
DateTime? dateTime = state[i] as DateTime?;
if (!dateTime.HasValue)
continue;
if (dateTime.Value.Kind != DateTimeKind.Unspecified)
continue;
state[i] = DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc);
}
}
}