0

それで、私はしばらくの間、このソフトウェアを C++ で書いてきました。GUIがあり、GUIはマスタークラスオブジェクトにアクセスできます。そのオブジェクトは、GUIによって作成されたタスクを担当します(ユーザーが何かをクリックすると、GUIはそのオブジェクトのメソッドを呼び出すだけです)。

さて、これが最善の方法かどうかはわかりません。私は人生でコーディング会社で働いたことはありませんが、いくつかの問題に遭遇しました。

実際、マスタークラスは何もしません。ほとんどの場合、そのクラス内にある他のオブジェクトのラッパーです。たとえば、次のようになります。

class Master {
public:
    void writeSomethingToFile(const char *filename,std::string& text);
...
}

フードの下:

class Master {
...
private:
    FileWriter *_writer;
}

void Master::writeSomethingToFile(const char *filename,std::string& text) {
    _writer->write(filename,text);
}

したがって、マスタークラスは書き込み自体を行うのではなく、仕事を行うライタークラスのタスクをスローするだけです。

マスタークラスにはライタークラスのようなオブジェクトがたくさんあるので、GUIに関する限り、マスタークラスはプログラムで必要なすべてのことができます。

ただし、マスター クラスのコードは、非常に多くのメソッドを持つこれらすべてのラッパー メソッドを含むため、扱いにくいものです。

これらの他のすべてのクラスを使用するため、クラスマスタークラスのヘッダーを変更するたびに、.cpp ファイルも再コンパイルする必要があります (i7 プロセッサにとってはそれほど悪くはありませんが、むしろ避けたいと思います)。

今私が使っているものは非常に原始的なものであり、決してこのように弁護するつもりはありません:

class Master {
public:
    // FILE CHANNEL
    void writeToFile(...);
    void deleteFile(...);
    // FILE CHANNEL

    // ARITHMETIC CHANNEL
    void addNumbers(...);
    void multiplyNumbers(...);
    // ARITHMETIC CHANNEL

    ...
}

文字通り、私が「チャネル」と呼んでいるものをコメントで区切って、何が何に属しているかを理解できるようにしました。さて、GUI の場合、すべてがグループ化されているため、これはそれほど悪くないかもしれません。しかし、このクラスをさらに開発して新しい内部クラスを追加し、より多くのメソッドをラップすると、扱いにくくなり、最も気になるのは、堅固ではありません。つまり、コメント付きの「チャネル」から 1 つのメソッドを取得して、別のメソッドに入れると、本当に違いがわかりますか?

私はいくつかの解決策を考えました。私はそれを試したことはありませんが、メンバースペースを作成するかもしれません:

class Master {
public:
    namespace file {
        void writeToFile(...);
        void deleteFile(...);
    }

    namespace arithmetic {
        void addNumbers(...);
        void multiplyNumbers(...);
    }

    ...
}

これは、クラスの開発者としての私の側の問題を解決しますが、GUIの場合、次のようなメソッドを呼び出す必要があります

master->arithmetic.addNumbers(...); // My syntax could be wrong here
// never used memberspace, corrections are appreciated

そして今、私のプロジェクトは現時点で「ちょっと」揺れているので、それは多くのコードを変更することを意味します。

私が考えたもう 1 つの解決策は、ファイル内のマスター クラスが 1 つのチャネルに焦点を当てている、クラスからクラスへの定数継承です。

class Master_fileChannel {
     FileHandler *_fileHandler;
     void writeToFile(...);
     void deleteFile(...);
}

...

class Master_arithmeticChannel : public Master_fileChannel {
     ArithmeticUnit *_arithmeticUnit;
     void addNumbers(...);
     void multiplyNumbers(...);
}

など、すべての「チャネル」を継承するまで。これは、元の状態よりも堅固であり、このクラスの現在の .cpp ファイルよりもはるかに短いファイルになります。しかし、重複したメソッド名を使用する可能性があり、メソッドにますます不格好な名前を付けなければならないという問題がまだあります (つまり、addNumbers(..); addThreadNumbers(..); addThreadNumbersSeparately(..);

それで、あなたは私にここで何をするように提案しますか? そのマスタークラスを無限に構築できますが、もっと良い方法があると確信しています. これらのことは、実際の適切なサイズのコードベースでどのように処理されますか? すべてのプロジェクトでコードをすばやくリファクタリングして、これらの大幅な変更を簡単に行うことができますか?

4

2 に答える 2

2

@Mat がコメントで親切に言及しているように、いわゆる「神オブジェクト」が付随していることに気づきました。これはプロジェクト内のすべてのものを管理し、コードの変更はこの「神」に影響を与えます。

ある程度の開発経験がある限り、いくつかのベスト プラクティスを読む価値があります。

于 2013-09-15T21:35:47.893 に答える