вторник, 29 октября 2013 г.

[prog.c++] Пример устранения многословности

Язык C++ имеет репутацию довольно многословного. В общем-то, это так. Но уж очень сильно зависит от слишком уж многих факторов. Ниже пример трансформации кода, который был многословным. Но это определялось вовсе не свойствами языка.

Итак, было:

so_5::ret_code_t
so_sysconf_layer_t::run_script(
   const std::string & file_name,
   so_5::throwing_strategy_t throwing_strategy )
{
   return m_so_sysconf_layer_impl->run_script(
      file_name, throwing_strategy );
}

so_5::ret_code_t
so_sysconf_layer_impl_t::run_script(
   const std::string & file_name,
   so_5::throwing_strategy_t throwing_strategy )
{
   bool result = false;

   // Последовательность задач.
   task_vector_t task_sequence;

   result = script::parse_file( file_name, task_sequence );

   // Если файл разобран нормально, то
   // вставляем всю последовательность.
   if( result )
   {
      m_tasks_handler.m_task_queue->push( task_sequence );
      return 0;
   }
   else
   {
      return so_5::util::apply_throwing_strategy(
         so_5::rc_unexpected_error,
         throwing_strategy,
         "unable to start so_sysconf by script '" +
          file_name + "'");
   }
}

После переосмысления, устранения некоторых ошибок, перехода на информирование об ошибках только через исключения, задействования механизма rvalue references он стал выглядеть вот так:

void
so_sysconf_layer_t::run_script(
   const std::string & file_name )
{
   LOCK_AND_CHECK_WORKING_STATE( so_sysconf_layer_t::run_script );

   m_data->m_tasks_handler.queue().push( script::parse_file( file_name ) );
}

Еще раз уточню: новый вариант делает все то же самое, что и старый. И даже больше, т.к. устраняет несколько ошибок с синхронизацией, которые были в старой версии.

Комментариев нет: