воскресенье, 5 октября 2014 г.

[prog.c++] Отличная презентация "Exception Safe Coding" с CppCon2014

Лежит здесь. Слайдов много. Но действующим C++ разработчикам, особенно не освоившим еще вполне C++11 -- смотреть обязательно!

Очень показателен пример из презентации: как переписали функцию, не использовавшую исключения, и что из этого получилось.

Было:

static acl_t CreateReadOnlyForCurrentUserACL(void)
{
   acl_t theACL = NULL;
   uuid_t theUUID;
   int result;
   result = mbr_uid_to_uuid(geteuid(), theUUID); // need the uuid for the ACE
   if (result == 0)
   {
      theACL = acl_init(1); // create an empty ACL
      if (theACL)
      {
         Boolean freeACL = true;
         acl_entry_t newEntry;
         acl_permset_t newPermSet;
         result = acl_create_entry_np(&theACL, &newEntry, ACL_FIRST_ENTRY);
         if (result == 0)
         { // allow
            result = acl_set_tag_type(newEntry, ACL_EXTENDED_ALLOW);
            if (result == 0)
            { // the current user
               result = acl_set_qualifier(newEntry, (const void *)theUUID);
               if (result == 0)
               {
                  result = acl_get_permset(newEntry, &newPermSet);
                  if (result == 0)
                  { // to read data
                     result = acl_add_perm(newPermSet, ACL_READ_DATA);
                     if (result == 0)
                     {
                        result = acl_set_permset(newEntry, newPermSet);
                        if (result == 0)
                           freeACL = false// all set up and ready to go
                     }
                  }
               }
            }
         }
         if (freeACL)
         {
            acl_free(theACL);
            theACL = NULL;
         }
      }
   }
   return theACL;
}

Стало:

static acl_t CreateReadOnlyForCurrentUserACL()
{
   ACL theACL(1);
   acl_entry_t newEntry;
   acl_create_entry_np(&theACL.get(), &newEntry, ACL_FIRST_ENTRY);

   // allow!
   acl_set_tag_type(newEntry, ACL_EXTENDED_ALLOW);

   // the current user!
   uuid_t theUUID;
   mbr_uid_to_uuid(geteuid(), theUUID); // need the uuid for the ACE
   acl_set_qualifier(newEntry, (const void *)theUUID);
   acl_permset_t newPermSet;
   acl_get_permset(newEntry, &newPermSet);

   // to read data
   acl_add_perm(newPermSet, ACL_READ_DATA);
   acl_set_permset(newEntry, newPermSet);

   // all set up and ready to go
   return theACL.release();
}

Почувствуйте разницу, что называется.

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