从函数中删除公共代码

时间:2014-01-05 08:35:11

标签: java

我在类中有近10个函数具有类似跟随函数的模式

    SQLiteDatabase database = this.getWritableDatabase();

    try {
          //Some different code , all other code(try,catch,finally) is same in all functions
    } catch (SQLiteException e) {
        Log.e(this.getClass().getName(), e.getMessage());
        return false;
    } finally {
        database.close();
    }

}

我想从所有函数中删除该公共代码(try,catch,finally)并将其移动到一个地方 我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:3)

有许多框架可以大大简化您可以使用的数据库交互,但是如果您想自己做事,并且对Java这样做的事情感兴趣,那么这就是:< / p>

让你的“执行者”如此:

public class Executor {
  public static void runOperation(Operation operation) {
    SQLiteDatabase database = this.getWritableDatabase();
    try {
      operation.run(database);
    } catch (SQLiteException e) {
      Log.e(operation.getClass().getName(), e.getMessage());
      return false;
    } finally {
      database.close();
  }
}

现在,您要做的10件事中的每件事都是操作:

public interface Operation {
  void run(SQLiteDatabase database) throws SQLiteException;
}

以下是特定操作的样子:

Operation increaseSalary = new Operation() {
  public void run(SQLiteDatabase database) throws SQLiteException {
    // .... write the new increased salary to the database
  }
};

然后用:

运行它
.
.
Executor.runOperation(increaseSalary);
.
.

您还可以将接口的实现设置为匿名内部类,但这可能会使其可读性降低。

.
.
Executor.runOperation(new Operation() {
  public void run(SQLiteDatabase database) throws SQLiteException {
    // put the increase salary database-code in here
  }
});
.
.

您可以查看经典设计模式列表,找出它是哪一个。

答案 1 :(得分:1)

要进一步扩展Ray Toal's original answer,值得注意的是,使用匿名内部类将有助于避免为每个操作创建单独的类文件。所以具有10个左右函数的原始类可以保持相同的方式,除了被重构为使用Executor模式。

此外,使用Executor模式时,您必须在原始代码中使用this。假设原始函数如下:

public boolean operation1() {
    SQLiteDatabase database = this.getWritableDatabase();

    try {
        //Code for Operation 1
        return true;
    } catch (SQLiteException e) {
        Log.e(this.getClass().getName(), e.getMessage());
        return false;
    } finally {
        database.close();
    }

}

public boolean operation2() {
    SQLiteDatabase database = this.getWritableDatabase();

    try {
        //Code for Operation 2
        return true;
    } catch (SQLiteException e) {
        Log.e(this.getClass().getName(), e.getMessage());
        return false;
    } finally {
        database.close();
    }

}

Executor类的定义如下:

public class Executor {
  public static boolean runOperation(SQLiteOpenHelper helper, Operation operation) {
    SQLiteDatabase database = helper.getWritableDatabase();
    try {
      operation.run(database);
      return true;
    } catch (SQLiteException e) {
      Log.e(helper.getClass().getName(), e.getMessage());
      return false;
    } finally {
      database.close();
    }
  }
}

Operation接口定义如下:

public interface Operation {
    public void run(SQLiteDatabase database) throws SQLiteException;
}

现在可以按如下方式重写原始函数:

public boolean operation1() {
    return Executor.runOperation(this, new Operation() {
      public void run(SQLiteDatabase database) throws SQLiteException {
        //Code for Operation 1
      }
    });
}

public boolean operation2() {
    return Executor.runOperation(this, new Operation() {
      public void run(SQLiteDatabase database) throws SQLiteException {
        //Code for Operation 2
      }
    });
}

此扩展也纠正了Ray在其原始答案中忽略的错误。