9

次の場合にどのアプローチを使用できますか。

  • 小規模な C++ プロジェクトで数人 (たとえば 1 ~ 3 人) の他のプログラマーと共同で作業し、単一のリポジトリを使用する
  • クラスを作成し、そのメソッドを宣言します
  • まだすべてのメソッドを実装する時間がありません
  • 他のプログラマーがあなたのコードをまだ使用したくない (まだ実装されていないため); または、コードのまだ実装されていない部分を使用したくない
  • そのようなまだ実装されていないものすべてについて同僚に話す時間/可能性がない
  • 同僚がまだ実装されていないコードを使用するときは、まだ使用すべきではないことをすぐに認識してもらいたい - エラーが発生した場合、何が悪いのか疑問に思ったり、潜在的なバグを検索したりしたくない.
4

7 に答える 7

14

最も簡単な答えは、彼らに伝えることです。大勢の人と仕事をするときはいつでも、コミュニケーションが重要です。

より堅牢な (そしておそらく最良の) オプションは、独自のブランチを作成して新しい機能を開発し、それが完成したときにのみマージすることです。

ただし、メソッドをメイン ソース ツリーに実装したいが、他のユーザーにメソッドを使用してほしくない場合は、例外またはアサーションを使用してメソッドをスタブ化します。

于 2010-07-22T23:29:39.920 に答える
10

私は実際に .Net の .Net のコンセプトが好きNotImplementedExceptionです。から派生し、 「実装されていない」としてstd::exceptionオーバーライドする独自の定義を簡単に定義できます。what

次の利点があります。

  1. 簡単に検索可能。
  2. 現在および依存するコードをコンパイルできるようにする
  3. コードが必要な時点まで実行できますが、その時点で失敗します (そして、必要性を示す実行パスがすぐに得られます)。
  4. 失敗すると、不確定な状態に依存するのではなく、例外を一様に飲み込んでいない限り、既知の状態に失敗します。
于 2010-07-23T00:09:31.850 に答える
8

コードをコミットしないか、開発ブランチにコミットして、ボックスの壊滅的な障害が発生した場合に少なくともマシンから離れているようにする必要があります。

これは、私が仕事で git リポジトリを使用して行っていることです。1 日の終わりに作業をリモート リポジトリ (マスター ブランチではない) にプッシュします。私の同僚は、これらの枝が非常に不安定であり、枝を折るのが本当に好きでない限り、10 フィートのポールに触れないことを認識しています。

Git は、安価な分岐を備えた他の DVC と同様に、この状況で非常に便利です。これを SVN またはさらに悪いことに CVS で行うことは、痛みと苦しみを意味します。

于 2010-07-22T23:34:14.400 に答える
7

リポジトリにチェックインしません。

于 2010-07-22T23:28:02.407 に答える
5

それを宣言します。実装しないでください。プログラマーがコードの未実装部分を呼び出すと、リンカーは文句を言います。これは、プログラマーにとって明らかな打撃です。

class myClass
{
    int i;
public:
    void print(); //NOt yet implemented
    void display()
    {
        cout<<"I am implemented"<<endl;
    }
};

int main()
{
    myClass var;
    var.display();
    var.print(); // **This line gives the linking error and hints user at early stage.**
    return 0;
}
于 2011-11-21T12:44:48.097 に答える
4

アサートが最善の方法です。プログラムを終了させないアサートはさらに優れているため、同僚は関数スタブによってブロックされることなくコードをテストし続けることができ、まだ実装されていないものについて完全な情報を得ることができます。

IDE がスマート アサートまたは永続的なブレークポイントをサポートしていない場合は、簡単な実装 (c++) を次に示します。

#ifdef _DEBUG
    // 0xCC - int 3 - breakpoint
    // 0x90 - nop? 
    #define DebugInt3 __emit__(0x90CC)
    #define DEBUG_ASSERT(expr) ((expr)? ((void)0): (DebugInt3) )
#else
    #define DebugInt3
    #define DEBUG_ASSERT(expr) assert(expr)
#endif

    //usage
    void doStuff()
    {
        //here the debugger will stop if the function is called 
        //and your coworker will read your message
        DEBUG_ASSERT(0); //TODO: will be implemented on the next week; 
                         //postcondition number 2 of the doStuff is not satisfied;
                         //proceed with care /Johny J.
    }

利点:

  1. コードのコンパイルと実行
  2. 開発者は、テスト中にコードに遭遇した場合にのみ、何が実装されていないかについてのメッセージを受け取るので、不必要な情報に圧倒されることはありません。
  3. メッセージは関連するコードを指しています(例外キャッチブロックなどではありません)。コール スタックが利用できるので、未完成のコードを呼び出した場所を追跡できます。
  4. メッセージを受け取った後、開発者はプログラムを再起動せずにテスト実行を続行できます

短所:

  1. メッセージを無効にするには、コード行をコメントアウトする必要があります。このような変更は、コミットに忍び込む可能性があります。

最初の DEBUG_ASSERT 実装の PS クレジットは同僚の EG に贈られます

于 2010-07-23T09:32:33.867 に答える
0

継承されたクラスに純粋仮想関数 (= 0;) を使用するか、より一般的には、それらを宣言するが定義しないことができます。定義なしで関数を呼び出すことはできません。

于 2010-07-22T23:27:13.433 に答える