大きなファイルをC/C ++、Java、Pythonの別々のモジュールに分割する

| | | | | | | | | | |

このアプローチは失敗する運命にあり、通常は最初から書き直す必要があります。

したがって、このシナリオを解決するには、問題をいくつかのサブ問題に分割してから、1つずつ解決してみます。一。

これにより、タスクが簡単になるだけでなく、高から 抽象化を実現できます。レベルのプログラマーであり、コードの再利用も促進します。

GitHubやGitLab、またはその他のサイトからオープンソースプロジェクトをチェックアウトすると、大規模なプログラムがどのように機能するかがわかります。多くのサブモジュールに分散化されており、個々のモジュールが特定の重要な機能を実行します。プログラムとオープンソースコミュニティのさまざまなメンバーが集まって、そのようなファイルやリポジトリを提供または維持します。

大きな問題は、理論的にではなく、ソフトウェアを「壊す」方法です。

C / C ++などの一般的な言語で、このようなユニットのいくつかの異なるタイプが表示されます。 Pythonとamp;Java。

C / C ++

説明のために、

すべての基本的なリンクリストの挿入が1つのプログラムにあると仮定しましょう。多くのメソッド(関数)があるため、必要なメイン関数の上にすべてのメソッド定義を記述してプログラムを乱雑にすることはできません。ただし、たとえそうだとしても、メソッドの順序付け、あるメソッドを別のメソッドの前に配置する必要がある場合などの問題が発生する可能性があります。

したがって、この問題を解決するために、すべてのプロトタイプを最初に宣言できます。プログラム、次にメインメソッドとその下で特定の順序で定義できます:

プログラム:

FullLinkedList.c


//完全なリンクリストを挿入します


#include< stdio.h>
#include< stdlib.h>


// ------------ -------------- ------
//アナウンス-START:
// ------ --------------------------


struct ノード;

struct ノード*create_node( int data);

void b_insert( struct ノード**ヘッド、 int data);

void n_insert( struct ノード**ヘッド、 int データ、 int pos);

void e_insert( struct ノード**ヘッド、 int data);

void display( struct ノード*temp);


// ------------ -------------- ------
//アナウンス-END:
// ------ --------------------------


int main()

{

struct ノード*head= NULL;


int ch、data、pos;


printf "リンクリスト: " );

while (1){

printf "1。最初に挿入" );

printf "2。挿入N番目の位置で" );

printf "3。挿入終了時" );

printf "4。表示" );

printf " 0.Exit " );

printf "選択内容を入力してください:" );

scanf "%d" 、& ch);


スイッチ(ch){

ケース 1:

printf "データ: " );

scanf "%d" 、& data);

b_insert(& head、data);

ブレーク;


ケース 2:

printf "データ: " );

scanf "%d" 、& data);


printf "位置を入力してください: " );

scanf "%d" 、& pos);

n_insert(& head、data、pos);

ブレーク;


ケース 3:

printf "データ: " );

scanf "%d" 、& data);

e_insert(& head、data);

ブレーク;


ケース 4:

display(head);

ブレーク;


ケース 0:

return 0;


デフォルト

printf "間違った選択" );

}

}

}


// ---------------- ---------- ------
//定義-START:
// ---- ----------------------------


struct ノード{

int <コードクラス="plain">データ;

struct ノード*next;

};


struct Node * create_node( int data)

{

struct ノード*temp

=( struct ノード*)

malloc sizeof struct ノード));

temp-&gt;データ=データ;

temp-&gt; next = NULL;


return temp;

}


void b_insert( struct ノード**ヘッド、 int data)

{

struct ノード*new_node= create_node(data);


new_node-&gt; next=*頭;

* head = new_node;

}


void n_insert( struct ノード**ヘッド、 int data、 int pos) < / p>

{

if (* head == NULL){

b_insert(head、data);

return ;

}


struct ノード*new_node= create_node(data);


struct ノード*temp= * head;


for int i = 0; i&lt; pos-2; ++ i)

