创建一个默认的 DAO 接口
Creating a default DAO interface
我想知道创建默认 DAO 接口而不是为每个 class 创建自己的接口是否是一个好习惯。
public interface DAO {
public void addItem();
public void updateItem();
public void removeItem();
public Object getItem(int id);
public Object[] getAll();
}
现在我们可以通过多个class实现这个接口。当然,这种解决方案有它的缺点,比如在检索数据期间向下转换,但我认为它仍然更高效且代码清晰。这是个好方法吗?
这是一个好方法,但至少可以使用泛型进行改进:
public interface DAO<T> {
public void addItem(T item);
public void updateItem(T item);
public void removeItem(T item);
public T getItem(int id);
public List<T> getAll();
}
所以现在你不需要任何铸造。但无论如何,你必须确保所有的 DAO 至少有那些方法。否则,这将导致更多的复杂性。此外,如果有一些 DAO 正好有这些方法,你最终会得到非常紧凑干净的代码,例如:
public interface UserDAO extends DAO<User> {
// And that is basically it :)
}
public class UserDAOImpl implements UserDAO {
// Your implementations here
// ...
}
注意:我已经将 Object[]
替换为 List<T>
而不是 T[]
,因为在泛型的情况下不能这样做。但这不是缺点,还是使用内置容器更好。
没有。遵循以下结构将是干净的。
interface DAO {
void insert();
void update();
Object read(Integer id);
void delete();
}
class DAOImpl implements DAO {
void insert(){}
void update(){}
Object read(Integer id){}
void delete(){}
}
class ItemDAO extends DAOImpl{
public void addItem(Item i){
insert(i);
}
public void updateItem(Item i){
update(i);
}
public void removeItem(Item i){
delete(i);
}
public Object getItem(int id){
read(id);
}
}
我不会做的。如果你有一个你只从中读取的 table 怎么办(也许其他 module/program/etc 更新它?或者如果它只是你想手动设置一次然后忘记的一些设置?)。或者,如果您希望能够从同一个 table 中获取多个项目怎么办(也许您只需要一些东西的 ID 而其他东西的完整对象)?虽然它可能更容易编写,但我认为接口 DAO 更难使用。
我也真的不认为可读性更好。 CarDAO.getItem(123)
告诉你的比 CarDAO.getCarById(123)
少很多。如果你想通过其他方式获得汽车,你不必重载它(是的,你可以只做一些不在界面中的东西,但界面的好处更小)。
我想知道创建默认 DAO 接口而不是为每个 class 创建自己的接口是否是一个好习惯。
public interface DAO {
public void addItem();
public void updateItem();
public void removeItem();
public Object getItem(int id);
public Object[] getAll();
}
现在我们可以通过多个class实现这个接口。当然,这种解决方案有它的缺点,比如在检索数据期间向下转换,但我认为它仍然更高效且代码清晰。这是个好方法吗?
这是一个好方法,但至少可以使用泛型进行改进:
public interface DAO<T> {
public void addItem(T item);
public void updateItem(T item);
public void removeItem(T item);
public T getItem(int id);
public List<T> getAll();
}
所以现在你不需要任何铸造。但无论如何,你必须确保所有的 DAO 至少有那些方法。否则,这将导致更多的复杂性。此外,如果有一些 DAO 正好有这些方法,你最终会得到非常紧凑干净的代码,例如:
public interface UserDAO extends DAO<User> {
// And that is basically it :)
}
public class UserDAOImpl implements UserDAO {
// Your implementations here
// ...
}
注意:我已经将 Object[]
替换为 List<T>
而不是 T[]
,因为在泛型的情况下不能这样做。但这不是缺点,还是使用内置容器更好。
没有。遵循以下结构将是干净的。
interface DAO {
void insert();
void update();
Object read(Integer id);
void delete();
}
class DAOImpl implements DAO {
void insert(){}
void update(){}
Object read(Integer id){}
void delete(){}
}
class ItemDAO extends DAOImpl{
public void addItem(Item i){
insert(i);
}
public void updateItem(Item i){
update(i);
}
public void removeItem(Item i){
delete(i);
}
public Object getItem(int id){
read(id);
}
}
我不会做的。如果你有一个你只从中读取的 table 怎么办(也许其他 module/program/etc 更新它?或者如果它只是你想手动设置一次然后忘记的一些设置?)。或者,如果您希望能够从同一个 table 中获取多个项目怎么办(也许您只需要一些东西的 ID 而其他东西的完整对象)?虽然它可能更容易编写,但我认为接口 DAO 更难使用。
我也真的不认为可读性更好。 CarDAO.getItem(123)
告诉你的比 CarDAO.getCarById(123)
少很多。如果你想通过其他方式获得汽车,你不必重载它(是的,你可以只做一些不在界面中的东西,但界面的好处更小)。