返回了知道它将始终包含单个记录,以便与界面的其余部分一致?
-
12-11-2019 - |
题
我正在编写一点地址簿应用程序,并有一个关于数据源/后端的接口的设计困境。
我有以下抽象基类用于数据源类:
class DataSource
{
private:
public:
virtual std::auto_ptr<Contact> getContact(int id) = 0;
virtual ContactRecordSet getAllContacts() = 0;
virtual bool addContact(const Contact& c) = 0;
virtual bool updateContact(int id, const Contact& c) = 0;
virtual bool deleteContact(int id)=0;
virtual ~DataSource() {};
};
.
下面是我的记录结构,TMY记录集是这些对象的STL向量的typedef。
class Contact
{
public:
std::string firstName;
std::string lastName;
std::string phoneNumber;
std::string address;
std::string email;
};
typedef std::vector<Contact> ContactRecordSet;
.
我的问题涉及用于DataSource :: getContact()方法的返回值类型和DataSource :: getAllContacts()方法以及要快速添加的搜索方法,将基于查询获取记录。
dataSource :: getContact()将返回零或1个记录,因为我通过唯一ID查找。 DataSource :: GetAllContacts()将返回零个或多个联系人。 即将到来的搜索方法将返回零个或多个联系人。
现在,GetContact()方法正在将Auto_PTR返回到联系人,因为如果我确定他们永远不会超过一个,则返回Contactrecordset似乎是浪费的,它允许我返回null如果有返回null没有那个ID的记录。
对于getContact()将返回Contactrecordset,只需为界面保持一致?
我的一部分在返回单个对象的数据结构的想法中的摘要,但另一方面,它更加一致,并且检查是否找到了该ID的值似乎更符合该值的语义似乎更符合设计的整体抽象(检查返回的Recordset与选中为null auto_ptr)。
你们都觉得什么?
(注意 - 我知道我可能是一个简单的地址簿应用程序的过度工程,但我希望它很容易交换不同的后端(平面文件,SQL等......)提供实施公共界面。目标是练习良好的模块化设计和分离的关注。)
更新
我想我可以从相反的角度看,使多个记录方法返回Auto_ptrs到Contactrecordset ObjectC。那种方式a)这一致的是,你总是得到一个对象的指针,b)如果记录集是空的,则返回std :: vector的开销,只需返回空指针。
解决方案
我始终遵循返回定义对象的最小复杂物的设计原则。向量旨在保存物品列表,而它可能使语义对称它无疑是对另一个开发人员来说是非平坦的。
其他提示
返回非多个函数的多种类型的一致?
我认为你需要使用不同的“一致性”定义。