temp = temp-&gt;次;


new_node-&gt; next = temp-&gt;次;

temp-&gt; next = new_node;

}


void e_insert( struct ノード**ヘッド、 int data)

{

if (* head == NULL){

b_insert(head、data);

return ;

}


struct ノード*temp= * head;


while (temp-&gt; next!= NULL)

temp = temp-&gt;次;


struct ノード*new_node= create_node(data);

temp-&gt; next = new_node;

}


void display( struct Node * temp)

{

printf "要素は次のとおりです:" );

while (temp!= NULL){

printf "%d" 、temp-&gt;データ);

temp = temp-&gt;次;

}

printf " " );

}


// ------ --------------------------
//定義-END
// --------------------- ----------- < / p>

コードのコンパイル:上記のプログラムをコンパイルできます:

 gcclinkedlist.c -olinkedlist 

そしてそれは動作します!

上記のコードの主な問題:
プログラムの主な問題はすでにわかっていますが、コードを個別に、またはグループで操作するのはそれほど簡単ではありません。

誰かが上記を操作したい場合プログラム、次に人が直面している多くの問題のいくつか:

  1. 完全なソースファイルを調べる必要があります。 一部の機能を改善または改善します。
  2. 他のプロジェクトの基礎としてプログラムを簡単に再利用することはできません
  3. コードは非常に雑然としているため、魅力的ではないため、コード内を移動するのは非常に困難です。
  4. グループプロジェクトまたは大規模なプログラムの場合、上記のアプローチにより、全体的なコスト、エネルギー、および故障率が増加することが保証されます。

    正しいアプローチ:

    これらの行は「#include」で始まるすべてのC/C++プログラムで始まることがわかります。
    これは「library」ヘッダー(。hファイル)で宣言され、おそらく library.c / cppファイルで定義されているすべての関数を含めます。

    これらの行はコンパイル時に前処理されます。

    独自の目的でこのようなライブラリを手動で作成することもできます。

    覚えておくべき重要事項:

    1. 「。h」ファイルには、プロトタイプ宣言(関数、構造体など)とグローバル変数のみが含まれます。
    2. 「。c/.cpp」ファイルには、実際の実装(ヘッダーファイルの宣言定義)が含まれています。
    3. すべてのソースファイルをコンパイルするときは、同じ関数の複数の定義を確認してください。同じプロジェクトに変数などは存在しません。 (非常に重要)
    4. 静的関数を使用して、宣言されているファイルに制限します。
    5. extern キーワードを使用して、外部ファイルによって参照される変数を使用します。
    6. C ++を使用する場合は、名前空間に注意し、衝突を避けるために常に namespace_name :: function()、を使用してください。
    7. プログラムを小さなコードに分割することにより:
      上記のプログラムを調べた後、この大きなプログラムを適切な小さな部分に分割する方法を確認できます。

      上記のプログラムには、基本的に2つの主な機能があります。
      1)ノードでのデータの作成、挿入、保存。
      2)ノードの表示


      このようにして、それに応じてプログラムを分割し、次のようにすることができます。
      1)メインファイルは&gt;プログラムドライバ、挿入モジュールのNice Wrapper、および追加ファイルを使用する場所。
      2)貼り付け-&gt;実際の実装はここにあります。

      上記の重要なポイントにより、プログラムは次のように分割されます。

      linkedlist.c -&gt;ドライバプログラムが含まれています
      insert.c -&gt;挿入用のコードが含まれています

      linkedlist.h -&gt;必要なノード宣言が含まれています
      insert.h -&gt;必要なノード挿入宣言が含まれています

      各ヘッダーファイルで、次のように開始します。

       #ifndef FILENAME_H#defineFILENAME_H宣言...#endif

      #ifndef、#define、#endif、の間に宣言を記述する理由は、1つの同じヘッダーファイルが呼び出されたときに、データ型や変数などの識別子の複数の宣言を防ぐためです。同じプロジェクトに属する新しいファイル内。

      このサンプルプログラムの場合:

      insert.h -&gt;挿入ノードの宣言とノード自体の宣言が含まれています。

      コンパイラはヘッダーファイル内の宣言を確認できることを覚えておくことが非常に重要ですが、コードを書き込もうとすると他の場所に宣言をインクルードすると、コンパイラがリンクステップに進む前に各.cファイルを個別にコンパイルするため、エラーが発生します。 、

      connectedlist.h -&gt; Nodeと、それらを使用するファイルに含める必要のあるDisplay宣言を含むヘルパーファイル。


      insert.c -&gt; #include "connectedlist.h"、を介してノード宣言を含めます。これには、宣言と、insert.hで宣言された他のすべてのメソッド定義が含まれます。

      connectedlist.c -&gt;単純なラッパー。必要な位置に整数データを挿入するようにユーザーに促す無限ループが含まれ、リストを表示するメソッドも含まれています。

      最後に覚えておくべきことは、意味がないということです。ファイルを相互に含めると、複数のオーバーライドが発生し、エラーが発生する可能性があります。

      上記を考慮して、適切なルーチンに慎重に分割する必要があります。

      linkedlist.h < / p>

      // connectedlist.h


      #ifndef LINKED_LIST_H
      #define LINKED_LIST_H


      struct ノード{

      int data;

      struct ノード*next;

      };


      void display( struct ノード*temp);


      #endif

      insert.h


      // insert.h


      #ifndef INSERT_H
      #define INSERT_H


      struct ノード;

      struct ノード*create_node( int data);

      void b_insert( struct ノード**ヘッド、 int data);

      void n_insert( struct ノード**ヘッド、 int データ、 int pos);

      void e_insert( struct ノード**ヘッド、 int data);


      #endif

      insert.c


      // insert.c


      #include "linkedlist.h"
      //&quot; &quot;したがって、プリプロセッサは
      //現在のディレクトリを検索し、
      //後で標準ライブラリファイルを検索します。


      #include&lt; stdlib.h&gt;


      struct Node * create_node( int data)

      {

      struct ノード*temp=( struct ノード*) malloc sizeof struct ノード));

      temp-&gt;データ=データ;

      temp-&gt; next = NULL;


      return temp;

      }


      void b_insert( struct ノード**ヘッド、 int data)

      {

      struct ノード*new_node= create_node(data);


      new_node-&gt; next=*頭;

      * head = new_node;

      }


      void n_insert( struct ノード**ヘッド、 int data、 int pos) < / p>

      {

      if (* head == NULL){

      b_insert(head、data);

      return ;

      }


      struct ノード*new_node= create_node(data);


      struct ノード*temp= * head;


      for int i = 0; i&lt; pos-2; ++ i)

      temp = temp-&gt;次;


      new_node-&gt; next = temp-&gt;次;

      temp-&gt; next = new_node;

      <

      Shop

      Learn programming in R: courses

      $

      Best Python online courses for 2022

      $

      Best laptop for Fortnite

      $

      Best laptop for Excel

      $

      Best laptop for Solidworks

      $

      Best laptop for Roblox

      $

      Best computer for crypto mining

      $

      Best laptop for Sims 4

      $

      Latest questions

      NUMPYNUMPY

      psycopg2: insert multiple rows with one query

      12 answers

      NUMPYNUMPY

      How to convert Nonetype to int or string?

      12 answers

      NUMPYNUMPY

      How to specify multiple return types using type-hints

      12 answers

      NUMPYNUMPY

      Javascript Error: IPython is not defined in JupyterLab

      12 answers


      Wiki

      Python OpenCV | cv2.putText () method

      numpy.arctan2 () in Python

      Python | os.path.realpath () method

      Python OpenCV | cv2.circle () method

      Python OpenCV cv2.cvtColor () method

      Python - Move item to the end of the list

      time.perf_counter () function in Python

      Check if one list is a subset of another in Python

      Python os.path.join () method