Qithub-BOT / Qithub-ORG

✅ Qithub サークルのメインリポジトリ。運用/ルール/全リポジトリの Issue など取りまとめています。
https://Qithub.tk/
Creative Commons Attribution Share Alike 4.0 International
10 stars 2 forks source link

【提案】インスタンスにトゥートする関数などをライブラリ化しませんか #133

Closed alice1017 closed 6 years ago

alice1017 commented 6 years ago

提案

QiiTime APIapi/v1/qiitime/index.phpに書かれている、マストドンインスタンスにトゥートするための関数 などをindex.phpからセパレートし、lib/phpディレクトリを作ってその中にtootlib.phpというような名前でライブラリ化して、それをindex.phpからincludeする、というのはどうでしょうか。

補足

ご意見おまちしてます!! :bowtie:

TL;DR(進捗・結論 2018/09/11 現在)


KEINOS commented 6 years ago

将来BOTやAPIが増えることを勘案すると、そのたびにindex.phpにトゥート関数を直書きするのはDRY的にどうなのかな @alice1017

そう!それ気になっていたんです。なんとかせんとコピペピピックでウェーイとワケワカメになりそうな臭いがしていたんです。

実は Qithub-BOT 本体用に Qithub-CORE という composer ライブラリを用意だけしているのですが、やはりシンプルな目的の単体 BOT の場合には、使いづらくて(考えることが多くて)実装を進めていません。

懸念事項

まず、ライブラリ化は大賛成です。長い目で見て「ライブラリ化は組織的にも経験的にも正義」だと思っているので。

ただ、「新参の人や特定プログラム言語初心者がソースを見る」という場合のことも議論しておきたいです。

つまり「参加するにはライブラリも把握しないといけないのか。。。」と ならないか、と。ライブラリが多くなると本人にとって YAGNI な関数も増えるためです。

ライブラリの共有化で横に横断せず、1ファイル(もしくは1ディレクトリ内)で完結していた方が機能を把握しやすいのかなという気もします。あと、ライブラリ共有による共倒れがないとか。

ただ、 @alice1017 さんがソースをみて再利用すべき点があるということは、現時点でライブラリ化した方が良いということであり、完結したソースコードにリファクタリングをかますよりは、ライブラリ化した方がリファクタリングもしやすいので、ライブラリ化する方向で意見を聞きたいです。

ライブラリのディレクトリ構成

将来的に使用言語が増えると勘案して、 lib/pythonlib/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
alice1017 commented 6 years ago

@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 も必要です。

KEINOS commented 6 years ago

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 的に他にトラブりそうなことはありますか?

素人目線で、上記の「機能別の場合」は、ディレクトリの探索が増える(対象ディレクトリが増える)ぶんパフォーマンスに問題が出そうな気がするのですが。

alice1017 commented 6 years ago

@KEINOS

__init__.pyのあるディレクトリにPython以外のファイルがあっても、Pythonは .py 拡張子のファイルしか認識しないので、特に問題はないですよ。

KEINOS commented 6 years ago

.py 拡張子のファイルしか認識しないので、特に問題はない

ということは、あとは使い勝手の違いかー。

機能別の場合

from lib.git import lib

言語別の場合

from lib.python import gitlib

上記であってます?だとしたら、言語別の記載の方が意味を把握しやすいなー。

alice1017 commented 6 years ago

あってますよ~ 👍

たしかに言語別の方が把握しやすいですね。

alice1017 commented 6 years ago

ちなみにPHPってどういう形で別ファイルをimportするんですか?

KEINOS commented 6 years ago

基本的には以下のように愚直にファイルごとに指定します。

機能別の場合

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();
KEINOS commented 6 years ago
include 'lib/git/lib.php';
include 'lib/php/gitlib.php';

PHP でも言語別の方が把握しやすいなーww ファイル名のつけ方もあるけど。

言語別にしますか!

alice1017 commented 6 years ago

言語別でいいんじゃないですかね! あとは @hidao80 さんの意見を待ちましょう!

KEINOS commented 6 years ago

@alice1017

言語別でいいんじゃないですかね!

👍

あとは @hidao80 さんの意見を待ちましょう!

Σd(-`ω´-〃) ラジャ

KEINOS commented 6 years ago

【進捗報告】 KEINOS-Explode-libary_20180911 のブランチでライブラリ化を始めました。

hidao80 commented 6 years ago

@KEINOS @alice1017

そうですね。言語別の方が良いと考えます。

理由

おそらく、実際にcloneして開発する方は、実装対象言語を一つに絞っていると予想しているためです。

この時、同一フォルダに別のプログラム言語ファイルが入っていない方が好ましいのではないかと考えます。 ex.) 対象言語のファイルだけ取り出す/削除する作業が減る

そのため、言語名ディレクトリで、同じツリー構造のものが言語別にあるイメージで良いのかな、と思います。

hidao80 commented 6 years ago

こんな感じ iPhone/iPad では tree が使えないつらみ

./
├── php
│   └── lib
│      ├── README.md
│      ├── gitlib.php
│      └── tootlib.php
├── python
│   └── lib
│       ├── README.md
│       ├── gitlib.py
│       └── tootlib.py
└── qiitime
    ├── README.md
    └── index.php
KEINOS commented 6 years ago

プログラム言語で集中させる方が確かに良いと思いましたが、そうなってしまうと以下のディレクトリ構造の違いもわかるのですが、うーん。

├── 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

確かにスコープを当てやすいしなぁ。いかん、変な悩みのループに入ってもうた。