構造化プログラミング

無駄に長い.うにゅー

int srv_start()
{
  int rv = 0;

  SC_HANDLE hSCM;

  /* stop service */
  srv_stop();

  /* start service */
  hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);

  if (hSCM) {
    SC_HANDLE hService;

    hService = OpenService(hSCM, SERVICE_NAME, SERVICE_START);

    if (hService) {
      if (StartService(hService, 0, NULL)) {
        rv = 0;

      } else {
        rv = -1;
      }
      CloseServiceHandle(hService);

    } else {
      rv = -1;
    }
    CloseServiceHandle(hSCM);

  } else {
    rv = -1;
  }

  return rv;
}

論理の流れとリソースの管理が一致してないからこんなソースになるのであって.


でも,こんなのはもっと微妙なのであって.

int srv_start()
{
  int rv = 0;

  SC_HANDLE hSCM;
  SC_HANDLE hService;

  /* stop service */
  srv_stop();

  /* start service */
  hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
  if (!hSCM) {
    rv = -1;
    goto _srv_start_cleanup_hSCM;
  }

  hService = OpenService(hSCM, SERVICE_NAME, SERVICE_START);
  if (!hService) {
    rv = -1;
    goto _srv_start_cleanup_hService;
  }

  rv = (StartService(hService, 0, NULL)) ? 0 : -1;

_srv_start_cleanup_hService:
  CloseServiceHandle(hService);

_srv_start_cleanup_hSCM:
  CloseServiceHandle(hSCM);

  return rv;
}

あなたは,どちらがお好みですか?