読者です 読者をやめる 読者になる 読者になる

無気力生活 (ノ ´ω`)ノ ~゜

脱力系エンジニア。てきとーに生きてます。

事前チェックする?しない?

ちょっとした悩みごと(´・ω・`)


サーバーにアクセスして、なにかしらの情報を取ってくるメソッドがあります。
仮に名前をGetServerValuesとでもしておきます。
このメソッド内にはExecuteとかいう、実際にサーバーに接続して情報を取得する処理がいます。
こいつは、接続に失敗したとき例外を出します。

GetServerValueメソッドの仕様は以下の通りです。

  • 接続に失敗した場合、リストで管理している別のホスト名に接続先を変更して、GetServerValue再実行する
  • すべてのホスト名の接続に失敗した場合、サーバーに接続できないという例外を発生させる

んで、実際にこの処理を使うときなんですが、2パターンくらいやりかたが思い付きます。

  1. 最初のGetServerValuesが失敗した後、リストで管理しているホスト名すべてに対してPingを実行し、有効なホスト名を取得。その後でGetServerValues
  2. 最初のGetServerValuesが失敗した後、次のホスト名を使ってGetServerValues。更に失敗したら次・・・次・・・ですべてのホスト名に対して処理

文章だけだとわかりにくいかと思いますのでソース上げときます。(C#ですがご勘弁を)

パターン1のソース

public class test
{
  // 接続しにいくホスト名
  string connectiongHost = "hoge1";

  // 管理しているホスト名一覧
  List hostNameList = new List {"hoge2", "hoge3", "hoge4"};

  int GetServerValue()
  {
    try
    {
      // サーバーから値をとる処理
      return Execute(this.connectiongHost);
    }
    catch
    {
      if(SwitchHost())
        return Execute(this.connectiongHost);
      else
        throw;
    }
  }

  bool SwitchHost()
  {
    foreach(string st in this.hostNameList)
    {
      if(Ping(st))
      {
        this.connectiongHost = st;
        return true;
      }
    }
    return false;
  }
}

パターン2のソース

public class test
{
  // 接続しにいくホスト名
  string connectiongHost = "hoge1";

  // 管理しているホスト名一覧
  List hostNameList = new List {"hoge2", "hoge3", "hoge4"};

  int GetServerValue()
  {
    try
    {
      // サーバーから値をとる処理
      return Execute(this.connectiongHost);
    }
    catch
    {
      foreach(string st in this.hostNameList)
      {
        try{
          return Execute(this.connectiongHost);
        }
        catch
        {
          coninue;
        }
      }
      throw;
    }
  }
}

個人的には1のパターンの方がいいと思っているんですが、上司さん的には2がいいらしい。
理由は外部との通信が1のパターンより少なくなるから&
Pingでの接続確認とGetServerValuesとの間でサーバーが接続できない状態になったときに困るから、らしいです。

うーん・・・後者のパターンはほぼ起こらない例外中の例外だから他で吸収すればいいだろうし、
前者のパターンでは利便性を損なってまでやることか微妙に納得できないものがorz
他の方はどうしてるんでしょ?(´・ω・`)