什么是C ++前导码,以及get函数的pre-post条件

时间:2012-04-12 04:10:08

标签: c++

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

特别是 前言 究竟是什么意思?对于我的获取方法,前后条件是什么?我觉得他们真的是为了更高级的功能(这些人改变了数据的价值)?

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
};

2 个答案:

答案 0 :(得分:7)

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

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

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

更一般地说,前提条件不仅适用于mutator(数据更改)功能。例如,一个函数day_for_date(int year, int month, int day)可以告诉您某个特定日期的星期几可能有一个前提条件,即年/月/日确实描述的是说明在公元1000到3000之间的有效日期。这是令人讨厌的,但这意味着如果你已经检查过某个函数调用并没有浪费时间重新验证它。在防御性编程风格(IMHO倾向于为更强大的代码制作)中,你倾向于不把它作为前提条件;相反,接受冗余验证作为净赢(尽管如果调用者需要性能,您可以提供显式选项来禁用它),并在日期不符合预期时记录异常或错误结果。不同之处在于,前提条件是调用者必须保证函数按照文档记录操作,在防御性编程中,您通常会让调用者尝试某些内容并具有已定义/记录的可管理行为 - 状态,返回值或状态的更改以可预测的方式报告错误 - 对于广泛的先前状态和输入而言是实际的。

后置条件只对变更器有意义:在调用非变异访问器之后必须事先确定的任何关于状态的断言 - 它可能是类不变的。

答案 1 :(得分:1)

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

前言通常是特定文件,类或函数所做的(简短)描述。

前提条件是调用者传递的参数的要求,以及调用之前的程序状态。他们在什么条件下建立功能将产生正确的结果。例如,您可以请求示例类构造函数中的名字和姓氏都是非空的。

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

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

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

pre-conditionspost-conditions上的维基百科文章提供了更详细的说明。