Closed alice1017 closed 6 years ago
将来BOTやAPIが増えることを勘案すると、そのたびにindex.phpにトゥート関数を直書きするのはDRY的にどうなのかな @alice1017
そう!それ気になっていたんです。なんとかせんとコピペピピックでウェーイとワケワカメになりそうな臭いがしていたんです。
実は Qithub-BOT 本体用に Qithub-CORE という composer ライブラリを用意だけしているのですが、やはりシンプルな目的の単体 BOT の場合には、使いづらくて(考えることが多くて)実装を進めていません。
まず、ライブラリ化は大賛成です。長い目で見て「ライブラリ化は組織的にも経験的にも正義」だと思っているので。
ただ、「新参の人や特定プログラム言語初心者がソースを見る」という場合のことも議論しておきたいです。
つまり「参加するにはライブラリも把握しないといけないのか。。。」と ならないか、と。ライブラリが多くなると本人にとって YAGNI な関数も増えるためです。
ライブラリの共有化で横に横断せず、1ファイル(もしくは1ディレクトリ内)で完結していた方が機能を把握しやすいのかなという気もします。あと、ライブラリ共有による共倒れがないとか。
ただ、 @alice1017 さんがソースをみて再利用すべき点があるということは、現時点でライブラリ化した方が良いということであり、完結したソースコードにリファクタリングをかますよりは、ライブラリ化した方がリファクタリングもしやすいので、ライブラリ化する方向で意見を聞きたいです。
将来的に使用言語が増えると勘案して、
lib/python
やlib/ruby
など言語ごとに細分化できたらいい
おお、いいですね!脱ペチャパーの匂いがしますな。
ブレストですが、lib/
の下はライブラリの目的ごとに分けて、その下に言語を設置というのはどうですか?
というのも、同じ機能を別言語で実装することも練習としてしたいのですが、どんな機能が他の言語で実装しているのかが把握しづらいな、と思って。
どちらが利用しやすい&他の言語の人に伝わりやすいですかね?
./
├── lib
│ ├── git
│ │ ├── README.md ←ライブラリの要件
│ │ ├── lib.php ←同じ機能でPHP
│ │ └── lib.py ←同じ機能でPython
│ └── toot
│ ├── README.md
│ ├── lib.php
│ └── lib.py
└── qiitime
├── README.md
└── index.php
./
├── lib
│ ├── php
│ │ ├── README.md ← ライブラリが増えると追記が必要
│ │ ├── gitlib.php
│ │ └── tootlib.php
│ └── python
│ ├── README.md
│ ├── gitlib.py
│ └── tootlib.py ← PHPの tootlib と同じ要件か把握しづらい
└── qiitime
├── README.md
└── index.php
@KEINOS お疲れ様です!
懸念事項については @hidao80 さんの意見も聞きたいので一旦保留にさせて下さい。
ディレクトリ構造の件なのですが、Pythonのimportの仕組みとして、importするライブラリのディレクトリには必ず __init__.py
というファイルを置く 必要があるのです。
$ ls lib/git
README.md lib.php lib.py
$ python
>>> from lib.git import lib
ImportError: No Module named lib.git
>>> # importできない
$ echo "" > lib/git/__init__.py
$ ls lib/git
__init__.py README.md lib.php lib.py
$ python
>>> from lib.git import lib
>>> # importできる
なので機能別にわけると、 lib/git/lib.py
が本来のスクリプトなのに、 lib/git/__init__.py
という別のPythonファイルが存在することになるんですね。
言語ごとにわけた理由は、これが混乱の原因にならないかなーと懸念してのことだったんです。
Pythonが lib/git/lib.py
をimportするためには、lib/git/__init__.py
のほかに、 lib/__init__.py
も必要です。
Pythonのimportの仕組みとして、importするライブラリのディレクトリには必ず init.py というファイルを置く 必要がある
あー、Python ってファイル単位でなく最初からダイナミックにインポートすることが前提なんですね! 写経していて、説明なく「こう書け」というものが多く「なんでこの記述でインポートできるんだろ?」と思っていました。すごく納得〜
言語ごとにわけた理由は、これが混乱の原因にならないかなーと懸念してのことだったん
なるほど〜。以下のようになるという認識でいいですか?
./
├── lib
│ ├── __init__.py ←これは必須
│ ├── git
│ │ ├── __init__.py ← 機能ごとに設置が必要
│ │ ├── README.md
│ │ ├── lib.php
│ │ └── lib.py
│ └── toot
│ ├── __init__.py ← 機能ごとに設置が必要
│ ├── README.md
│ ├── lib.php
│ └── lib.py
└── qiitime
├── README.md
└── index.php
./
├── lib
│ ├── __init__.py ←これは必須
│ ├── php
│ │ ├── README.md
│ │ ├── gitlib.php
│ │ └── tootlib.php
│ └── python
│ ├── __init__.py ← 1つでOK
│ ├── README.md
│ ├── gitlib.py
│ └── tootlib.py
└── qiitime
├── README.md
└── index.php
確かに __init__.py
の設置が増えますねぇ。
ライブラリのパスが通った(__init__.py
のある)ディレクトリに Python 以外のファイルがあった場合に、Python 的に他にトラブりそうなことはありますか?
素人目線で、上記の「機能別の場合」は、ディレクトリの探索が増える(対象ディレクトリが増える)ぶんパフォーマンスに問題が出そうな気がするのですが。
@KEINOS
__init__.py
のあるディレクトリにPython以外のファイルがあっても、Pythonは .py
拡張子のファイルしか認識しないので、特に問題はないですよ。
.py
拡張子のファイルしか認識しないので、特に問題はない
ということは、あとは使い勝手の違いかー。
from lib.git import lib
from lib.python import gitlib
上記であってます?だとしたら、言語別の記載の方が意味を把握しやすいなー。
あってますよ~ 👍
たしかに言語別の方が把握しやすいですね。
ちなみにPHPってどういう形で別ファイルをimportするんですか?
基本的には以下のように愚直にファイルごとに指定します。
include 'lib/git/lib.php';
include 'lib/php/gitlib.php';
__init__.py
みたいなイメージでダイナミックに呼ぶには、オートローダー(autoload.php
)を設置して名前空間で利用する方法があります。
ただ名前空間をきちんとルール決めしないといけなく、慣れないとかえって取っ散らかるので、私もまだ使いこなせていません。
require_once "vendor/autoload.php";
namespace lib\git; //Autoload で定義したディレクトリ下にある同じ名前空間のファイルを利用
$git = new hogehoge();
require_once "vendor/autoload.php";
namespace lib\php; //Autoload で定義したディレクトリ下にある同じ名前空間のファイルを利用
$git = new hogehoge();
include 'lib/git/lib.php';
include 'lib/php/gitlib.php';
PHP でも言語別の方が把握しやすいなーww ファイル名のつけ方もあるけど。
言語別にしますか!
言語別でいいんじゃないですかね! あとは @hidao80 さんの意見を待ちましょう!
@alice1017
言語別でいいんじゃないですかね!
👍
あとは @hidao80 さんの意見を待ちましょう!
Σd(-`ω´-〃) ラジャ
【進捗報告】 KEINOS-Explode-libary_20180911 のブランチでライブラリ化を始めました。
@KEINOS @alice1017
そうですね。言語別の方が良いと考えます。
おそらく、実際にcloneして開発する方は、実装対象言語を一つに絞っていると予想しているためです。
この時、同一フォルダに別のプログラム言語ファイルが入っていない方が好ましいのではないかと考えます。 ex.) 対象言語のファイルだけ取り出す/削除する作業が減る
そのため、言語名ディレクトリで、同じツリー構造のものが言語別にあるイメージで良いのかな、と思います。
こんな感じ iPhone/iPad では tree が使えないつらみ
./
├── php
│ └── lib
│ ├── README.md
│ ├── gitlib.php
│ └── tootlib.php
├── python
│ └── lib
│ ├── README.md
│ ├── gitlib.py
│ └── tootlib.py
└── qiitime
├── README.md
└── index.php
プログラム言語で集中させる方が確かに良いと思いましたが、そうなってしまうと以下のディレクトリ構造の違いもわかるのですが、うーん。
├── python
│ └── lib
├── lib
│ └── python
「同一フォルダに別のプログラム言語ファイルが入っていない方が好ましい」という意味では以下のようなディレクトリ構成が、よりわかりやすい反面、「サービスありきのプログラム言語不問」と「プログラム言語不問でサービス提供」の違いに葛藤してしまいます。
.
├── php
│ ├── lib
│ │ ├── README.md
│ │ └── tootlib.php
│ └── qiitime
│ ├── README.md
│ └── index.php
└── python
├── lib
│ ├── README.md
│ └── gitlib.py
└── update-spams
├── README.md
└── update.py
確かにスコープを当てやすいしなぁ。いかん、変な悩みのループに入ってもうた。
提案
QiiTime APIの
api/v1/qiitime/index.php
に書かれている、マストドンインスタンスにトゥートするための関数 などをindex.php
からセパレートし、lib/php
ディレクトリを作ってその中にtootlib.php
というような名前でライブラリ化して、それをindex.php
からincludeする、というのはどうでしょうか。補足
将来BOTやAPIが増えることを勘案すると、そのたびに
index.php
にトゥート関数を直書きするのはDRY的にどうなのかなと思いました。ディレクトリが
lib/php
なのは、将来的に使用言語が増えると勘案して、lib/python
やlib/ruby
など言語ごとに細分化できたらいいと思ったからですご意見おまちしてます!! :bowtie:
TL;DR(進捗・結論 2018/09/11 現在)