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 またはソースに関連していると伝えたり、例を挙げたりすることができます。

より一般的には、前提条件はミューテーター (データ変更) 関数だけのものではありません。たとえば、関数day_for_date(int year, int month, int day)特定の日付が何曜日に当たるかを示すには、年/月/日が実際に西暦 1000 年から 3000 年の間の有効な日付を表すという前提条件がある場合があります。それは厄介ですが、関数呼び出しが再検証に時間を無駄にしないことをどこかですでに確認している場合、それは意味します。防御的プログラミング スタイル (IMHO はより堅牢なコードを作成する傾向があります) では、それを前提条件にしない傾向があります。代わりに、冗長な検証を最終的な勝利として受け入れ (発信者がパフォーマンスを必要とする場合は、それを無効にする明示的なオプションを提供することもできます)、日付が期待に合わない場合は、例外またはエラーの結果を文書化します。違いは、前提条件は、関数が文書化されたとおりに動作するために呼び出し元が保証しなければならないものであるということです。

事後条件は、ミューテーターに対してのみ意味があります。非ミューテート アクセサーの呼び出し後の状態についてアサートできるものはすべて、事前に true である必要があります。これは、クラス不変条件である可能性があります。

于 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 に答える