質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

意見交換

4回答

1386閲覧

ソースコードのディレクトリ構造の基本的な考え方について教えてください

tyubo

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

3クリップ

投稿2024/04/16 12:51

知りたいこと

まだプログラミング初心者で、簡単なアプリケーションを自作してプログラミングを楽しんでいます。

一つのソースコードに複数の機能を作りたくなった場合や、追加で機能を増やす場合、どのようなディレクトリ構造にしていけば分かりやすく、また拡張性が高いのか、ベースとなる考え方や自分の間違っている点など経験豊富な先輩方にご指摘頂きたいです。

具体例

例えば、webページから情報をスクレイピングしてtxtファイルに保存し、必要な情報を抜き出しcsv形式で保存して、csvの情報をもとにグラフにプロットするという3つの機能のアプリを開発するとして、どのようなディレクトリ構造にするのがベターなのでしょうか。

今、自分は下記のようなディレクトリ構造をとっているのですが、main.pyが複数ある状況や、自分の中では「scraping」「extract_data」「plot」と3つのアプリを開発しているような感覚がありつつ、extract_dataのmain.pyがscrapingのweb_data.txtのパスを参照している部分などが少し気持ちが悪く感じています。

また、今回の設定のような状況で、別のデータをスクレイピングしたいとき(スクレイプするサイトが違うのでscrapingでは別のコードを書きたいが、extract_dataやplotは共有して使いたいとき)、はどのようにフォルダを追加すれば良いのでしょうか。

よろしくお願いいたします

<上記例の現在のディレクトリ構造>

  • src
    • scraping
      • data
        • web_data.txt
      • modules
        • module_A.py
        • module_B.py
      • main.py
    • extract_data
      • csv
        • data.csv
      • modules
        • module_A.py
        • module_B.py
      • main.py
    • plot
      • modules
        • module_A.py
        • module_B.py
      • main.py
  • .gitignore
  • .env

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答4

#1

TakaiY

総合スコア12774

投稿2024/04/16 13:53

編集2024/04/17 00:52

こういうのって、何が正解ということは無いものなので、一意見として。

extract_dataやplotは共有して使いたい

それこそがモジュールという考え方で、質問の構成はそういうことになっていると思いますが、いくつか気になるところがあります。

  • scrapingやextract_dataをモジュールとすると、生成物である csv や text のディレクトリを含んでいる
    モジュールにそういうものは含まないのが一般的です。データはモジュールではなく、それを利用するアプリケーションのものなので、 データの保存場所はアプリケーション側が用意して、オブジェクト指向にするのであればインスタンス化のパラメータとして、そうでなければなんらかの設定として与えることが多いと思います。
    この部分を分離すれば、モジュールとしてアプリケーションから独立させることができるので、アプリケーションの外に置く=モジュール化することができるでしょう。

  • modulesというディレクトリ
    こういう一般的な名前のディレクトリは不要なはずです。こうなるのはデータがモジュールに含まれているからでしょう。

  • main.pyという名前のファイル
    特に役割の無いファイルというものは無いはずなので、こういう名前にする必要はないはずです。利用する側に便利な機能を提供するためということであれば、__init.py__の出番かもしれません。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

tyubo

総合スコア8

投稿2024/04/20 09:47

TakaiYさん

迅速かつ的確な回答ありがとうございます。

一つ一つのファイルをモジュールと捉えて、変に階層を持たせるのをやめようと思います。

自分のこれまでのイメージとしては、「(機能という意味での)アプリケーション」はディレクトリ単位で考えていて、なので「ディレクトリのmainとなるmain.py」「main.pyの可読性を高めるため切り出したmodules」「そのmain.pyによって生成されるtxtやcsv」のように考えて、整理しておりました。

しかしながら、その使い勝手の悪さも感じていたところなので、一度ご意見をもとに試行錯誤して改めてみたいと思います。

ちなみにになるのですが、頂いていたご意見の「アプリケーション」のスコープは、.pyのファイル1つくらいという認識で間違いないでしょうか。1つの.pyファイルが1つのアプリケーションと呼べる単位の機能を持っていて、それぞれのファイルにデータ構造をやり取りして最終的な生成物ができる、と言うようなイメージで今のところ解釈しています。

よろしくお願いいたします。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

TakaiY

総合スコア12774

投稿2024/04/20 14:12

「アプリケーション」のスコープは、.pyのファイル1つくらいという認識で間違いないでしょうか。1つの.pyファイルが1つのアプリケーションと呼べる単位の機能を持っていて、それぞれのファイルにデータ構造をやり取りして最終的な生成物ができる、と言うようなイメージで今のところ解釈しています。

それはアプリケーションの規模によります。
小さなアプリケーションであれば、外部モジュール以外は1つのファイルということもあるでしょうが、ある程度大きく複雑なアプリケーションであれば、複数のファイルに分割するのが普通でしょうし、そうしたほうが管理が楽です。
ということは、大抵のアプリケーションは、複数のモジュールでできているし、そのモジュールそのものも複数のファイルでできていることが多いでしょうね。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

tyubo

総合スコア8

投稿2024/04/21 06:57

TakaiYさん

ご返信ありがとうございます。
よく理解しましたありがとうございました。

差し当たって、以下のような階層で一回整理してみようと思います。
機能を持つ「.pyファイル」を、それぞれの「アプリケーション」を取りまとめるディレクトリに保管して管理してみようと思います。

  • project_root
    • app
      • scraping
        • module_A.py
        • module_B.py
      • extract
        • module_C.py
        • module_D.py
      • plot
        • module_E.py
        • module_F.py
    • data
      • csv
      • txt
    • .gitignore
    • .env

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問