2

我目前正在开发一个抽认卡应用程序,因为我不喜欢现有的,第二个原因是我想提高我的 java/android 技能。

在我的应用程序中,我尝试使用 OOP。我的卡片存储在 sqlite 数据库中。

现在我的问题:目前我的对象“卡”代表一个单一的闪存卡有它自己的数据库适配器,它可以用来更新它自己的状态,即它的点。

 Card card = new Card();
 card.setPoints(10); //<-- Also update its row in the database

还是做这样的事情更好:

 DBAdapter dbAdapter = new DBAdapter();
 Card card = new Card();
 dbAdapter.setPoints(Card);//<-- Updates Card and Database!

你觉得什么比较好?

提前谢谢!

4

4 回答 4

4

您在第二个示例中所做的事情是不可取的,因为您正在创建副作用。更新数据库也是更新卡,这是错误的。更新数据库应该做一件事,那就是更新数据库。

我更喜欢第一种方法,因为卡知道如何更新自己,但你也在更新数据库时犯了同样的错误。让数据库知道如何更新自己,让卡知道如何更新自己。我认为它实现了关注点的清晰分离。

例如:

card.setPoints(points)//update card and only card
dbAdapter.setPoints(card) //update the database and nothing else.
于 2012-09-23T08:54:23.830 回答
3

绝对是第一个。设置点的类应该不知道如何设置(或存储)点。这是一种“责任分离”。

想象一下,如果您决定从数据库更改为 ACME Dilithium Crystal Accumulator(TM)。选项 1 和选项 2 需要更改多少代码?

于 2012-09-23T08:50:52.540 回答
1

我想两者都不是。

 dbAdapter.update(card.getId(),card.getPoint());

语法应该是

  public boolean update(int id, int value)

您的 DbAdapter 应该只具有存储或检索、删除数据的方法,它们不应特定于卡功能。

在上面的示例中card.getId() 返回URI关联,Card然后它只更新整数值,因此您的代码具有职责分离和隔离。

于 2012-09-23T09:08:35.717 回答
0

如果上面提到的两个代码片段都有效,我更喜欢第一个而不是第二个,因为代码看起来更易读、更直观并且更短!

我希望这有帮助。

于 2012-09-23T08:52:09.963 回答