3

定義済みの署名に従って、60 個の関数のセットを実装する必要があります。一部のクラスのメンバー関数ではなく、グローバル関数である必要があります。それらを実装するときは、サードパーティが提供する適切に作成された一連のクラスを使用します。

ほとんどの関数の私の実装は非常に短く、約 5 ~ 10 行であり、主にそのサードパーティ クラスへのさまざまなアクセスを処理します。いくつかのより複雑な関数については、すべての複雑なものを処理するいくつかの新しいクラスを作成し、それらを関数でも使用しています。すべての状態情報は、自分とサード パーティのクラスの静的メンバーに格納されるため、グローバル変数を作成する必要はありません。

質問: 60 個のメンバー関数を含む 1 つの大きなクラスを実装し、すべての実装 (現在はグローバル関数内) をそこで行う方がよいでしょうか? そして、私が書かなければならない各関数は、クラス内の対応するメンバー関数を呼び出すだけです。

4

4 に答える 4

4

すべての状態情報は、自分とサード パーティのクラスの静的メンバーに格納されるため、グローバル変数を作成する必要はありません。

それがキーポイントです。いいえ、クラスに入れるべきではありません。クラスは、オブジェクトの作成に使用するために作成されます。あなたの状況では、データと関数のスコープとしてのみ使用します。しかし、これは名前空間がすでによりよく解決するものです:

namespace stuff {
    ... 60 functions ...
    namespace baz {
        ... if you want, you can have nested namespaces, to ...
        ... categorize the functions ...
    }

    namespace data {
        ... you can put data into an extra namespace if you want ...
    }
}

純粋に静的メンバーのみで構成されるクラスを作成することは、悪い考えです。

于 2009-01-28T11:54:48.180 に答える
2

あなたのコードのユーザーは、この大きなクラスを本当に必要としていますか?

はいの場合は、それを実装します。

そうでない場合は、それを実装するために時間を無駄にしないでください。また、それをテストすることを義務付けられている他の人や、OOP の外観を超えたこのクラスの正確な役割を理解しようとする時間を無駄にしないでください。

于 2009-01-28T11:23:04.640 に答える
1

litbはおそらく正しいです。自由な関数の束をラップすることを検討する唯一の理由classは、ラッパーで使用するために独自のデータを添付する必要がある場合です。私の頭に浮かぶ唯一のことは、ログファイルへのハンドルまたはラッパーで同様のものが必要かどうかです。

関連して、誘惑と戦ってくださいusing namespace stuff;!常に名前空間修飾を使用して関数を参照してください。

#include <stuff.h>
void some_function() {
    stuff::function_wrapper();
}

それ以外の:

#include <stuff.h>
using namespace stuff;
void some_function() {
    function_wrapper();
}

利点は、をメソッドでnamespaceいっぱいのクラスに変換する必要がある場合でもstatic、簡単に実行できることです。

于 2009-01-28T14:38:27.227 に答える
0

「一階級一責任」のルールがここであなたを導くべきだと思います。60 の機能は、おそらくさまざまな責任に分割でき、それぞれの役割はクラスに値します。これにより、グローバル関数の必要性に制約されない API のクライアントにより多くの OO インターフェイスが提供されます。

于 2009-01-28T11:12:51.977 に答える