返回了知道它将始终包含单个记录,以便与界面的其余部分一致?

StackOverflow https://stackoverflow.com/questions/4980383

  •  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的开销,只需返回空指针。

有帮助吗?

解决方案

我始终遵循返回定义对象的最小复杂物的设计原则。向量旨在保存物品列表,而它可能使语义对称它无疑是对另一个开发人员来说是非平坦的。

其他提示

返回非多个函数的多种类型的一致?

我认为你需要使用不同的“一致性”定义。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top