1

私は研究に使用する大規模なC++ライブラリのソロ開発者です(私は博士課程の学生です)。ライブラリにクールなアルゴリズムを実装するクラスがたくさんあるとしましょう:、、Algorithm1などAlgorithm2。次に、ライブラリを使用して最近追加された機能をテストするか、実行するスタンドアロンの「スクリプト」であるCスタイルの関数を作成します。プロットを生成するシミュレーション。これを、すばらしい(私は否定している)ジャーナルの出版物に含めます。ライブラリの設計は(私の知識と能力の限りでは)優れたソフトウェアエンジニアリングの原則に従いますが、ライブラリをリンクする「スクリプト」は、「main.cpp仕事を成し遂げる」以外の原則には従いません。

現在、1つのファイルに300を超えるそのような「スクリプト」があります(20,000行以上のコード)。私はそれで問題はありません、私は非常に生産的であり続けます、そしてそれは本当に究極の目標です。しかし、このアプローチには、私が一緒に暮らすことを学んだばかりの大きな弱点があるのではないかと思います。

// File: main.cpp

#include <cool_library/algorithm1.h>
#include <cool_library/algorithm2.h> 
...
#include <cool_library/algorithmn.h> 

void script1() {
    // do stuff that uses some of the cool library's algorithms and data structures
    // but none of the other scriptX() functions
}

void script2() {
    // do stuff that uses some of the included algorithms and data structures
}

... 

// Main function where I comment in the *one* script I want to run.
int main() {
    // script1();
    // script2();
    // script3();
    ...
    script271();

    return 0;               
}

編集1:このプロセスにはいくつかの目標があります。

  • 新しいスクリプト関数の開始にかかる時間を最小限に抑えます。
  • すべての古いスクリプト関数を指先で検索できるようにします。したがって、これらのスクリプトの一部をコピーして新しいスクリプトに貼り付けることができます。これは、他の人が使用するための優れた設計ではないことを忘れないでください。
  • スクリプトファイルのコンパイル時間は、20,000行のコードであるため、1秒未満でコンパイルされるため、気にしません。

ちなみに、私はEmacsを「IDE」として使用しています。Linuxでは、Autoconf / Automake/Libtoolプロセスを使用してライブラリとスクリプトを構築しています。

編集2:提案に基づいて、このシナリオで生産性を向上させる方法の一部は、コードを再構築することではなく、IDE(私の場合はEmacs)の機能をカスタマイズ/拡張することであるかどうか疑問に思い始めています。

4

4 に答える 4

3

私があなたなら、その巨大なファイルを300個の小さなファイルに分割します。それぞれに1つだけがあり、それだけscriptNN()main()呼び出します。

これで、コンパイルすると、300個の小さなscriptNN実行可能ファイルが作成されます(ただし、これに適したものを作成する必要がある場合がありMakefileます)。

これの良いところは、これらのスクリプト実行可能ファイルを、bash、python、perlなどの他のスクリプトによって配置または呼び出されるビルディングブロックとして使用できるようになったことです。

編集説明このデザインがどのようにあなたの目標に取り組むことができるか。

  • 新しいスクリプト関数を開始するときです。既存のファイルの1つをコピーして、少し調整するだけです。

  • すべての古いスクリプト関数を私の指先で検索できるようにします-emacsは、他のすべてのスクリプトファイルに対して複数ファイルの検索を実行できます。

  • スクリプトファイルのコンパイル時間は関係ありません。その場合は関係ありません。main()ただし、1つを編集して再コンパイルすることなく、すべてを一度に使用できるようになります。

于 2012-11-24T06:24:12.227 に答える
2

あなたの例は、スクリプト言語の良いユースケースかもしれません。具体的には、すべてのscript* C ++関数をLuaPythonOcamlGuileなどのインタープリターに接着し、テストケースをスクリプト言語で作成することができます。

すべてのスクリプト言語を使用すると、C(したがってC ++)関数を接着できます。Luaについては、LuaAPIの章を参照してください。Pythonについては、Pythonの拡張と埋め込みのセクションを参照してください。Ocamlについては、CとOCamlのインターフェースのセクションを参照してください。Guileについては、Cの章のプログラミングを参照してください。

関数内にインタープリターを埋め込むこともmain、既存のインタープリターを新しい関数で拡張することもできますC++(したがってmain、インタープリターが提供するものを使用します)。

スクリプト言語を使用すると、ライブラリとソフトウェアの設計とアーキテクチャに大きな影響を与える可能性があることに注意してください。

于 2012-11-24T06:19:45.790 に答える
1

あなたがそれに慣れていて、それがあなたのために働くなら、ただそれに固執してください。あなたはあなたが唯一の開発者であると言いました、そしてあなたがやりたいことは何でもしてください。私はいつも自分のプロジェクトのためにこのようなことを考えるのにあまりにも多くの時間を費やしています:P。重要で生産的なことに集中することを学びました。理論的なことは理論的にのみ機能します...

于 2012-11-24T06:19:03.833 に答える
1

提案されたすべての回答は適切であり、それらを組み合わせることもできます. 私の 5 セントを追加するだけです: あなたの実行フローは、戦略コマンドの設計パターンに正確に適合します。それらの利点を見たいと思うかもしれませんが、それは利益と投資の問題です。

于 2012-11-24T07:32:08.807 に答える