2

リソースのリストを入力として受け取り、それぞれをロックしようとするコードに取り組んでいます。誰かが失敗すると、すべてのリソースのロックを解放しようとします。これは、「すべて」のリソースがロックされているか、まったくロックされていないことを意味します。私には2つのアプローチがありますが、他の方法よりも大きなメリットはありません。そのような場合の標準的なコーディング方法は何ですか? デザインパターンに名前はありますか?

OPTION 1:

// one function taking on 2 responsibilities. appears bad to have unlock code in locking function
public boolean getLock(List<Resource> resources) {
     for (Resource r : resources) {
          if (! Lock.getLock(r)) {
              releaseLocks(resources);   
              return false;
          }
     }
     return true;
}

OPTION 2:

    public boolean getLock(List<Resource> resources) {
         for (Resource r : resources) {
              if (! Lock.getLock(r)) { 
                  return false;
              }
         }
         return true;
    }

    public boolean stateChecker(List<Resource> resources) {
           if (!getLock(resouces)) {
               releaseLocks(resources);
               return false;
           } 
           return true;
    }
4

3 に答える 3

1

2 番目のオプションでは、すべてを取得できなくても、(部分的に) 取得した「ロック」のロックを解除しません。(または、getLocks() は非公開にする必要がありましたか?) では、これらのリソースを解放するためにロックを解除するにはどうすればよいでしょうか? すべてのロックを取得するか、ロックがまったくないことを保証する方法は、はるかに優れています。(保証されていない場合、これらはどのように解放されますか?)

可能であれば、次のようなことを試みます。

interface ResourceUpdater {
    public void useResources(List<Resource> rs);
}

public static boolean withResources(List<Resource> rs, ResourceUpdater updater) {
    // lock/unlock would ideally be private (or perhaps package private).
    // I'm also assuming the unlockAll() will be a no-op on the non-locked resources
    try {
        if(!lockAll(rs))
            return false;
        updater.useResources(rs);
        return true;
    }
    finally {
        unlockAll(rs);
    }
}

ここでのポイントは、リソースの使用方法の実装の詳細をロックおよびロック解除することです。それらを使用するクライアント コードは、常にこの手段を使用してリソースを更新する限り、ロックのメカニズムを認識する必要はありません。資力。

正確にどこに試してみるか...最終的には、ロック/ロック解除と操作の失敗の特徴によって異なります。(たとえば、個別の try...catch で各リソースのロックを解除して、少なくともそれぞれのロックを解除しようとする試みが行われるようにしたい場合があります。また、useResources() は戻り値が必要な場合があり、それが返されます。 withResources() から。

于 2013-11-14T19:26:12.330 に答える