ADT思想下,怎样处理一些数据问题

类应该只暴露和这个类的目的几乎完全一致的接口。但是这个类对象的数据可能需要检验 或 需要和别的东西交换数据。比如从数据库获得数据,写入数据库等操作。怎样才能在不破坏类抽象的情况下处理这些问题?
比如代码大全2.p138中描述的一个设计有缺陷的类:
[code="java"]class Emploryee {
public:
...
FullName GetName() const;
PhoneNumber GetWorkPhone() const;

bool IsZipCodeValid(Address address);
SqlQuery GetQueryToCreateNewEmployee();

private:
...
}[/code]

我现在能想到的方案:
定义一个基类(或虚基类),这个类定义些通用的操作,比如,取得数据库的连接,关闭数据库连接等;派生一个处理具体类型的类型的数据库类,该类的方法针对特定的类型操作,比如取得员工的方法public Employee getEmloyee()等操作;而Employee类则简单定义存取方法,因为大部分与数据库的操作由上面的派生类处理了。
这样的结构可以复用一下代码,Employee类和数据库操作的类的耦合度相对小点

类的接口尽量要简单,要让使用它的人明确知道它是干什么的,比如你给出的Employee类,经常的操作就应该是设置和获取员工信息,IsZipCodeValid方法明显脱离了这个累的目的,但是你又可能确实需要,如果只是自身使用,可以将其修饰为private,如果你需要在其他程序中复用,你可以另外命名一个类ZipCode,实现IsZipCodeValid方法,然后调用就可以了,这样代码逻辑性比较清晰;GetQueryToCreateNewEmployee从名字上就看出来是操作数据库了,这个层次有点低了,我们需要的是“做什么”而不是“怎么做”,这个方法包含了太多实现的细节了,同样,你可以修饰为private,或另外新建一个工具类。
类的接口要明确,最好能从类的名字就能猜测出里面有什么方法和属性,如果有些方法和属性是猜不出来的,那你就得思考一下其合理性了

[quote]我想把这个问题再次回到起点:在不暴露数据细节的前提下,怎么能做到数据交换,如数据库操作。[/quote]

save();
load();

这样的方法完全可以胜任.

你甚至可以先抽象出接口:
interface persistence
{
void save(Object o);
Object load(Object pk);
}

[quote]我想把这个问题再次回到起点:在不暴露数据细节的前提下,怎么能做到数据交换,如数据库操作。[/quote]

应该把数据管理的功能划到一个类中去,我的理由:类能保持简单性,不能太大;类的定义很明确,比如Employee就是关于员工的属性和操作,没必要还包括数据库的这些操作;还可以复用代码,比如把数据库操作的代码分离出来,以后其他的类可以复用

Employee这个类和数据操作的类现在就应该有两种关系,is-a关系和has-a关系,我认为has-a关系有点恰当,is-a关系有点牵强,虽然C++支持多重继承,但是应该尽量避免使用