2

我是 C++ 的初学者,作业要求我们记录我们的代码(序言,以及函数的前置条件)。我想知道它们如何适用于我的学生课程?

特别是,序言到底是什么意思?对于我的 get 方法,前置条件和后置条件是什么?我有一种感觉他们真的是为了更高级的功能(这些谁改变了数据的价值)?

class Student:
{
public:
    // Constructor for the student class, require 4 parameters
    // In the order of string (first name), string (last name), 
    // integer (student ID), string (major)
    Student(string myFirstName, string myLastName, int myID, string myMajor)
    {
        firstName = myFirstName;
        lastName = myLastName;
        uid = myID;
        major = myMajor;
    }

    // Get function for the student's first name
    // Return the student's first name
    string getFirstName()
    {
        return firstName;
    }
    .....

private:
    string firstName; // Student's first name
    string lastName; // Student's last name
    int uid; // Student's ID number in a number format
    string major; // Student's major
};
4

2 回答 2

8

序言是出现在记录其行为的函数之前的源代码注释,通常以像 doxygen 这样的工具可以自动从中创建有用文档的方式出现。

一个好的文档政策是记录所有不明显的东西和不明显的东西。在此基础上,我会说您的 getXXX() 没有值得记录的前置或后置条件。诸如“必须在正确构造的对象上调用”之类的内容只是浪费读者的时间,就像“调用者将收到学生特定 XXX 数据的副本”之类的后置条件一样。不要这样做!值是否可以合法地为空字符串的问题是构造函数的问题(或者甚至可能是类不变量 - 类保持为真,例如,如果值为空并且不提供函数清除值),而不是get函数文档。

同样,您对 firstName、lastName 和 major 的评论绝对没有任何价值,但您的评论uid确实增加了价值——记录了对字符串格式的要求!从那我可以告诉你犯了一个错误,因为该字段是一个int,并且有一些事情需要调查和纠正。但更一般地说,假设您有一个字符串类型 - 评论可能有用地传达对 id 格式的一些限制,说这些 id 与某些其他 API 或源相关,举个例子等。

更一般地说,前置条件不仅适用于 mutator(数据更改)函数。例如,一个函数day_for_date(int year, int month, int day)告诉您特定日期落在一周中的哪一天可能有一个先决条件,即年/月/日确实描述了一个有效的日期,即公元 1000 年到 3000 年之间的有效日期。这很讨厌,但这意味着如果您已经检查过某个函数调用不会浪费时间重新验证它。在防御性编程风格(恕我直言,倾向于使代码更健壮)中,您往往不会将其作为先决条件;相反,接受冗余验证作为净赢(尽管如果调用者需要性能,您可以提供明确的选项来禁用它),并在日期不符合预期时记录异常或错误结果。不同之处在于,前提条件是调用者必须保证函数按照记录的方式运行,

后置条件仅对 mutators 有意义:在调用非变异访问器之后可以断言的任何状态都必须事先为真 - 它可能是类不变量。

于 2012-04-12T04:28:31.660 回答
1

如果这是家庭作业,我强烈建议你在课堂上问这个问题,因为大多数老师都有一些在线社区不太可能知道的特殊要求(除非你告诉我们;-)。话虽如此,我们也许可以让您朝着正确的方向开始。

序言通常是对特定文件、类或函数作用的(简短)描述。

前置条件是对调用者传递的参数的要求,以及调用之前的程序状态。他们确定函数在什么条件下会产生正确的结果。例如,您可以要求示例类构造函数中的名字和姓氏不为空。

后置条件通常记录函数应用的副作用。例如,

class Person
{
public:
    std::string firstName () const;

    // post-condition: firstName() returns 'name'.
    void setFirstName (std::string name);
};

关于前置条件后置条件的维基百科文章提供了更详细的描述。

于 2012-04-12T04:22:52.180 回答