面向对象的项目类结构

时间:2014-06-18 12:24:00

标签: java android sqlite oop

我是一名新手程序员,我希望看看我对OO设计的想法是不是有钱还是离开。

我有三个类来控制我正在玩的基本Android应用程序的数据。 FishingTrip - 每个实例(令人惊讶地)代表钓鱼之旅。 Fish - 每个实例代表捕获的鱼和DatabaseHelper - 它控制数据插入SQLite数据库。

这是一个非常简单的程序,所以我可以在我的android活动中使用DatabaseHelper实现所有数据输入和输出。但是我觉得这不是一个好的OOP。

另一种方法是让Fish类有一个构造函数来获取输入变量,对象实例调用一个方法通过DatabaseHelper将它插入到数据库中,另一个可以通过从访问中分配实例变量来实例化Fish对象数据库即:

public Fish(String species, int size){
       this.species = species;
       this.size = size;
}
public Fish(DatabaseHelper db, int tripID, int fishID){
       //getFish() is a query inside the DatabaseHelper class
       //that returns the row for one fish from one Fishing Trip
       Cursor c = db.getFish(tripID,fishID);           
       this.species = c.getString(0);
       this.size = Integer.parseInt(c.getString(1));

现在每条Fish都是钓鱼之旅,我应该用一系列方法设置FishingTrip类,然后让Fish延伸FishingTrip来强制执行这种关系吗?

使用我的DatabaseHelper类在android活动中实现数据库事务将完成工作,但我觉得以其他方式这样做是一种更好的方法,如果尝试开发更大的程序。

(注意:我将实现其他数据收集,例如坐标,以便我可以在Fish / FishingTrip对象之间执行分析,例如捕获之间的距离或捕获之间的时间等。)

长话短说 - 这是构建这个项目的正确框架吗?

感谢。

1 个答案:

答案 0 :(得分:2)

在我看来,Fish和DatabaseHelper类应该是分离的。 Fish类是模型的一部分,而DatabaseHelper类负责数据库访问。因此,对DatabaseHelper类的更改不应对Fish产生任何影响。相反,应该有一个层将数据从DatabaseHelper传输到Fish。

所以,而不是:

DatabaseHelper db = ...;
int tripID = ...;
int fishID = ...;
Fish fish = new Fish(db, tripID, fishID);
你会得到:

DatabaseHelper db = ...;
int tripID = ...;
int fishID = ...;
Cursor c = db.getFish(tripID, fishID);           
String species = c.getString(0);
int size = Integer.parseInt(c.getString(1));
Fish fish = new Fish(species, size);

通过这样做,两个类都不会相互了解,并且对任一类的更改只会影响中间的映射层。